如何在android的listview中获取项目的视图?
Posted
技术标签:
【中文标题】如何在android的listview中获取项目的视图?【英文标题】:How to get view for an item in listview in android? 【发布时间】:2012-01-31 08:56:57 【问题描述】:是否可以根据其在适配器中的位置而不是在 ListView 的可见视图中获取项目视图?
我知道诸如 getChildAt() 和 getItemIdAtPosition() 之类的函数,但是它们根据 ListView 中的可见视图提供信息。我也知道 android 会回收视图,这意味着我只能使用 ListView 中的可见视图。
我的目标是为每个项目设置一个通用标识符,因为我使用的是 CursorAdapter,因此我不必计算项目相对于可见项目的位置。
【问题讨论】:
【参考方案1】:这就是我如何做到这一点的。在我的(自定义)适配器类中:
@Override
public View getView(int position, View convertView, ViewGroup parent)
View view = null;
if (convertView == null)
LayoutInflater inflater = context.getLayoutInflater();
view = inflater.inflate(textViewResourceId, parent, false);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.name = (TextView) view.findViewById(R.id.name);
viewHolder.button = (ImageButton) view.findViewById(R.id.button);
viewHolder.button.setOnClickListener
(new View.OnClickListener()
@Override
public void onClick(View view)
int position = (int) viewHolder.button.getTag();
Log.d(TAG, "Position is: " +position);
);
view.setTag(viewHolder);
viewHolder.button.setTag(items.get(position));
else
view = convertView;
((ViewHolder) view.getTag()).button.setTag(items.get(position));
ViewHolder holder = (ViewHolder) view.getTag();
return view;
本质上,诀窍是通过setTag
和getTag
方法设置和检索位置索引。 items
变量是指包含我的自定义(适配器)对象的 ArrayList
。
另请参阅this 教程以获取深入示例。如果您需要我澄清任何事情,请告诉我。
【讨论】:
我想到了这种方法。在 CursorAdapter bindView 替换 getView 中,我尝试使用以下代码为每个视图设置一个标签:id.setText(cursor.getString(cursor.getColumnIndexOrThrow("id")));但是,由于某种原因,id 是每隔一个数字而不是连续的。无论如何,我会根据您提供的示例来审核我的代码。【参考方案2】:见以下代码:
public static class ViewHolder
public TextView nm;
public TextView tnm;
public TextView tr;
public TextView re;
public TextView membercount;
public TextView membernm;
public TextView email;
public TextView phone;
public ImageView ii;
class ImageAdapter extends ArrayAdapter<CoordinatorData>
private ArrayList<CoordinatorData> items;
public FoodDriveImageLoader imageLoader;
public ImageAdapter(Context context, int textViewResourceId,ArrayList<CoordinatorData> items)
super(context, textViewResourceId, items);
this.items = items;
public View getView(int position, View convertView, ViewGroup parent)
View v = convertView;
ViewHolder holder = null;
if (v == null)
try
holder=new ViewHolder();
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader = new FoodDriveImageLoader(FoodDriveModule.this);
v = vi.inflate(R.layout.virtual_food_drive_row, null);
//System.out.println("layout is null.......");
holder.nm = (TextView) v.findViewById(R.id.name);
holder.tnm = (TextView) v.findViewById(R.id.teamname);
holder.tr = (TextView) v.findViewById(R.id.target);
holder.re = (TextView) v.findViewById(R.id.received);
holder.membercount = new TextView(FoodDriveModule.this);
holder.membernm = new TextView(FoodDriveModule.this);
holder.email = new TextView(FoodDriveModule.this);
holder.phone = new TextView(FoodDriveModule.this);
holder.ii = (ImageView) v.findViewById(R.id.icon);
v.setTag(holder);
catch(Exception e)
System.out.println("Excption Caught"+e);
else
holder=(ViewHolder)v.getTag();
CoordinatorData co = items.get(position);
holder.nm.setText(co.getName());
holder.tnm.setText(co.getTeamName());
holder.tr.setText(co.getTarget());
holder.re.setText(co.getReceived());
holder.ii.setTag(co.getImage());
imageLoader.DisplayImage(co.getImage(), FoodDriveModule.this , holder.ii);
if (co != null)
return v;
【讨论】:
【参考方案3】:更好的选择是使用 CursorAdapter 返回的数据而不是可见视图来识别。 例如,如果您的数据在 Array 中,则每个数据项都有一个唯一索引。
【讨论】:
有什么特别的功能可以使用吗?我阅读了 CursorAdapter 函数的完整列表,但除了不建议在外部使用的 getView() 之外,它们似乎都没有基于 id 获取视图。 您用来填充列表的数据结构是什么? 我通过 CursorAdapter 从 Sqlite 数据库中填充列表 我最终使用了 getFirstVisiblePosition()。显然,它返回相对于整个列表的项目 ID,而不仅仅是可见视图。然后我根据此计算我想要的项目的位置。谢谢。【参考方案4】:这里,它描述的代码非常简短,你可以简单地重用视图模式来提高列表视图的性能 在您的 getview() 方法中编写以下代码
ViewHolder holder = new ViewHolder();
if (convertView == null)
convertView = layoutInflater.inflate(R.layout.skateparklist, null);
holder = new ViewHolder();
holder.headlineView = (TextView) convertView
.findViewById(R.id.textView1);
holder.DistanceView = (TextView) convertView
.findViewById(R.id.textView2);
holder.imgview = (NetworkImageView) convertView
.findViewById(R.id.imgSkatepark);
convertView.setTag(holder); //PLEASE PASS HOLDER AS OBJECT PARAM , CAUSE YOU CAN NOY PASS POSITION IT WILL BE CONFLICT Holder and Integer can not cast
//BECAUSE WE NEED TO REUSE CREATED HOLDER
else
holder = (ViewHolder) convertView.getTag();
// your controls/UI setup
holder.DistanceView.setText(strDistance);
......
return convertview
【讨论】:
【参考方案5】:Listview lv = (ListView) findViewById(R.id.previewlist);
final BaseAdapter adapter = new PreviewAdapter(this, name, age);
confirm.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
// TODO Auto-generated method stub
View view = null;
String value;
for (int i = 0; i < adapter.getCount(); i++)
view = adapter.getView(i, view, lv);
Textview et = (TextView) view.findViewById(R.id.passfare);
value=et.getText().toString();
Toast.makeText(getApplicationContext(), value,
Toast.LENGTH_SHORT).show();
);
【讨论】:
以上是关于如何在android的listview中获取项目的视图?的主要内容,如果未能解决你的问题,请参考以下文章