【问题标题】:Android Listview changes icon when scrolledAndroid Listview 滚动时更改图标
【发布时间】:2016-09-06 16:13:09
【问题描述】:

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

            }

        }
    });

【问题讨论】:

  • 也发布您的适配器代码
  • 我认为adapter getView() 中一定有一些错误。

标签: android listview scroll


【解决方案1】:

首先,这是一个有趣的问题。

图像正在被替换,因为当列表项视图退出屏幕时,它会被销毁,而每当它重新出现时,它就会重新创建。完全从头开始。列表视图的一个缺点。更好的方法是使用RecyclerView。它将使用 ViewHolder 为每一行创建对象,以后不再从头开始创建所有内容,而是引用已经创建的 ViewHolder 对象。

但是,用户对一行的选择在这里仍然需要我们自己来处理。我建议如下。

创建一个与列表视图长度相同的全局布尔数组。

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;
}

【讨论】:

  • 谢谢! @DarshanMiskin 还有一件事.. 如何在“getView()”方法中使用布尔数组?如何将其创建为全局变量,以便我可以在活动中输入值并在适配器中使用这些值??
  • 您的适配器和活动是否在不同的 java 文件中?如果是这样,请将适配器类移动到具有列表视图的活动的 java 文件中。如果没有,那么只需在活动的类级别声明布尔数组。
  • 并且不要忘记在它完成您的工作时接受答案。 :)
【解决方案2】:

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

List&lt;Integer&gt; itemsImageRes为例,其中itemsImageRes.get(i)将缓存listView元素的imageResId在i位置

您应该将此图像资源设置为适配器上的 imageView getView(int position, View convertView, ViewGroup parent)

好主意是使用Picasso 而不是imageView.setImageResource(R.drawable.drawableid);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多