Android 正在设置从适配器选中的ListView项

Android 正在设置从适配器选中的ListView项,android,listview,checkedtextview,Android,Listview,Checkedtextview,我有一个列表视图,它显示两种项目。其中一种包含CheckedTextView。作为一个适配器,我正在使用自定义适配器扩展ArrayAdapter,其数据结构包含关于内部选中/未选中状态的信息 有些项目被标记为选中(在我的数据结构中),因此我当然希望在创建ListView时标记复选框。我尝试使用CheckedTextView的setChecked()方法在适配器中的getView()方法上执行此操作,但不起作用。我发现应该使用setItemChecked()在ListView级别执行此操作,它确实

我有一个列表视图,它显示两种项目。其中一种包含CheckedTextView。作为一个适配器,我正在使用自定义适配器扩展ArrayAdapter,其数据结构包含关于内部选中/未选中状态的信息

有些项目被标记为选中(在我的数据结构中),因此我当然希望在创建ListView时标记复选框。我尝试使用CheckedTextView的setChecked()方法在适配器中的getView()方法上执行此操作,但不起作用。我发现应该使用setItemChecked()在ListView级别执行此操作,它确实可以工作,但对我来说没有意义,因为要使其工作,我必须循环activity的onCreate()中的所有项,为选定的项调用setItemChecked()。项目列表可能很长,只选择了少数项目,因此这是一种浪费

为什么在getView()中调用setChecked()不起作用?有没有更好的方法(我是Android新手)

下面是我选中的项目布局和适配器

布局:

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:gravity="center_vertical"
    android:textAppearance="@style/listViewItemText"
    android:checkMark="?android:attr/listChoiceIndicatorMultiple"
    android:paddingLeft="6dp"
    android:paddingRight="6dp"
/>
编辑:

在找到更好的解决方案之前,我在活动中执行了检查:

...
int len = mListView.getCount();
for (int i = 0; i < len; i++) {
    if (((MultiChoiceItem) mListView.getItemAtPosition(i)).selected) {
        mListView.setItemChecked(i, true);
    }
}
...
。。。
int len=mListView.getCount();
对于(int i=0;i
我原以为性能是唯一的潜在问题,但我发现了另一个问题——更严重。列表已启用文本筛选器(mListView.setTextFilterEnabled(true))。以下是失败场景:

  • 我正在打开新的列表
  • 我在查第二项
  • 我开始键入以筛选某些项目
  • 过滤完成后,即使第二项不是我所检查的,它仍然会被检查
  • 我假设setItemChecked()在选中的列表上标记了一个固定的位置,而我需要一些东西来标记保留在该位置上的项目-即使列表上的位置发生变化也保持状态

    虽然性能问题可能(在某种程度上)被忽略,但这个新问题确实阻碍了我,因此我非常感谢您的帮助。

    查看步骤 首先在xml项中进行更改 “在中添加单行”复选框

    `android:onClick="chatWithFriend"` 
    
    所以当点击复选框时 然后在活动名称中创建一个方法

      public void chatWithFriend(View view){}
    here you will get the view of check box,
    
    现在在返回convert视图之前在getView中添加行

    holder.checkbox.setTag(位置)

    现在,您将获得复选框的位置


    我希望这将对您有所帮助。

    如果您使用
    ListView.CHOICE\u MODE\u MULTIPLE
    CHOICE\u MODE\u SINGLE
    调用
    getView
    后,项目的检查状态将被ListView覆盖。您必须使用以下构造:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
       ((ListView)parent).setItemChecked(position, true);
    }
    

    另一种可能是使用
    列表视图。选择\u MODE\u NONE
    并自己管理检查状态。

    可能我没有说清楚。我在获取物品位置方面没有任何问题。所有“点击”动作都可以正常工作。不起作用的是在新创建的列表视图上检查所选项目(此信息在传递给适配器的数据中)。这可能会有所帮助。很抱歉,我看不出这对我有什么帮助:(我也面临同样的问题。滚动列表视图时,我的选中项会消失。我在适配器中尝试了你的代码块,但滚动列表视图时,我的选中项仍会消失。谢谢,我花了很长时间才找到解决方案。
      public void chatWithFriend(View view){}
    here you will get the view of check box,
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
       ((ListView)parent).setItemChecked(position, true);
    }