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

时间:2012-02-08 14:40:41

标签: android listview

我面临滚动项目背景问题。

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

我试过了: a-在适配器的getView方法中,如果项目不是所选项目之一,我设置一个其他不同的背景.Tried - setBackgroundColor以及setBackgrounddrawable。 b-在xml中将cacheColorHint设置为透明 c-选择器连接到项目,并且项目响应onlcick中的[按下,选择]状态。

然而,在滚动项目时,我仍然无法摆脱不需要的背景颜色。

任何帮助。我在SO的各个帖子中尝试了各种各样的建议,但还没有成功。

我试过

感谢 普拉迪普

1 个答案:

答案 0 :(得分:1)

这是android中ListView适配器的正常行为,它的getView()在每个滚动上调用,对于调用getView的每个新列表项,如果listview项目当前在UI上不可见,那么它的convertView等于null:时间列表视图只加载可见列表项,如果它一次显示50个元素中的10个元素,则listView.getChildCount()将仅返回10而不是50。 在您选择5的情况下,它反映了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


                    }
            });