【问题标题】:Android:Listview item background issue on list scrollingAndroid:列表滚动时的Listview项目背景问题
【发布时间】:2012-02-08 23:22:16
【问题描述】:

我在滚动时遇到以下问题。

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

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

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

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

我试过了

谢谢 普雷迪普

【问题讨论】:

  • 你在重复使用你的 convertView 吗?听起来背景已经设置好了,并且在重复使用时您不会重置它。
  • 同意@Blundell,您应该发布您的适配器代码。

标签: android listview


【解决方案1】:

这是 android 中 ListView 适配器的正常行为,它的 getView() 在每次滚动时调用,并且对于它调用 getView 的每个新列表项,如果列表视图项当前在 UI 上不可见,则其 convertView 等于 null:时间 listview 仅加载可见列表项,如果它一次显示 50 个元素中的 10 个元素,则 listView.getChildCount() 将仅返回 10 而不是 50。 在您选择 5 的情况下,它也反映了 5+10(可见项目数)= 15、25、35、45 的选择。 要解决此问题,您应该为每个 listItem 数据关联一个标志,例如,如果您将字符串数组 itemData[50] 作为数组,则将一个布尔数组 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;

    }

在你的 Activity 类中 listView.setOnItemClickListener():

 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


                    }
            });

【讨论】:

  • 在您的代码中,当单击一行时,相对布尔值设置为 true,但在单击另一行时您永远不会将其重置为 false。这是一个错误吗?如果是,我该如何解决?
  • 以上示例用于多行选择,只是一个逻辑。根据您的需要,您可以使用 Array.fill(isSelected, false);就在 isSelected[position] = true; 之前
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
相关资源
最近更新 更多