在MyListViewAdapter
内部,我直观地对convertView
进行了更改,但随着列表的重复使用,这些更改会在其他行项上保留。换句话说,现在每一行都是红色的。怎么办?我该如何防止这种情况?
View getView(View convertView, int position etc)
{
Button myButton = (Button)convertView.findViewById(R.id.myButton);
myButton.setTag(convertView);
myButton.setOnclickListener( new OnClickListener(){
public void onClick(View v){
View containingView = myButton.getTag();
containingView.setBackgroundColor(Color.RED);
}
});
}
问题是视图被重用,所以现在我在其他地方有一个红色列表项,而不仅仅是代表我想要的视图的单元格的位置。这是什么解决方案?如何防止视图以这种方式重用?
答案 0 :(得分:0)
使用ViewHolder模式:
@Override
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_row, null);
holder = new ViewHolder();
holder.button = (Button)convertView.findViewById(R.id.button);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.button.setOnclickListener(new OnClickListener(){
public void onClick(View v){
v.setBackgroundColor(Color.RED);
}
});
return convertView;
}
private class ViewHolder{
public Button button;
}
答案 1 :(得分:0)
您必须手动设置它,然后将红色位置保存在支架之类的东西上,并验证选择正确的颜色。
答案 2 :(得分:0)
一般建议,在编码之前,你应该多阅读一下适配器。
简单:
您必须跟踪单击的视图,并在每个getView上设置/重置颜色。
View getView(View convertView, int position etc)
{
if(convertView == null{
convertView = // inflate it
colorStatusMap.put(h.position, defaultColor);
convertView.findViewById(R.id.myButton).setOnClickListener(clickListener);
convertView.findViewById(R.id.myButton).setTag(convertView);
}
convertView.setBackgroundColor(colorStatusMap.get(position));
convertView.setTag((Integer)position);
}
private OnClickListener clickListener = new OnClickListener(){
public void onClick(View v){
View containingView = v.getTag();
containingView.setBackgroundColor(Color.RED);
int position = (Integer)containingView.getTag();
colorStatusMap.put(position, Color.RED);
}
}
private HashMap<Integer, Integer> colorStatusMap = new HashMap<Integer, Integer>();
ps。:我用心脏打字并且没有实际编译和检查它,但你可以知道你应该做什么。如果我的代码出现任何错误的可能性很小,您可以修复它们。
答案 3 :(得分:0)
尝试一次
这是一个小代码供您使用:我将创建一个布尔arraylist。
private ArrayList<Boolean> item_clicked = new ArrayList<Boolean> ();
然后我将在构造函数中将所有行元素的状态设置为false:
for (int i=0; i < no_of_elements.size(); i++) {
item_clicked.add(i, false);
}
单击行时设置实际单击状态: myButton.setOnclickListener(new OnClickListener(){
public void onClick(View v){
item_clicked.set(position, true);
View containingView = myButton.getTag();
containingView.setBackgroundColor(Color.RED);
}
});
在你的getview方法中给出这个条件
if (item_clicked.get(position)) {
//SET BACKGROUD AS RED
} else {
// SET BACKGROUND AS NORMAL COLOR
}