为什么列表视图中会自动选择两行?

时间:2016-11-15 13:25:00

标签: android listview

我的代码有一个ListView的通知,当用户点击通知时,它的颜色会发生变化。但我的问题是,当用户点击第一行时,另一行颜色也会自动更改,与其他行相同。

notiId.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adpterView, View view, int position,
                                long id) {
            String sr_msg=arrayList.get(position);
            String sr_title= list_tittle.get(position);
            ArrayList<String> arr_intent = new ArrayList<String>();
            arr_intent.add(sr_msg);
            arr_intent.add(sr_title);
            Intent intent = new Intent(getActivity(), NotiPerList.class);
            Bundle args = new Bundle();
            args.putSerializable("NOTI", (Serializable) arr_intent);
            intent.putExtra("NOTI",arr_intent );
            startActivity(intent);
            String yn=arr2.get(position);
            String s2= arr3.get(position).toString();
            notiId.getChildAt(position).setBackgroundColor(Color.GRAY);

        }

}

修改

@Override
public View getView(int position, View v, ViewGroup parent)
{
    View mView = v ;
    if(mView == null) {
        LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mView = vi.inflate(id, null);
    }
    listView=(ListView)mView.findViewById(R.id.notiID);
    String sd= yORn.get(position);
    if(sd.equals("Y")){
        mView.setBackgroundColor(Color.GRAY);
    }
}

2 个答案:

答案 0 :(得分:1)

这就是ListView的工作原理。它正在重复使用屏幕外的视图。您必须告诉Adapter更改特定索引视图的颜色,而不是直接更改视图。

这样的事情:

@Override
        public void onItemClick(AdapterView<?> adpterView, View view, int position,
                                long id) {

    ...
    yourAdapter.setHighLightedViewIntex(position);
    yourAdapter.notifyDataSetChanged();

}

Adapter

getView(...) {

    if(highlightedPosition == position) {
        //set background to highlighted
    } else {
        //set background to regular
    }
}

答案 1 :(得分:0)

删除此行

notiId.getChildAt(position).setBackgroundColor(Color.GRAY);

如果您的列表有多个选择,那么

  1. 保留Integer类型的HashSet对象
  2. 在onItemClick方法中添加位置
  3. 在getView方法中写入条件,如果(set.contains(position))
    显示其他背景,否则为正常背景