2013-12-11 67 views
1

我有一个基类适配器,作为类助手来设置自定义列表视图。现在一切正常,除非我尝试设置另一个基础适配器,那么在设置它之前,listview失去了它所关注的项目的焦点。我不知道是否有一种方法可以帮助我找回同一项目的同一焦点。非常感谢你提前。如何在Android中检索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());  

回答

0

你想标记相同的项目作为选择/集中更换适配器后? 如果是这样,您可以将选定项目的位置传递给您的新适配器,并在getView(...)中进行评估。 列表中的项目应具有onClickListeners以设置所选位置的索引。 这是至少有一种方式,我可以想象,当我做对了的时候,你可以做你想做的。

如果你喜欢更新您的列表,因为在你的一些数据适配器改变,你可以打电话只是 yourAdapter.notifyDataSetChanged()而不是创建一个新的。


起初我建议你将BaseAdapter改为ArrayAdapter。 我不知道是否可以添加项目到BaseAdapter,但根据API http://developer.android.com/reference/android/widget/BaseAdapter.html没有这样的方法。 ArrayAdapter允许您通过调用方法add()addAll()将对象放入适配器。 在这些方法中,您可以放置​​单个图像或全部图像,完成后您只需致电notifyDataSetChanged(),您的列表将自动更新。

你可以实现一个onItemClickListener方式阿希什Bindal一样。将其附加到您的列表中在你为你的列表设置适配器的地方。 的位置参数是侦听器所连接的项目的索引,这是您可能要查找的内容。每次点击某个项目时,您都必须将其存储在onItemClickListener以外的某个位置。

在您的自定义适配器中添加一个新字段(例如private int selectedItemPosition;)和一个setter方法来设置此字段。 在getView()您必须检查位置参数的值是否等于您的字段selectedItemPosition的值。如果是,convertView是您可以关注的项目。

在致电notifyDataSetChanged()之前,您必须使用setter方法在适配器中设置所选项目的位置。

如果该项目顺序不会改变,该项目不会缺少这只能工程。

你真正需要的是你可以用来唯一区分项目的东西。 其中一个参数setOnItemClickListener()是一个ArrayAdapter。通过调用arrayAdapters方法getItemAtPosition(position),可以访问附加到单击列表项目的对象。如果您的物件具有独特属性,例如一个ID,这很好。如果没有,你可以用例如自定义对象来包装它。一个ID或其他独特的财产。 因此,不是在听众中的位置,而是获取唯一属性并将其传递给适配器。

祝你好运。

+0

没错。我想在图片下载后更新我的适配器。但我不知道该怎么做。你能否详细解释一下更新适配器数据?谢谢你,先生。 –

0

使用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. 
    } 
}