ListL错误选择ItemLongClistener

时间:2014-08-03 23:11:00

标签: android listview

我有一个绘制所选项目视图的方法,但是如果我的ListView有滚动(我的意思是:如果我的屏幕可以显示9"行" - 位置 - 并且总大小大于9 )我选择前九个位置中的一个,它将选择我选择的位置和一个从最后位置(我需要滚动查看的位置)。

示例:如果我选择选择位置0并绘制它,将绘制位置0和位置11上的视图。

如果我尝试:

getListView().getChildAt(int)

如果此位置类似于' 12',它将返回null,因此我使用我在onItemLongClick(AdapterView adapterView,View v,int position,long arg3)时获得的视图是调用。看起来View基于滚动,因为我有相同的View对象用于滚动位置。

以下是我绘制视图的方式:

    listView.setOnItemLongClickListener(new OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> adapterView, View v,
                int position , long arg3) {
            Log.d("", "");

            View tmp = adapterView.getChildAt(position);

            int oi = adapterView.getSelectedItemPosition();

            if(!mPositions.contains(Integer.valueOf(position))){
                v.setBackgroundColor(Color.CYAN);
                mViews.add(v);
                mPositions.add(Integer.valueOf(position));
            } else {
                v.setBackgroundColor(Color.TRANSPARENT);
                mViews.remove(v);
                mPositions.remove(Integer.valueOf(position));
            }
            return true;
        }
    });

如果列表大于我的屏幕,我怎样才能独立获得不同的视图?

1 个答案:

答案 0 :(得分:1)

这里的问题是你真的不应该直接修改视图。 ListView的重点是它将为一个项创建一个视图,然后可能使用同一个视图来绘制列表中的每个项。 (行回收)。在这里,当您修改所选项目视图的背景颜色时,此视图对象实际上被用于绘制另一行的项目 - 看起来就像它正在做的那样对于错误的行。

您应该做的是使用您自己的getView()实现创建自定义适配器。在这个函数中你将做两件事之一:如果convertView为null,那么创建你想要的View(可能是TextView?),否则你将从convertView中获取视图。最后,您将根据它在列表中的位置设置此视图。即:如果是文本,请设置值,然后设置背景。

要响应longpress,只需更改数据(mSeleted)并调用notifyDataSetChanged(),以便根据此新数据重绘列表。

这是一个非常简单的概述,列表视图可以根据需要变得复杂。如果您搜索,有很多关于如何在网络上创建自定义列表视图的示例。