是否有可能根据它在适配器中的位置而不是ListView中的可见视图获取项目视图?如何在android中的listview中获取项目的视图?
我知道类似于getChildAt()和getItemIdAtPosition(功能),但是它们提供了基于内部的ListView可见视图的信息。我也意识到Android会回收视图,这意味着我只能使用ListView中的可见视图。
我的目标是让每个项目通用识别符,因为我使用的CursorAdapter所以我没有位置相对该项目的计算,以可见的项目。
是否有可能根据它在适配器中的位置而不是ListView中的可见视图获取项目视图?如何在android中的listview中获取项目的视图?
我知道类似于getChildAt()和getItemIdAtPosition(功能),但是它们提供了基于内部的ListView可见视图的信息。我也意识到Android会回收视图,这意味着我只能使用ListView中的可见视图。
我的目标是让每个项目通用识别符,因为我使用的CursorAdapter所以我没有位置相对该项目的计算,以可见的项目。
更好的选择是使用由CursorAdapter的,而不是可见视图返回的数据来确定。 例如,如果您的数据位于数组中,则每个数据项都有唯一的索引。
以下是我做到了这一点。在我的(自定义)的适配器类:
@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”)));然而,由于某种原因,身份证号码是每隔一个数字而不是连续的。无论如何,我会根据您提供的示例查看我的代码。 – 2012-01-01 14:40:45
也许它可以对你有所帮助。 看下面的代码:
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;
}
}
享受。 谢谢。
在这里,它非常短描述的代码,你可以简单的再利用viewholder模式来增加列表视图性能 在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
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();
}
}
});
有什么特别的功能,我可以使用?我读了CursorAdapter函数的完整列表,但似乎没有一个getView()的视图基于id,不建议在外部使用。 – 2012-01-01 14:31:25
你用来填充列表的数据结构是什么? – 2012-01-01 17:16:26
我通过CursorAdapter从Sqlite数据库填充列表 – 2012-01-01 22:30:43