Android:列表滚动 ListView 项目背景问题

标签 android listview

我在滚动时遇到以下项目背景问题。

在我的应用程序中,我有一个需要多选的 ListView 。这也是一个自定义列表,其中需要通过更改列表项颜色而不是基于复选框的方法来表示选择。 为此:在 OnClick 中,我检查是否选择了位置,然后设置项目的背景。但是,当我滚动列表时,这会出现问题。举个例子: 假设列表有 50 个项目。一次可以看到 10 个。我选择第 5 项 [从而改变背景]。然后我滚动列表。滚动对应于前面第 5 项的列表的可见部分后,说列表项中的第 15 项,但可见部分中的第 5 个索引,仍然有对应于选定状态的背景。而它不应该被设置,因为我还没有选择第 15 项。

我试过: a-在适配器的 getView 方法中,如果该项目不是所选项目之一,我将设置一个不同的背景。尝试过 - setBackgroundColor 以及 setBackgrounddrawable。 b- 在 xml 中将 cacheColorHint 设置为透明 c- 将选择器附加到项目,并且项目响应 onlcick 中的状态 [pressed,selected]。

但是我仍然无法摆脱滚动项目不需要的背景颜色。

任何帮助。我尝试了 SO 中各个帖子中提到的各种建议,但尚未成功。

我试过了

谢谢 普拉迪普

最佳答案

这是 Android 中 ListView 适配器的正常行为,它的 getView() 在每次滚动时调用,对于每个新的列表项它调用 getView,如果 listview 项当前在 UI 上不可见,那么它的 convertView 等于 null:在时间 ListView 仅加载可见列表项,如果它一次显示 50 个元素中的 10 个元素,则 listView.getChildCount() 将仅返回 10 个而不是 50 个。 在您选择 5 的情况下,它也反射(reflect)了 5+10(可见项目计数)= 15、25、35、45 的选择。 要解决这个问题,你应该有一个标志与你的每个 listItem 数据相关联,例如,如果你有字符串数组 itemData[50] 作为数组,然后取一个 boolean isSelected[50] 数组,每个数组的初始值为 false。

在适配器类中查看 getView():

      public View getView(int position, View convertView, ViewGroup parent) {

        final ViewHolder holder;
                    string text = itemData[position]
        if (convertView == null) {
            rowLayout = (RelativeLayout) LayoutInflater.from(context)
                    .inflate(R.layout.list_view_item, parent, false);
            holder = new ViewHolder();

            holder.txtString= (TextView) rowLayout
                    .findViewById(R.id.txtTitle);
            rowLayout.setTag(holder);
        } else {
            rowLayout = (RelativeLayout) convertView;
            holder = (ViewHolder) rowLayout.getTag();
        }


        if(isSelected[position] == true){
                   holder.txtString.setText("Selected")
                   rowLayout.setBackGround(selected)
        }else{
                             holder.txtString.setText("Not Selected")
             rowLayout.setBackGround(notSelected)
        }




    public class ViewHolder {
        public TextView txtString;

    }

并在 listView.setOnItemClickListener() 上的 Activity 类中:

 listView.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1,
                        int position, long arg3) {
                    // TODO Auto-generated method stub
                      isSelected[position] = true  // on selection

                      RelativeLayout rowLayout = (RelativeLayout) view;
          rowLayout.setBackGround(Selected);


                      // also set here background selected for view by getting layout refference


                    }
            });

关于Android:列表滚动 ListView 项目背景问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9195432/

相关文章:

android - Recyclerviews 和 SwipeRefreshLayout 使用支持库 23.2.0

Android Webkit 在后台

java - SQLite列 '_id'不存在

android - 将设置添加到 Android 应用程序

java - import android.support 无法解析

java - 排序 Android ListView

JavaFX 填充一个简单的 listView

android - 将焦点放在android中 ListView 的任何项目上

SharePoint - 用于查看远程列表的 Web 部件

javascript - jQuery - 允许在移动设备上自动显示键盘