【问题标题】:ListView wrong selection on ItemLongClistenerListView 在 ItemLongClistener 上的选择错误
【发布时间】:2014-08-03 23:11:00
【问题描述】:

我有一种方法可以绘制所选项目的视图,但是如果我的 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;
        }
    });

如果列表比我的屏幕大,我如何独立获得不同的视图?

【问题讨论】:

    标签: android listview


    【解决方案1】:

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

    您应该做的是使用您自己的 getView() 实现创建一个自定义适配器。在此函数中,您将执行以下两项操作之一:如果 convertView 为空,则创建所需的视图(可能是 TextView?),否则您将从 convertView 获取视图。最后,您将根据它在列表中的位置来设置此视图。即:如果是文本,设置值,然后设置背景。

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

    这是一个非常简单的概述,列表视图可以随心所欲地变得复杂。如果您进行搜索,有很多示例说明如何在 Web 上创建自定义列表视图。

    【讨论】:

    • 知道了。所以我应该改变我的实现,在我的自定义适配器上添加一个监听器,对吧?我想知道是否可以在我的适配器中使用操作栏。我发现的所有实现都使用 ListActivity 上的操作栏。
    • 是的,您的侦听器会更新自定义适配器中的数据,然后通知您的列表数据已更改(因此会导致重绘)。然后,您的自定义适配器会将视图配置为根据提供的数据以不同方式显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多