2014-09-27 48 views
0

我需要一點幫助:我有一個帶有自定義列表項目和視圖持有者的列表視圖。我複製的代碼表示我正在使用的適配器,但是是一個更簡單的版本。爲了簡單起見,可以說我在每個ListView項目中都有一個ImageView和一個LinearLayout。我想對每個應該執行以下操作的項目應用setOnClickListener:在另一個項目中更改LinearLayout的可見性,以便在另一個位置(例如總是第五個項目)中更改。顯然,如果我撥打holder.rl.setvisibility(..),它會改變相同位置的可視性。我想我可以以某種方式參考我需要改變的項目,但我不確定。你們怎麼能這樣做?使用ViewHolder引用ListView中的另一個項目

public class ImageAdapter extends BaseAdapter { 


    private Context mContext; 

    public ImageAdapter(Context mContext) { 
     this.mContext = mContext; 
    } 
    @Override 
    public int getCount() { 
     return bImageList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     View view = convertView; 
     if (view == null) { 
      view = getActivity().getLayoutInflater().inflate(R.layout.discover_item_layout_my, parent, false); 
      holder = new ViewHolder(); 
      assert view != null; 

      holder.itemImage = (ImageView) view.findViewById(R.id.main_discover_listitem_itemimage); 
      holder.ll = (LinearLayout) view.findViewById(R.id.anim_rl); 

      view.setTag(holder); 
     } else { 
      holder = (ViewHolder) view.getTag(); 
     } 

     holder.ll.setVisibility(View.VISIBLE); 

     holder.itemImage.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        //need to set holder.ll visibility to GONE but in another position 
       } 
      }); 

      return view; 
     } 

     class ViewHolder { 
      ImageView itemImage; 
      LinearLayout ll; 
     } 
    } 

謝謝各位!

+0

只是在adapaetr constacrter中有一個true/false的數組,當你點擊更新的適配器 – 2014-09-27 12:40:06

+0

它是好的,但是我怎樣才能改變例如第五項的佈局? – 2014-09-27 13:01:48

+0

if(position == 5){}比做點事 – 2014-09-27 13:04:32

回答

1

我附上了一些代碼,詳細說明要做什麼。它不在我的頭頂,所以可能需要稍微調整才能編譯。希望它會得到重點。

只需創建一個跟蹤第5個位置的可見性狀態的全局字段。

private int mFifthVisibility = View.VISIBLE; //Starting value. 

然後在onClickListener只需撥動這個變量,並調用notifyDataSetChanged()

holder.itemImage.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     mFifthVisibility = View.GONE; //Or Invisible 
     notifyDataSetChanged(); 
    } 
}); 

最後,在getView()方法,更新您的視圖的知名度,像這樣:

holder.ll.setVisibility((position == 5) ? mFifthVisibility : View.VISIBLE); 

側面說明,除非你是專門做這件事的原因,你的getItem()方法應該返回一個值。不爲null。這可以避免任何其他使用你的代碼的程序員混淆。

+0

對我感到羞恥。好一個!我確實把notifyDataSetChanged放在了某個地方不對的地方。謝謝Jay Soyer! – 2014-09-27 22:24:53

+0

還有一件事:notifyDataSetChanged刷新整個列表視圖,我從數據庫中加載圖像。我怎樣才能說只有第五項應該被刷新? (所以其他人不刷新) – 2014-09-27 23:01:00

+0

你不能...輕鬆。解決方法是在某種WeakReferenced地圖中按位置跟蹤和存儲每個生成的視圖。這很棘手,你會發現各種邊緣情況下,它會失敗。此外,這個想法與適配器的設計和打算如何使用有關。 'NotifyDataSetChange',只會刷新可見的位置......不是所有的位置。試試緩存你的圖片。你首先嚐試拉高速緩存,然後從數據庫中拉出。 – 2014-09-27 23:19:02

相關問題