Android Listview项目中的按钮颜色更改无法正常工作
在我的listview中,每个项目列表都有一个按钮。当我单击按钮时,按钮颜色从绿色变为红色。但当我向下滚动时,我看到的第一个项目的颜色按钮也是红色的。为什么我的listview中的上一个状态视图未清除? 这是我的getView(…)代码 正如您所知,getView()将重用一些视图 因此,这些视图可能带有最后使用的颜色。这样,您总是必须根据位置设置文本和颜色 方法getView()为每个convertView设置文本。但是,您永远不会再次更改按钮颜色/文本。一旦设定,你就不会再改变了 此外,我会尝试改变逻辑。您正在为每个按钮设置OnClickListener。但是,ListView可以有一个侦听器 因此,我将对您的代码执行以下更改: 注意 我创建了一个布尔数组来跟踪所有单击的按钮。这只是一个分享想法的例子 你应该做些更聪明的东西 您的适配器:Android Listview项目中的按钮颜色更改无法正常工作,android,listview,Android,Listview,在我的listview中,每个项目列表都有一个按钮。当我单击按钮时,按钮颜色从绿色变为红色。但当我向下滚动时,我看到的第一个项目的颜色按钮也是红色的。为什么我的listview中的上一个状态视图未清除? 这是我的getView(…)代码 正如您所知,getView()将重用一些视图 因此,这些视图可能带有最后使用的颜色。这样,您总是必须根据位置设置文本和颜色 方法getView()为每个convertView设置文本。但是,您永远不会再次更改按钮颜色/文本。一旦设定,你就不会再改变了 此外,我会
public class MyListAdapter extends BaseAdapter {
// With same size of Adaptar Size - as returned by getCount().
// Initialize it as soon as the adapter is created
private boolean [] wasClicked;
public boolean wasClicked(int position) {
return wasClicked[position];
}
public void setClicked(int position, boolean clicked) {
wasClicked[position] = clicked;
}
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater) act
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.list_user, null);
}
TextView txtHeader = (TextView) convertView.findViewById(R.id.firstLine);
TextView txtFooter = (TextView) convertView.findViewById(R.id.secondLine);
Button btnAction = (Button) convertView.findViewById(R.id.btn_action);
txtHeader.setText(mDataset.get(position).getUsername());
txtFooter.setText(mDataset.get(position).getId());
if(!wasClicked(position)) {
btnAction.setTag("start");
btnAction.setText("start");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
btnAction.setBackground(/* SET DEFAUL COLOR */);
}
} else {
btnAction.setTag("finish");
btnAction.setText("finish");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
btnAction.setBackground(act.getResources().getDrawable(R.drawable.rounded_corner_error));
}
}
return convertView;
}
}
在您的活动中:
public class Activity extends Activity {
list.setAdapter(adapter);
list.setClickable(true);
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
Button btnAction = (Button) view.findViewById(R.id.btn_action);
if(adapter.wasClicked(position)){
btnAction.setTag("finish");
btnAction.setText("finish");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
btnAction.setBackground(act.getResources().getDrawable(R.drawable.rounded_corner_error));
}
adapter.setClicked(position, true);
}
}
});
}
公共类活动扩展活动{
list.setAdapter(适配器);
list.setClickable(true);
setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
按钮btnAction=(按钮)视图.findViewById(R.id.btn\u操作);
如果(适配器已单击(位置)){
btnAction.setTag(“饰面”);
btnAction.setText(“饰面”);
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.JELLY\u BEAN){
btnAction.setBackground(act.getResources().getDrawable(R.drawable.rounded_corner_error));
}
adapter.setClicked(位置,true);
}
}
});
}
它的工作很有魅力。非常感谢。我现在会好好探索,好好思考。很高兴听到你这么说。我认为您可以使用ArrayList或SparcableBooleanArray来跟踪按钮。。。这些只是替换布尔数组的一些示例
public class Activity extends Activity {
list.setAdapter(adapter);
list.setClickable(true);
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
Button btnAction = (Button) view.findViewById(R.id.btn_action);
if(adapter.wasClicked(position)){
btnAction.setTag("finish");
btnAction.setText("finish");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
btnAction.setBackground(act.getResources().getDrawable(R.drawable.rounded_corner_error));
}
adapter.setClicked(position, true);
}
}
});
}