2017-08-04 37 views
2

我通常使用一個接口來處理列表項的點擊一個參考,無論是顯示一條消息,或採取行動它是一個不好的做法,保持了ViewHolder內部列表項

public interface ItemClickListener { 
void onItemClicked(int adapterPosition); 
} 

@OnClick(R.id.seat_btn) 
protected void click() { 
    if (mItemClickListener != null) 
     mItemClickListener.onItemClicked(getAdapterPosition()); 
} 

然而有時它是一個更容易,有時持有的ViewHolder內的對象的引用以及與每個更新onBindViewHolder調用和處理ViewHolder內的所有行動和變革

Seat mSeat; 
@OnClick(R.id.seat_btn) 
protected void click() { 
    seatView.setText(String.value(mSeat.getCount()+1)); 
} 

所以「這算是我的問題不好的做法?「

+0

你已經有了內部ViewHolder列表項的參考。你可以使用itemView。所以你的問題不清楚。 – Bob

+0

我指的是Java對象 – atabouraya

回答

3

Yes和No.

  • 是:

沒有什麼錯有觀點倉內的數據對象。

abstract BaseHolder<T> extends ViewHolder { 
    .... constructor... 
    private T t; 

    abstract void bindView(T t); 
} 

這是一個很好的模式,隔離:我有很多是使用鹼ViewHolder與通用參數T和抽象方法的視圖綁定到數據,這樣ViewTypes之前還看過適配器視圖結合ViewHolder和適配器簡單地分配這些數據到正確的持有人。

  • 但是,沒有:

在另一方面,直接處理單擊/點擊事件那些相同的人裏面,我認爲不好的做法,因爲它不應該是ViewHolder責任這樣做。

應用導航,生成網絡呼叫或數據庫插入是應該被傳遞迴頂視圖層(活性或片段)或一些控制器,它可以正確地處理從視圖呈現分離的邏輯。

通常在這些情況下,您的將創建一個OnEventHappened接口,例如像這樣:

public interface onEventHappen { 
    void onLikeTapped(MyData data); 
} 

,並實現該接口應該傳遞到將傳遞到ViewHolder適配器類。所述ViewHolder實現基本View.OnClickListener並通過與相關聯的數據到負責處理該事件的對象的情況下。像這樣的:

MyHolder extends ViewHolder implements View.OnClickListener { 

    private final EventListener listener; 
    private MyData data; // this will be set by adapter or "bind" like explained above 

    public MyHolder(View itemView, EventListener listener) { 
     super(itemView); 
     itemView.findVieById(R.id.button).setOnClickListener(this); 
     this.listener = listener; 
    } 

    @Override public void onClick(View view) { 
     listener.onEvent(data); 
    } 
} 

我希望它有幫助。

相關問題