滚动时,Android Listview会更改图标

时间:2016-09-06 16:13:10

标签: android listview scroll

我的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;

            }

        }
    });

2 个答案:

答案 0 :(得分:0)

listview中的视图被回收。 您应该将每个视图的状态存储在某种数组中;

例如在List<Integer> itemsImageRes中,其中itemsImageRes.get(i)将缓存位于i的listView元素的imageResId

您应该在适配器getView(int position, View convertView, ViewGroup parent)

上将此图像资源设置为imageView

好主意是使用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;
}