我的Android应用上有ListView
。每行都有一个文本和一个图像。当用户单击一行时,行的图像会发生变化(这样可以正常工作)。问题是,当用户滚动ListView
时,当该行穿过ListView
的顶部时(当您停止看到该行时),图像会自动更改回默认值。我怎么能阻止这个?如果用户单击该行并且图像被更改,我需要将新图像保留在那里(因为新图像是用户已经单击该行的指示符)。
感谢您的帮助!
这是我的代码:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i;
ImageView imageView;
switch (position){
case 0:
imageView = (ImageView) view.findViewById(R.id.check_alimentacion);
if (frutas.equals("NO")){
imageView.setImageResource(R.drawable.checkbox);
frutas = "SI";
}else {
imageView.setImageResource(R.drawable.checkbox_inactivo);
frutas = "NO";
}
break;
case 1:
imageView = (ImageView) view.findViewById(R.id.check_alimentacion);
if (verdura.equals("NO")){
imageView.setImageResource(R.drawable.checkbox);
verdura = "SI";
}else {
imageView.setImageResource(R.drawable.checkbox_inactivo);
verdura = "NO";
}
break;
case 2:
imageView = (ImageView) view.findViewById(R.id.check_alimentacion);
if (carne.equals("NO")){
imageView.setImageResource(R.drawable.checkbox);
carne = "SI";
}else {
imageView.setImageResource(R.drawable.checkbox_inactivo);
carne = "NO";
}
break;
}
}
});
答案 0 :(得分:0)
listview中的视图被回收。 您应该将每个视图的状态存储在某种数组中;
例如在List<Integer> itemsImageRes
中,其中itemsImageRes.get(i)
将缓存位于i
的listView元素的imageResId
您应该在适配器getView(int position, View convertView, ViewGroup parent)
好主意是使用Picasso代替imageView.setImageResource(R.drawable.drawableid);
答案 1 :(得分:0)
首先,这是一个有趣的问题。
正在替换图像,因为当列表项视图退出屏幕时会被破坏,并且每当它再次出现时,它都会再次重新创建。完全从头开始。 listview的缺点。更好的方法是使用RecyclerView。它将使用ViewHolder为每一行创建对象,之后不是从头开始创建所有内容,而是引用已创建的ViewHolder对象。
但是,行的用户选择仍然需要由我们自己处理。我建议如下。
创建一个与listview相同长度的全局布尔数组。
boolean[] selected=new boolean[listViewLength];
现在,在onItemClickListener()
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//change value of boolean to true, to depict as selected
selected[position]=true; //default value of boolean is false.
//update the image
imageView = (ImageView) view.findViewById(R.id.check_alimentacion);
imageView.setImageResource(R.drawable.checkedDrawable);
}
});
最后在你的getView()
检查选择看起来像这样,
public View getView (int position, View convertView, ViewGroup parent){
//Initialize the item-view
LayoutInflater inflater=(LayoutInflater)getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE);
convertView=inflater.inflate(R.layout.listItemLayout,null,false);
imageView = (ImageView) view.findViewById(R.id.check_alimentacion);
if(selected[position]){
imageView.setImageResource(R.drawable.checkedDrawable);
}
else{
imageView.setImageResource(R.drawable.defaultDrawable);
}
return convertView;
}