【问题标题】:listview select multiple row列表视图选择多行
【发布时间】:2016-02-01 10:09:14
【问题描述】:

我正在使用ArrayAdapter

ArrayAdapter<Product> adapter = new ArrayAdapter<Product>(this,
                android.R.layout.simple_list_item_1, items);
listView1.setAdapter(adapter);

问题是当我从listview 中选择第一个项目时,它会自动选择另一个项目。

我没有选择第 12 项

全部代码

final ListView listView1 = (ListView) findViewById(R.id.listView);

Product[] items = {
        new Product(1, "Milk", 21.50),
        new Product(2, "Butter", 15.99),
        new Product(3, "Yogurt", 14.90),
        new Product(4, "Toothpaste", 7.99),
        new Product(5, "Ice Cream", 10.00),
        new Product(6, "Milk", 21.50),
        new Product(7, "Butter", 15.99),
        new Product(8, "Yogurt", 14.90),
        new Product(9, "Toothpaste", 7.99),
        new Product(10, "Ice Cream", 10.00),
        new Product(11, "Milk", 21.50),
        new Product(12, "Butter", 15.99),
        new Product(13, "Yogurt", 14.90),
        new Product(14, "Toothpaste", 7.99),
        new Product(15, "Ice Cream", 10.00),
        new Product(16, "Milk", 21.50),
        new Product(17, "Butter", 15.99),
        new Product(18, "Yogurt", 14.90),
        new Product(19, "Toothpaste", 7.99),
        new Product(20, "Ice Cream", 10.00),
};

ArrayAdapter<Product> adapter = new ArrayAdapter<Product>(this,
            android.R.layout.simple_list_item_1, items);

listView1.setAdapter(adapter);

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

         String item = ((TextView) view).getText().toString();
         view.setSelected(true);
         listView1.setItemChecked(position, true);
         view.setBackgroundColor(Color.GREEN);
      }
});

【问题讨论】:

  • 你能发布你的适配器代码
  • 查看可重用性。使用ViewHolder
  • 尝试改用 parent.setSelection(int position)
  • 滚动时会出现这个吗?
  • 当我按下时,我看到另一个项目被选中

标签: android listview multiple-select


【解决方案1】:

在链接http://paste.ubuntu.com/14848762/ 共享的CustomArrayAdapter 中,您正在更改Click ListenerrelativeLayout 的颜色,当您滚动或视图被回收时,您应该重置此布局并应该为您单击的项目启用颜色。例如,您可以使用这种方法。

relativeLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int color;
                    if (tt8.getText().toString().equals("1")){
                        color = Color.RED;
                        relativeLayout.setBackgroundColor(color);
                    }else {
                        color = Color.GREEN;                        
                        relativeLayout.setBackgroundColor(color);
                    }
                    p.setColor(color);

                }
            });

relativeLayout.setBackgroundColor(p.getColor());

希望这会有所帮助。

【讨论】:

  • 我想这就是 1 分钟 :)
【解决方案2】:

这是因为您的适配器重用了膨胀的视图。

一种解决方案是覆盖您的 ArrayAdapter's getView() 方法,以便正确呈现您的视图并(甚至更好)实现 ViewHolder,这样您就不会因为一次又一次的膨胀而失去任何性能!

【讨论】:

  • 好吧,删除relativeLayout.setOnClickListener .... 中的getView 代码。保留原始帖子的listView1.setOnItemClickListener()。每次调用 setOnItemClickListener 时,都会将点击状态保存在布尔数组中。当你的getView 被调用时,检查布尔数组是否正确渲染红色或绿色
  • 这可以确定您的回收视图没有被重置。当您单击第一项时,此视图也将用于第 11 项。这就是为什么你的第 11 项也是绿色的。
  • @MustansarSaeed 完全同意
  • @Mustansar Saeed 绝对
【解决方案3】:

尝试进行此更改

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

            String item = listView1.getItemAtPosition(position);
            Log.d("position", position+", item");


        }
    });

在下面的评论中更新您在 logcat 中获得的值,以便我可以提出更好的代码。

【讨论】:

  • OP的问题不一样。问题与视图回收和重置有关。
  • 但是您的视图视图将提供对当前所选项目的引用,如果问题不是输出的问题,即使那样它也不能跳转到意外索引。我觉得问题在于为列表视图设置适配器
  • 它没有跳转到意外索引。问题是当它选择第 1 项时,该视图也用于第 11 项,这就是为什么 2 项显示为绿色的原因。这种回收可以通过实现自定义arrayadapter和getView来管理
  • 当我在列表视图中上下混合项目时,例如不再选择所选项目......
  • 你为什么不喜欢item selected listener
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2016-10-17
  • 1970-01-01
相关资源
最近更新 更多