如何检索名称 |列表视图中多个选中项目的值对?
How to Retrieve Name | Value pair in Listview for Multiple Checked Items?
我的列表视图工作正常并填充了光标中的所有项目。
我需要在列表视图中分配获取分配名称的 ID。
我对列表视图中的 select 项使用多个复选框。
如何从列表视图中获取 selected 项的名称|值对?
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);
}
}
查看您的代码,我将创建一个包含您的姓名和 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[]
个 ID,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;
}
}
这是一个适配器class我用的很多,你只要传入一个列表,你可以通过id和position来访问它。并且不允许重复的对象。它采用泛型,因此您可以将其用于许多不同的对象。
这将要求您覆盖两个方法:
getObjectId()
对象 ID 将用作构建地图的 id/key。
getObjectString()
objectString 是你想要在列表视图中显示的字符串
默认情况下,这将使用 android.R.layout.simple_list_item_1
作为其布局。显然,您可以更改它,或者更好的是,构建一个子 class 并覆盖 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);
要获取键|值对,您可以按位置获取它:
Map.Entry<String, Sport> entry = mappedAdapter.getEntry(positon);
String key = entry.getKey();
Sport sport = entry.getValue();
如果您需要任何说明,请告诉我。乐于助人。
我的列表视图工作正常并填充了光标中的所有项目。 我需要在列表视图中分配获取分配名称的 ID。 我对列表视图中的 select 项使用多个复选框。 如何从列表视图中获取 selected 项的名称|值对?
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);
}
}
查看您的代码,我将创建一个包含您的姓名和 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[]
个 ID,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;
}
}
这是一个适配器class我用的很多,你只要传入一个列表,你可以通过id和position来访问它。并且不允许重复的对象。它采用泛型,因此您可以将其用于许多不同的对象。
这将要求您覆盖两个方法:
getObjectId()
对象 ID 将用作构建地图的 id/key。getObjectString()
objectString 是你想要在列表视图中显示的字符串
默认情况下,这将使用 android.R.layout.simple_list_item_1
作为其布局。显然,您可以更改它,或者更好的是,构建一个子 class 并覆盖 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);
要获取键|值对,您可以按位置获取它:
Map.Entry<String, Sport> entry = mappedAdapter.getEntry(positon);
String key = entry.getKey();
Sport sport = entry.getValue();
如果您需要任何说明,请告诉我。乐于助人。