如何解决Android Listview 从 String 单击加载图像
我有一个项目列表,点击列表后,新活动将打开并显示详细信息。 问题是我无法实现 - 单击详细活动中的特定字符串后加载图像。 例如,在 MainActivity 中,有:
String one[] = {"dog","cat","horse","snail"};
String two[] = {"aaa","bbb","ccc","ddd"};
String three[] = {"111","**222**","333","**222**"};
打开应用程序,单击第二个列表项(猫)并打开带有详细信息的新活动(猫的所有字符串) 在这种情况下,我需要在点击“字符串三”后 - 如果字符串是 222,打开图像(drawable/222.jpg),在这种情况下是“猫”和“蜗牛”。 然后点击“333”显示图片333.jpg ...
如果可以,最好用后退按钮打开图片,返回详细活动。
简化的 MainActivity:
String one[] = {"dog","222","222"};
List<ItemsModel> itemsModelList = new ArrayList<>();
ListView listView;
CustomAdapter customAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listview);
for(int i = 0;i < one.length;i++){
ItemsModel itemsModel = new ItemsModel(one[i],two[i],three[i]);
itemsModelList.add(itemsModel);
}
customAdapter = new CustomAdapter(itemsModelList,this);
listView.setAdapter(customAdapter);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
if(id == R.id.searchView){
return true;
}
return super.onOptionsItemSelected(item);
}
public class CustomAdapter extends BaseAdapter implements Filterable {
private List<ItemsModel> itemsModelsl;
private List<ItemsModel> itemsModelListFiltered;
private Context context;
public CustomAdapter(List<ItemsModel> itemsModelsl,Context context) {
this.itemsModelsl = itemsModelsl;
this.itemsModelListFiltered = itemsModelsl;
this.context = context;
}
@Override
public int getCount() {
return itemsModelListFiltered.size();
}
@Override
public Object getItem(int position) {
return itemsModelListFiltered.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position,View convertView,ViewGroup parent) {
View view = getLayoutInflater().inflate(R.layout.row_items,null);
TextView one = view.findViewById(R.id.one);
TextView two = view.findViewById(R.id.two);
one.setText(itemsModelListFiltered.get(position).getone());
two.setText(itemsModelListFiltered.get(position).gettwo());
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("main activity","item clicked");
startActivity(new Intent(MainActivity.this,ItemsActivity.class).putExtra("items",itemsModelListFiltered.get(position)));
}
});
return view;
}
//// 项目模型:
public class ItemsModel implements Serializable {
private String one;
private String two;
private String three;
public ItemsModel(String one,String two,String three) {
this.one = one;
this.two = two;
this.three = three;
}
public String getone() {
return one;
}
public void setone(String one) {
this.one = one;
}
public String gettwo() {return two; }
public void settwo(String two) { this.two = two; }
public String getthree() {return three; }
public void setthree(String three) { this.three = three; }
///
如果你需要 Itemactivity
或 activity.xml 我会复制。
解决方法
对于 res/drawable
文件夹中的文件,文件名不能以数字开头,例如 111.jpg
、222.jpg
等。为此,您可以添加前缀以 image_111.jpg
、image_222.jpg
等字母开头。
解决方案
在 ItemsActivity
中,使用 getIdentifier(String,String,String) 通过资源名称 (R.drawable.image_222
) 获取资源 ID (image_222
)。
public class ItemActivity extends AppCompatActivity {
TextView textView;
TextView textView2;
TextView textView3;
ItemsModel itemsModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
textView2 = findViewById(R.id.textView2);
textView3 = findViewById(R.id.textView3);
Intent intent = getIntent();
if (intent.getExtras() != null) {
itemsModel = (ItemsModel) intent.getSerializableExtra("items");
textView2.setText(itemsModel.getone());
textView.setText(itemsModel.gettwo());
textView3.setText(itemsModel.getthree());
textView3.setClickable(true);
textView3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Get drawable name
String drawableName = "image_" + itemsModel.getthree();
// Find drawable resource id by drawable name
int drawableResId = getResources().getIdentifier(
drawableName,"drawable",getPackageName());
showImageDetail(drawableResId);
}
});
}
}
private void showImageDetail(int imageResId) {
// Using a dialog or activity to open image detail.
AlertDialog.Builder builder = new AlertDialog.Builder(this);
ImageView imageView = new ImageView(this);
imageView.setImageResource(imageResId);
builder.setView(imageView);
builder.create().show();
}
}
更新
第一个问题是识别“222”,例如字符串three[] 是“xxx & 222”,所以我需要识别孔串内的“222”。一些更大的字符串将同时包含 222 和 333,我可以同时单击它们吗?一个将显示图像_222 其他图像_333。
这有点复杂。例如,three
值可能是
333 yyy 444 xxx & 222
在这种情况下,您必须遍历字符串并找到图像编号,例如 333、444、222,并计算其开始和结束索引,然后使用 SpannableStringBuilder.setSpan() 方法在每个图像编号上设置点击侦听器.
在下面的代码中,我将使用
-
Java Regex 查找
three
值中的所有图像编号。 -
SpannableStringBuilder.setSpan() 方法在图像编号上设置点击侦听器。
代码
public class ItemsActivity extends AppCompatActivity {
TextView textView;
TextView textView2;
TextView textView3;
ItemsModel itemsModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_items);
textView = findViewById(R.id.textView);
textView2 = findViewById(R.id.textView2);
textView3 = findViewById(R.id.textView3);
Intent intent = getIntent();
if (intent.getExtras() != null) {
itemsModel = (ItemsModel) intent.getSerializableExtra("items");
textView.setText(itemsModel.getone());
textView2.setText(itemsModel.gettwo());
String three = itemsModel.getthree();
SpannableStringBuilder builder = new SpannableStringBuilder(three);
String regex = three;
Pattern pattern = Pattern.compile("(\\d{3})");
Matcher matcher = pattern.matcher(regex);
while (matcher.find()) {
String imageNumber = matcher.group(0);
int numberStartIndex = three.indexOf(imageNumber);
int numberEndIndex = numberStartIndex + imageNumber.length();
builder.setSpan(new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
showImageDetailByImageNumber(imageNumber);
}
},numberStartIndex,numberEndIndex,SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE);
regex = three.substring(numberEndIndex);
matcher = pattern.matcher(regex);
}
textView3.setMovementMethod(LinkMovementMethod.getInstance());
textView3.setText(builder);
}
}
/**
* Find the image drawable (image_222.jpg) based on its number name (222)
* @param imageNumber The image number like 111,222,333.
*/
private void showImageDetailByImageNumber(String imageNumber) {
// Get drawable name
String drawableName = "image_" + imageNumber;
// Find drawable resource id by drawable name
int drawableResId = getResources().getIdentifier(
drawableName,getPackageName());
// Using a dialog or activity to open image detail.
AlertDialog.Builder builder = new AlertDialog.Builder(this);
ImageView imageView = new ImageView(this);
imageView.setImageResource(drawableResId);
builder.setView(imageView);
builder.create().show();
}
}
第二个问题是,drawable 文件夹内的图像名称必须包含小写字母和数字。我需要大写字母字符串(例如 A222)
在Android中,drawable里面的文件名必须以小写字母开头,所以我认为你只对那个文件夹中的图片使用前缀,例如image_
、img_
或任何适合的前缀您的要求。
好的,我只是做了一个视觉化的,应该是这样的。
此时,第一个和第二个活动运行正常,但仅此而已。现在我需要在第二个活动的代码部分中实现,就像我给出的图像一样。 当点击“222”(在第二个活动中)它应该打开 drawable/image_222.jpg 当点击“333”(在第二个活动中)它应该打开 drawable/image_333.jpg 字符串 222 将出现在几个地方,例如我给 Cat 和蜗牛。 所以如果我理解它应该是这样的:如果“三是”“222”点击显示“drawable image_222.jpg”(我知道这看起来很糟糕,我只是简化了它)
Down 是短的 ItemActivity:
TextView textView;
TextView textView2;
TextView textView3;
ItemsModel itemsModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_items_preview);
textView = findViewById(R.id.textView);
textView2 = findViewById(R.id.textView2);
textView3 = findViewById(R.id.textView3);
Intent intent = getIntent();
if(intent.getExtras() != null){
itemsModel = (ItemsModel) intent.getSerializableExtra("items");
textView2.setText(itemsModel.getone());
textView.setText(itemsModel.gettwo());
textView3.setText(itemsModel.getthree());
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。