【问题标题】:Way to check CheckedTextView via Adapter as ListView gets populated填充 ListView 时通过适配器检查 CheckedTextView 的方法
【发布时间】:2011-03-09 06:22:19
【问题描述】:

我有一个扩展 ListActivity 的类,并包含一个 ListView,它通过对象的 ArrayList 和我创建的自定义适配器填充,该适配器是 ArrayAdapter 的子类。

我想要对象的一个​​字段来引用是否应该选中或取消选中对象行。

然后,当 ListView 被填充时,一些行将被预先选择(选中)

我已经覆盖了 ArrayAdapter.getView() 以便我可以通过一个对象来填充我的布局。

我以为我会在这里设置要检查或不检查的行 - 但我无法提出解决方案 - 有什么想法吗?

这是我的 getView() 代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = vi.inflate(R.layout.contactedit_onerow, null);
    }

    ContactVO mObject = items.get(position);
    if (mObject != null) {
        CheckedTextView nameV = (CheckedTextView) convertView.findViewById(R.id.rowText1);
        TextView phoneV = (TextView) convertView.findViewById(R.id.rowText2);
        TextView emailV = (TextView) convertView.findViewById(R.id.rowText3);
        TextView headerV = (TextView) convertView.findViewById(R.id.alphaHeader);

        if (alphaIndexer.get(mObject.name.substring(0, 1).toUpperCase()) == position ) {
            headerV.setText(mObject.name.substring(0,1));
            headerV.setVisibility(View.VISIBLE);
        } else {
            headerV.setText("");
            headerV.setVisibility(View.GONE);
        }

        nameV.setText(mObject.name);
        phoneV.setText("Phone: " + mObject.phone);
        emailV.setText("Email: " + (mObject.email != null ? mObject.email : ""));

                    // THE FOLLOWING LINE UNCOMMENTED DOES NOTHING 
                    // (any suggestions to make it work)
                    // nameV.setChecked(true);
    }

    return convertView;
}

提前致谢!

【问题讨论】:

  • 我仍然很好奇是否有一种方法可以预先选择(检查)我的 ListView 中的项目,而无需重新遍历数据源(请参阅下面的自我建议的解决方案) - 提前感谢任何人都有任何指针!

标签: android


【解决方案1】:

我仍然不知道如何预选项目因为 ListView 正在被适配器填充,因此避免了以后必须遍历 ArrayList 数据源。

但是,这里有一个解决方案,它应该与由对象 ArrayList 支持的 ListView 一起使用:

// In an activity that extends ListActivity
// With a CustomAdapter that extends ArrayAdpater
ArrayList arrayList = createArrayListOfObjectsForListView();
CustomAdapter mAdapter = new CustomAdapter(this, R.layout.mLayout, arrayList);
setListAdapter(mAdapter);

// Iterate over arrayList to check if item/row should be pre selected in the ListView
int j = 0;
for (Object item : arrayList) {
    // Check a field/condition in the object
    if (item.selected == true) {
        listView.setItemChecked(j,true);
    }
    j++;
}

另外,我亲自检查我的对象的 id 是否与一组选定的 id 匹配,所以我的 for 循环看起来像这样:

int j = 0;  
for (Object item : arrayList) {
    if (mySet.contains(item.id)) {
        listView.setItemChecked(j, true);
    }
    j++;
}

【讨论】:

    【解决方案2】:

    我在项目中对 SimpleCursorAdapter 所做的是临时设置一个 SimpleCursorAdapter.ViewBinder。当列表项在屏幕上可见时,将调用 ViewBinder.setViewValue(...) 方法。进行预选并自行删除。

        final SimpleCursorAdapter sca = new SimpleCursorAdapter(this, layout, c, from, to);
        mProjectListView.setAdapter(sca);
    
        // Add temporary ViewBinder for pre-selected ListView item
        // i.e. the current project should be selected
        final ViewBinder viewBinder = new ViewBinder() {
            @Override
            public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
                String text = cursor.getString(columnIndex);
                String currentProject = mPreferences.getString(PREF_NAME, sDefName);
                if (currentProject.equals(text)) {
                    mProjectListView.setItemChecked(cursor.getPosition(), true);
                    // Remove itself
                    sca.setViewBinder(null);
                }
                // Let CursorAdapter handle the binding, so return false
                return false;
            }
        };
        sca.setViewBinder(viewBinder);
    

    不幸的是 ArrayAdapter 没有这个监听器。所以我重写了 ArrayAdapter.getItem(int position) 并引入了 OnGetItemListener 接口。

    public class CustomArrayAdapter<T> extends ArrayAdapter<T> {
    
        public static interface OnGetItemListener<T> {
            void onGetItem(int position, T item);
        }
    
        private OnGetItemListener<T> mGetItem = mNullGetItem;
    
        public void setOnGetItemListener(OnGetItemListener<T> listener) {
            if (listener != null) {
                mGetItem = listener;
            } else {
                mGetItem = mNullGetItem;
            }
        }
    
        @Override
        public T getItem(int position) {
            T item = super.getItem(position);
            mGetItem.onGetItem(position, item);
            return item;
        }
    }
    

    使用 CustomArrayAdapter:

        caa.setOnGetItemListener(new CustomArrayAdapter.OnGetItemListener<String>() {
            @Override
            public void onGetItem(int position, String item) {
                if (item.equals(<is it your item?>)) {
                    mProjectListView.setItemChecked(position, true);
                    caa.setOnGetItemListener(null);
                }
            }
        });
    

    【讨论】:

      【解决方案3】:

      嗨,朋友们终于成功了.. 给你

      我刚刚有一个带有 ImageView、textview 和 CheckedTextView 的 ListView。我正在设备中显示已安装的应用程序。

      在我的 Listview 活动中

      @Override
      public void onItemClick(AdapterView<?> parent, View view, int position,
              long id) {
      
          /*Your Code */
      
          myAdapter.setPosition(position);
      
          myAdapter.notifyDataSetChanged();
      
      }
      

      在您的列表适配器类中

       @Override
      public View getView(final int position, View convertView, ViewGroup parent) {
      
                   holder.ctv = (CheckedTextView) convertView
                      .findViewById(android.R.id.text1);
      
          /*Your Code */
      
          if(selectedPos == position){
              holder.ctv.setChecked(true);
          }else{
              holder.ctv.setChecked(false);
          }
      
            return convertView;
      }
      

      这应该可以正常工作。经过长时间的尝试,它对我来说工作正常。我已经提到了快捷方式中的所有内容。如果有人需要进一步的帮助,请告诉我。

      对于 Single TextView,我们这样做会更容易 ---

       ArrayAdapter<String> lAdapter = new ArrayAdapter<String>(this,
                  R.layout.mylayout, android.R.id.text1, String array[]);
      

      还有一个班级

       public class CheckedLinearLayout extends LinearLayout/RelativeLayout     
       implements Checkable { //Class body with its methods }
      

      但是对于自定义适配器,我找到了我刚才提到的方式......

      【讨论】:

        猜你喜欢
        • 2013-09-10
        • 1970-01-01
        • 2015-11-22
        • 2014-07-23
        • 2018-02-10
        • 2016-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多