【问题标题】:Android ListView Items select and resetAndroid ListView 项目选择和重置
【发布时间】:2015-09-09 00:54:11
【问题描述】:

我的简单应用程序有问题。它使用一个列表视图,它必须: - 按下时打开一个新活动,它处于查看模式 - 在编辑模式下突出显示选定的项目

我正在做以下事情:

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

但这只有在列表视图中的所有项目都可见时才能正常工作。 我试过在适配器上实现这个但没有成功......

有什么建议吗?

谢谢!

编辑

好吧,在 Jawad 回答之后,我才弄清楚“getView”方法是如何工作的。所以这是我使用的解决方案:

我声明了一个包含所选项目的数组列表:

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方法的oververride:

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

谢谢你 :)

【问题讨论】:

  • 而不是更改 listview 项目的背景颜色,此处更改适配器类 getView(...) 方法。

标签: android listview


【解决方案1】:

我认为你的问题是你没有注意查看回收。当您更改视图背景的颜色时,视图可以被回收,您将得到一些不想要的东西。详情请查看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 子项的数量。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    相关资源
    最近更新 更多