如何检索名称 | 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<T>
用于您的数据,还有一个映射 <String, T>
。这样做可以为您的列表提供一些不错的功能,例如按 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中多个选中项目的值对?的主要内容,如果未能解决你的问题,请参考以下文章