2013-12-11 68 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. 
    } 
}