我有一个基本适配器,它可以作为类助手来设置自定义列表视图。现在一切都很好,除了如果我试图设置另一个基本适配器,listview会失去设置前我所在项目的焦点。我不知道是否有方法可以帮助我在同一项目上检索相同的焦点。事先非常感谢。
这是我的基本适配器类:
class CustomAdapterWithImages extends BaseAdapter {
LayoutInflater mInflater;
public CustomAdapterWithImages(){
mInflater = (LayoutInflater) Home.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount(){
// TODO Auto-generated method stub
return ids_list.size();//listview item count.
}
@Override
public Object getItem(int position){
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position){
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
// TODO Auto-generated method stub
ViewHolder vh;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.layout_row, null);
vh = new ViewHolder();
convertView.setTag(vh);
}else{
vh = (ViewHolder) convertView.getTag();
}
TextView book = (TextView) convertView.findViewById(R.id.listViewBookName);
TextView writer = (TextView) convertView.findViewById(R.id.listViewWriterName);
ImageView image = (ImageView) convertView.findViewById(R.id.listViewImage);
try{
book.setText(names_list.get(position));
writer.setText(writers_list.get(position));
image.setImageBitmap(thumbnails_list.get(position));
}catch(IndexOutOfBoundsException e){
e.printStackTrace();
}
return convertView;
}
class ViewHolder{
TextView book, writer;
ImageView image;
}
}
通过调用基本适配器类,我可以设置如下所示的列表视图:
listview.setAdapter(new CustomAdapterWithImages());
用listView附加项目点击监听器并保存最后选择的位置。设置基座适配器后,设置适当的选定位置/项目。
//set the selected item according after changing anther base adapter
listview.setSelection(appropriatePosition)
//To find last selected item position
listview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
lastSlectedPosition = position;
//or get reference to unique item in your list from the position if you are changing the dataset also.
}
}
更换适配器后,是否要将同一项标记为选中/聚焦?如果是,您可以将所选项目的位置传递给新适配器,并在getView(…)中对其进行评估。列表中的项目应具有onClickListeners以设置所选位置的索引。这至少是我能想象的一种方式,当我做对了,你可以做你想做的事。
如果您想更新您的列表,因为适配器中的一些数据发生了更改,您可以只调用yourAdapter.notifyDataSetChanged()而不是创建一个新的适配器。
首先,我建议您将BaseAdapter更改为ArrayAdapter。我不知道是否可以向BaseAdapter添加项,但根据APIhttp://developer.android.com/reference/android/widget/BaseAdapter.html没有这样的方法。ArrayAdapter允许您通过调用方法add()和addAll()对象放入适配器中。在这些方法中,您可以放置单个或全部图像,完成后只需调用notifyDataSetChanged(),您的列表就会自动更新。
您可以像Ashish Bindal那样实现onItemClickListener。将其附加到您的列表中,例如在您为列表设置适配器的位置。position参数是侦听器附加到的项的索引,这就是您可能要查找的内容。每次单击项目时,都必须将其位置存储在onItemClickListener之外的某个位置。
在自定义适配器中,添加一个新字段(例如private int selectedItemPosition;)和一个setter方法来设置此字段。在getView()中,您必须检查position参数的值是否等于字段selectedItemPosition的值。如果是,convertView是您可以关注的项目。
在调用notifyDataSetChanged()之前,必须使用setter方法设置所选项在适配器中的位置。
但是 只有在项目顺序不变且项目不会丢失的情况下,这才有效。
你真正需要的是可以用来唯一区分物品的东西。setOnItemClickListener()的参数之一是ArrayAdapter。您可以通过调用arrayAdapters方法getItemAtPosition(position)来访问附加到单击的列表项的对象。如果你的对象有一个唯一的属性,例如ID,那就太好了。如果没有,您可以将其包装在自定义对象中,例如ID或其他唯一属性。因此,您可以获取唯一属性并将其传递给适配器,而不是侦听器中的位置。
祝你好运。