Android 更改简单列表视图中的项目背景色

Android 更改简单列表视图中的项目背景色,android,listview,Android,Listview,我想在简单的列表视图中更改单击时的项目背景颜色。这是我的密码: boolean[] selectedItem = new boolean[listElement.length] final ArrayList<String> list1 = new ArrayList<>(); Collections.addAll(list1, listElement); final ListView mylist = (ListView) findViewById(R.id.listV

我想在简单的列表视图中更改单击时的项目背景颜色。这是我的密码:

boolean[] selectedItem = new boolean[listElement.length]
final ArrayList<String> list1 = new ArrayList<>();
Collections.addAll(list1, listElement);
final ListView mylist = (ListView) findViewById(R.id.listView);
final ArrayAdapter<String> adapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, list1);
mylist.setAdapter(adapter);
mylist.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {

            int firstVisiblePosition = mylist.getFirstVisiblePosition();
            int effectivePosition = pos - firstVisiblePosition;

            if (!selectedItem[pos]) {
                mylist.getChildAt(effectivePosition).setBackgroundColor(Color.parseColor("#66F44336"));
            } else {
                mylist.getChildAt(effectivePosition).setBackgroundColor(Color.parseColor("#EEEEEE"));
            }

           selectedItem[pos] = !selectedItem[pos];
        }
    });
boolean[]selectedItem=new boolean[liselement.length]
最终ArrayList列表1=新ArrayList();
Collections.addAll(列表1,列表元素);
最终ListView mylist=(ListView)findViewById(R.id.ListView);
最终ArrayAdapter=新的ArrayAdapter(上下文,android.R.layout.simple\u list\u item\u 1,list1);
mylist.setAdapter(适配器);
mylist.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
公共链接(AdapterView arg0、视图arg1、内部位置、长arg3){
int firstVisiblePosition=mylist.getFirstVisiblePosition();
int effectivePosition=pos-第一个可见位置;
如果(!selectedItem[pos]){
mylist.getChildAt(effectivePosition).setBackgroundColor(Color.parseColor(“#66F44336”);
}否则{
mylist.getChildAt(effectivePosition).setBackgroundColor(Color.parseColor(“#EEEEEE”);
}
selectedItem[pos]=!selectedItem[pos];
}
});

当列表很短(不涉及滚动)时,它工作,当列表很长时,它不工作:单击的项目的背景颜色确实会改变,但当我开始滚动时,每个项目的背景颜色都开始改变,我在这些改变中找不到任何逻辑,它们会改变,甚至在我不触摸它们的情况下反转,只需滚动,wich很奇怪,因为颜色只应该在调用onItemClick()时更改,对吗?我遗漏了什么?

您遗漏了一点,
列表视图
在项目布局退出屏幕时(即,您滚动列表)会重新使用它们

您需要保存每个项目的背景,并在请求视图时进行设置。这发生在
ListView
适配器的
getView
内部

快速修复方法是在移动中使用自定义适配器:

final boolean[] selectedItem = new boolean[listElement.length];

ArrayAdapter<String> adapter = new ArrayAdapter<String>(context,
        android.R.layout.simple_list_item_1, list1) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        if (selectedItem[position]) {
            view.setBackgroundColor(Color.parseColor("#66F44336"));
        } else {
            view.setBackgroundColor(Color.parseColor("#EEEEEE"));
        }
        return view;
    }
};
final boolean[]selectedItem=new boolean[liselement.length];
ArrayAdapter=新的ArrayAdapter(上下文,
android.R.layout.simple_list_item_1,list1){
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=super.getView(位置、转换视图、父级);
如果(选择编辑项[位置]){
view.setBackgroundColor(Color.parseColor(#66F44336”);
}否则{
view.setBackgroundColor(Color.parseColor(“#EEEEEE”);
}
返回视图;
}
};

这缺少错误检查,但您应该了解这一点。祝你好运

您忽略了一点,
ListView
在项目布局退出屏幕(即滚动列表)时重新使用它们

您需要保存每个项目的背景,并在请求视图时进行设置。这发生在
ListView
适配器的
getView
内部

快速修复方法是在移动中使用自定义适配器:

final boolean[] selectedItem = new boolean[listElement.length];

ArrayAdapter<String> adapter = new ArrayAdapter<String>(context,
        android.R.layout.simple_list_item_1, list1) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        if (selectedItem[position]) {
            view.setBackgroundColor(Color.parseColor("#66F44336"));
        } else {
            view.setBackgroundColor(Color.parseColor("#EEEEEE"));
        }
        return view;
    }
};
final boolean[]selectedItem=new boolean[liselement.length];
ArrayAdapter=新的ArrayAdapter(上下文,
android.R.layout.simple_list_item_1,list1){
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=super.getView(位置、转换视图、父级);
如果(选择编辑项[位置]){
view.setBackgroundColor(Color.parseColor(#66F44336”);
}否则{
view.setBackgroundColor(Color.parseColor(“#EEEEEE”);
}
返回视图;
}
};

这缺少错误检查,但您应该了解这一点。祝你好运

您忽略了一点,
ListView
在项目布局退出屏幕(即滚动列表)时重新使用它们

您需要保存每个项目的背景,并在请求视图时进行设置。这发生在
ListView
适配器的
getView
内部

快速修复方法是在移动中使用自定义适配器:

final boolean[] selectedItem = new boolean[listElement.length];

ArrayAdapter<String> adapter = new ArrayAdapter<String>(context,
        android.R.layout.simple_list_item_1, list1) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        if (selectedItem[position]) {
            view.setBackgroundColor(Color.parseColor("#66F44336"));
        } else {
            view.setBackgroundColor(Color.parseColor("#EEEEEE"));
        }
        return view;
    }
};
final boolean[]selectedItem=new boolean[liselement.length];
ArrayAdapter=新的ArrayAdapter(上下文,
android.R.layout.simple_list_item_1,list1){
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=super.getView(位置、转换视图、父级);
如果(选择编辑项[位置]){
view.setBackgroundColor(Color.parseColor(#66F44336”);
}否则{
view.setBackgroundColor(Color.parseColor(“#EEEEEE”);
}
返回视图;
}
};

这缺少错误检查,但您应该了解这一点。祝你好运

您忽略了一点,
ListView
在项目布局退出屏幕(即滚动列表)时重新使用它们

您需要保存每个项目的背景,并在请求视图时进行设置。这发生在
ListView
适配器的
getView
内部

快速修复方法是在移动中使用自定义适配器:

final boolean[] selectedItem = new boolean[listElement.length];

ArrayAdapter<String> adapter = new ArrayAdapter<String>(context,
        android.R.layout.simple_list_item_1, list1) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        if (selectedItem[position]) {
            view.setBackgroundColor(Color.parseColor("#66F44336"));
        } else {
            view.setBackgroundColor(Color.parseColor("#EEEEEE"));
        }
        return view;
    }
};
final boolean[]selectedItem=new boolean[liselement.length];
ArrayAdapter=新的ArrayAdapter(上下文,
android.R.layout.simple_list_item_1,list1){
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=super.getView(位置、转换视图、父级);
如果(选择编辑项[位置]){
view.setBackgroundColor(Color.parseColor(#66F44336”);
}否则{
view.setBackgroundColor(Color.parseColor(“#EEEEEE”);
}
返回视图;
}
};
这缺少错误检查,但您应该了解这一点。祝你好运