我有自定义列表视图和自定义适配器。 单击此列表视图的一行时,TextView的文本将设置为白色,此行的背景将设置为黑色。
一切都很好,但是当点击一行时,其他行的背景颜色也设置为黑色,当上下滚动时,所有行都会搞乱。
自定义适配器中的getView()
public View getView(final int position, View convertView, ViewGroup parent) {
final ListItem holder;
View vi=convertView;
if(vi==null){
vi = inflater.inflate(R.layout.list, null);
holder = new ListItem();
holder.nametext= (TextView) vi.findViewById(R.id.name);
vi.setTag(holder);
}else{
holder = (ListItem) vi.getTag();
}
holder.nametext.setText(""+item.name);
return vi;
}
在主要活动中:
CustomAdapter listadapter = new CustomAdapter(context, R.layout.list, items);
list.setAdapter(listadapter);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position, long arg){
TextView v = (TextView) view.findViewById(R.id.name);
view.setBackgroundColor(Color.BLACK);
v.setTextColor(Color.WHITE);
}
});
我尝试在getView()中放入setOnItemClickListener,但没有运气..
有任何帮助吗?感谢。
答案 0 :(得分:6)
自定义列表视图“创建”仅显示行的视图,当向下滚动显示下一行时,将像第一行一样受到影响..
要防止此问题,您需要在ListItem中创建一个布尔字段单击;
然后点击视图时, item.Clicked 设置为 true ,其中 getView()
final ListItem item = items.get(position);
和
List<ListItem> items;
作为适配器的变量
实施:
您需要在getView()中设置setOnClickListener,如下所示
vi.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg1) {
if(previousView!=null){
ListItem previousItem = items.get(previousPosition);
previousItem.Clicked = false;
}
item.Clicked = true;
previousView = arg1;
previousPosition = position;
notifyDataSetChanged();
}
});
if(!item.isClicked){
holder.nametext.setTextColor(Color.BLACK);
vi.setBackgroundColor(Color.WHITE);
}else{
holder.nametext.setTextColor(Color.WHITE);
vi.setBackgroundColor(Color.BLACK);
}
});
答案 1 :(得分:0)
这是列表视图的缓存颜色提示的默认效果,您可以通过将“android:cacheColorHint”属性设置为@null来避免这种情况
<ListView
android:id="@+id/lstEventComment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:cacheColorHint="@null"
/>