Android ListView项目选择并重置

时间:2015-09-05 13:23:09

标签: android listview

我的简单应用程序存在问题。它使用列表视图,必须: - 按下时打开一个新的活动,它在查看模式下 - 在编辑模式

时突出显示所选项目

我正在做以下事情:

        ListView lv = (ListView)findViewById(R.id.categoryListView);

        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                                    long id) {

                String entry = (String) parent.getItemAtPosition(position);

                if (_editMode)
                    view.setBackgroundColor(Color.parseColor("#5B5B5B"));
                else 
                {
                    Intent intent = new Intent(MainActivity.this, CategoryActivity.class);
                    intent.putExtra("CATEGORY", entry);
                    startActivity(intent);
                }
            }
        });

然后我希望当我转向查看模式时,必须取消选择所有项目,并且我这样做:

for (int i = 0; i < lv.getAdapter().getCount(); i++)
{
    lv.getChildAt(i).setBackgroundColor(Color.parseColor("#FFFFFF"));
}

但只有当listview中的所有项目都可见时,这才能正常工作。 我已尝试在适配器上实现此功能但未成功...

有什么建议吗?

谢谢!

修改

好的,在Jawad回答之后我才知道&#34; getView&#34;方法工作。所以这就是我使用的解决方案:

我宣布了一个包含所选项目的arraylist:

ArrayList<String> itemSelected = new ArrayList<String>();

这是ListView onItemClick侦听器(您可以在其中选择和取消选择项目):

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                                long id) {


                String entry = (String) parent.getItemAtPosition(position);

                if (itemSelected.contains(entry))
                {
                    itemSelected.remove(entry);
                }
                else
                {
                    itemSelected.add(entry);
                }

                ((ArrayAdapter<String>)lv.getAdapter()).notifyDataSetChanged();
        }
    });

这是getView方法的主要内容:

itmList.setAdapter(new ArrayAdapter<String>(this,R.layout.list_black_text,R.id.list_content, itmStrList){
        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
            if (convertView != null)
            {
                if (itemSelected.contains(itmList.getAdapter().getItem(position))) {
                    convertView.setBackgroundColor(Color.RED);
                } else {
                    convertView.setBackgroundColor(Color.parseColor("#5B5B5B"));
                }
            }

            return super.getView(position, convertView, parent);
        }
    });

这是取消选择所有项目的方法:

        itemSelected.clear();

        ((ArrayAdapter<String>)lv.getAdapter()).notifyDataSetChanged();

谢谢你:)

1 个答案:

答案 0 :(得分:2)

我认为您的问题是您不注意查看回收。当您更改视图背景的颜色时,视图可以被回收,并且您将有不希望的东西。有关详细信息,请查看此link

你应该在你称为isSelected之类的欠限数据中有一个,比如说布尔变量。并在getView()方法中添加此代码。

    if(item.isSelected()){ 
            setBackgroundColor(Color.parseColor("#5B5B5B"));
    }
    else{
           setBackgroundColor(Color.parseColor("#FFFFFF"));
    }

然后在你的onItemClick中添加替换view.setback ... by

    lv.getAdapter().getItem(position).setSelected(true);
    lv.getAdapter().notifyDataSetChanged();

您可能需要演员。

最后改变这个

for (int i = 0; i < lv.getAdapter().getCount(); i++)
{
    lv.getChildAt(i).setBackgroundColor(Color.parseColor("#FFFFFF"));
}

到此:

for (int i = 0; i < lv.getAdapter().getCount(); i++)
{
    lv.getAdapter().getItem(i).setSelected(false);
}

lv.getAdapter().notifyDataSetChanged();

您的部分代码仅在所有项目都可见时才起作用的原因是视图回收。此外,lv.getChildAt()仅为您提供可见的视图。您的代码可能会崩溃,因为adapter.getcount可能比listview子项的数量大。

希望它有所帮助。