Android Listview项目中的按钮颜色更改无法正常工作

Android Listview项目中的按钮颜色更改无法正常工作,android,listview,Android,Listview,在我的listview中,每个项目列表都有一个按钮。当我单击按钮时,按钮颜色从绿色变为红色。但当我向下滚动时,我看到的第一个项目的颜色按钮也是红色的。为什么我的listview中的上一个状态视图未清除? 这是我的getView(…)代码 正如您所知,getView()将重用一些视图 因此,这些视图可能带有最后使用的颜色。这样,您总是必须根据位置设置文本和颜色 方法getView()为每个convertView设置文本。但是,您永远不会再次更改按钮颜色/文本。一旦设定,你就不会再改变了 此外,我会

在我的listview中,每个项目列表都有一个按钮。当我单击按钮时,按钮颜色从绿色变为红色。但当我向下滚动时,我看到的第一个项目的颜色按钮也是红色的。为什么我的listview中的上一个状态视图未清除? 这是我的getView(…)代码

正如您所知,getView()将重用一些视图

因此,这些视图可能带有最后使用的颜色。这样,您总是必须根据位置设置文本和颜色

方法getView()为每个convertView设置文本。但是,您永远不会再次更改按钮颜色/文本。一旦设定,你就不会再改变了

此外,我会尝试改变逻辑。您正在为每个按钮设置OnClickListener。但是,ListView可以有一个侦听器

因此,我将对您的代码执行以下更改:

注意

我创建了一个布尔数组来跟踪所有单击的按钮。这只是一个分享想法的例子

你应该做些更聪明的东西

您的适配器:

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);
            }
        }
    });
}