如何检索名称 | Listview中多个选中项目的值对?

Posted

技术标签:

【中文标题】如何检索名称 | Listview中多个选中项目的值对?【英文标题】:How to Retrieve Name | Value pair in Listview for Multiple Checked Items? 【发布时间】:2015-03-30 08:24:11 【问题描述】:

我的列表视图工作正常并从光标填充所有项目。 我需要在列表视图中分配获取分配名称的 id。 我正在使用多个复选框从列表视图中选择项目。 如何从列表视图中获取选定项目的名称|值对?。

   ListView listView;
    ArrayAdapter<String> adapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    
        try
        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.servicelist_item);

        //String[] sports ;


        //get jobtype 
        Cursor cur=dbHelper.fetchByJobNumber(stringJobnumber);
        String cur_type;
        cur_type=cur.getString(18);

        //passing jobtype to fetch service items through cursor
        Cursor cursor=dbHelper.fetchItemsByType(cur_type);
        ArrayList<String> sports=new ArrayList<String>();
        if (cursor.moveToFirst()) 
        
           do 
           
               //assigning cursor items to arraylist variable sports
              /* assigning item name to list view*/
              /*My cursor holds name value pair */
               sports.add(cursor.getString(3)); 
            
           while (cursor.moveToNext());
        



        //setting array adapter to populate listView
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice, sports);
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        listView.setAdapter(adapter);

        button.setOnClickListener(this);
    
    catch(Exception e)
    
        System.out.println(e);
    

   

//点击方法

 public void onClick(View v) 
    
        SparseBooleanArray checked = listView.getCheckedItemPositions();
        ArrayList<String> selectedItems = new ArrayList<String>();
        for (int i = 0; i < checked.size(); i++) 
        
            // Item position in adapter
            int position = checked.keyAt(i);
            // Add sport if it is checked i.e.) == TRUE!
            if (checked.valueAt(i))
                selectedItems.add(adapter.getItem(position));
        

        final String[] outputStrArr = new String[selectedItems.size()];
        Log.e("selectedItems.size()====>>", ""+selectedItems.size());
        for (int i = 0; i < selectedItems.size(); i++) 
        
            Log.e("selectedItems====>>", ""+selectedItems.get(i));
            outputStrArr[i] = selectedItems.get(i);
         
    

【问题讨论】:

【参考方案1】:

查看您的代码,我将创建一个包含您的姓名和 ID 的对象:

public class Sport 
     private String id;
     private String name;
     public Sport(String id, String name)
        this.id = id;
        this.name = name;
     

     public String getId()
         return id;
     

     public String getName()
         return name;
      

我经常需要这个功能,所以我创建了一个自定义适配器,它有一个 String[] 的 ids,List&lt;T&gt; 用于您的数据,还有一个映射 &lt;String, T&gt;。这样做可以为您的列表提供一些不错的功能,例如按 id 和位置访问。如果此适配器将维护 3 个数据实例,我建议仅将其用于相对较小(小于 100)的列表。

这是我喜欢使用的适配器:

public abstract class MappedAdapter<T> extends BaseAdapter

    private Context mContext;
    private Map<String, T> mMap;
    private ArrayList<String> mIdList;

    public MappedAdapter(Context context, ArrayList<T> arrayList) 
        this.mContext = context;
        mMap = new HashMap<>();
        mIdList = new ArrayList<>();
        for (T object : arrayList) 
            add(object);
        
    

    public MappedAdapter(Context context, T[] arrayList)
        this.mContext = context;
        mMap = new HashMap<>();
        mIdList = new ArrayList<>();
        for (T object : arrayList) 
            add(object);
        
    

    public abstract String getObjectId(T object);

    public abstract String getObjectString(T object);

    public T getObject(int position) 
        return mMap.get(mIdList.get(position));
    

    public String getObjectId(int position)
        return mIdList.get(position);
    

    public boolean add(T object) 
        final String id = getObjectId(object);
        if(!mMap.containsKey(id))
            mIdList.add(id);
            mMap.put(id, object);
            this.notifyDataSetChanged();
            return true;
        
        return false;
    

    public void remove(T object)
        final String id = getObjectId(object);
        mIdList.remove(id);
        mMap.remove(id);
        this.notifyDataSetChanged();
    

     @SuppressWarnings("unchecked")
    public Map.Entry<String, T> getEntry(int position)
         HashMap<String, T> entry = new HashMap<>();
         String key = mIdList.get(position);
         entry.put(key, mMap.get(key));
         return (Map.Entry<String, T>) entry;
     

    @Override
    public int getCount() 
        return mMap.size();
    

    @Override
    public Object getItem(int position) 
        return mMap.get(mIdList.get(position));
    

    @Override
    public long getItemId(int position) 
        return position;
    

    @Override
    public View getView(int position, View view, ViewGroup parent) 
        T object = mMap.get(mIdList.get(position));
        if (view == null) 
            int layoutResource = android.R.layout.simple_list_item_1;
            view = LayoutInflater.from(mContext).inflate(layoutResource, null);
        
        TextView tv = (TextView) view.findViewById(android.R.id.text1);
        tv.setText(getObjectString(object));
        return view;
    

这是一个我经常使用的适配器类,你只需传入一个列表,你可以通过 id 和 position 来访问它。并且不允许重复的对象。它需要一个泛型,因此您可以将其用于许多不同的对象。

这将要求您覆盖两个方法:

    getObjectId() Object id 将用作构建地图的 id/key。 getObjectString() objectString 是你想在列表视图中显示的字符串

默认情况下,这将使用android.R.layout.simple_list_item_1 进行布局。显然,您可以更改它,或者更好的是,构建一个子类并覆盖 getView()


用法:

   MappedAdapter<Sport> mappedAdapter = new MappedAdapter<Sport>(context, sports)
        @Override
        public String getObjectId(Sport object) 
            return object.getId();
        

        @Override
        public String getObjectString(Sport object) 
            return object.getName();
        
    ;

    ListView listView =  ... ;
    listView.setAdapter(mappedAdapter);

要获取您的 Key|Value 对,您可以按位置获取它:

   Map.Entry<String, Sport> entry = mappedAdapter.getEntry(positon);
   String key = entry.getKey();
   Sport sport = entry.getValue();

如果您需要任何说明,请告诉我。乐于助人。

【讨论】:

以上是关于如何检索名称 | Listview中多个选中项目的值对?的主要内容,如果未能解决你的问题,请参考以下文章

选中复选框时检查Android listview多个项目

如何将ListView选中的item编号提取出来

使用android中的自定义arrayadapter在listview中使用复选框检查后如何删除多个项目?

使用复选框从 ListView 中获取选中的项目

如何检查 ListView 项目是不是被选中

如何获取listview里选中的checkbox