Android - 在ListView的OnItemClick中使用setSelected

3

我正在尝试在ListView的OnItemClick事件中设置选定项,但它就是不会保持选定状态。我做错了什么?

lView.setOnItemClickListener(new OnItemClickListener()
   {
    @Override
    public void onItemClick(@SuppressWarnings("rawtypes") AdapterView parent, View clickedview, int position, long id)
    {
     clickedview.setSelected(true); 
        mItemsAdapter.select(position);
    }
   }); 

以下是需要翻译的内容:
1. 我正在尝试在列表视图上实现多选功能。
2. 我无法从ListActivity继承,因为Activity已经从BaseActivity自定义类继承了。
3. mItemsAdapter是一个自定义ItemsAdapter适配器,它继承自BaseAdapter。
4. 我不需要复选框,只需要能看到所选行即可。
5. ItemsAdapter重写了getView()方法,并通过填充xml来设置行的布局。

3个回答

5

当长按时,我可以将 ListView 中的某个项设置为选中状态:

@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
        int position, long id) {
    parent.requestFocusFromTouch(); // IMPORTANT!
    parent.setSelection(position);
    return true;
}

只有在我调用了requestFocusFromTouch()之后才有效。


requestFocusFromTouch() 加一。 - Lal

0

我使用内置功能选择时没有太好的运气。

我看到你有自己的自定义适配器,我猜这意味着你会将自定义视图作为行来膨胀。如果你的行不仅仅是checkedtextview,我认为你将无法正确使用setSelections。

我通过使用自己的模型和函数解决了这个问题。列表中的每个项目都有与之相关的数据以确定它是否被选中。然后我可以通过迭代该数组,在选定的值之间进行切换,并通过更改值并调用适配器上的notifydatasetchanged来更新UI(该适配器使用getView并根据我的选择模型绘制检查)。


谢谢,我在某个地方看到了CheckedTextView的实现并将尝试使用它,尽管我需要一些代码。你甚至可以用OnTouchEvent来做到这一点,只是似乎有些过度了。难道没有什么非常简单的方法吗? BTW CheckedTextView是一个控件还是一个XML文件?我有自己的XML文件,其中包含4到6个控件,并且它们都根据对象返回的内容动态打开/关闭。它不仅仅是普通的TextView。很多东西都在适配器getView()中完成。 - dropsOfJupiter

0

我现在没有太多时间,所以今天稍后再来看一下。不管怎样,请看一下我的之前的问题,我曾经也面临同样的困扰:

如果这些解决方案对你不起作用(我认为第一个解决方法是有效的),我们需要更多的代码才能帮助你。

希望这能对你有所帮助。


谢谢,我看到第一篇帖子的代码有点不同,我也遇到了项目跳转的问题。那是什么?我现在要尝试这种方法。 - dropsOfJupiter
@dropsOfJupiter 好的,请试一试,如果有问题告诉我! - Beasly
问题在于,被滚动出列表的每一行(视图)都会被重复使用于代替显示的行。这必须得到处理,并且“新”视图(行)的引用需要得到更新。由于某种原因,正常的onClick()方法不再起作用。 - Beasly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接