2

我有一個RecyclerView,我想將數據傳遞到RecyclerView.AdapterViewHolder的構造函數onCreateViewHolder(ViewGroup parent, int viewType)Android的 - 將數據傳遞到ViewHolder構造函數onCreateViewHolder(..)

我希望做的是傳遞一個參數(該數據項本身)的ViewHolder的構造函數,這樣我就不必每次檢索該項目被點擊一次。

然而,當我嘗試檢索onCreateViewHolder(ViewGroup中的父母,INT ViewType)的位置,我沒有得到該行,viewType它總是返回0

我不想使用RecyclerView的絕對位置.onItemTouchListener()。

我現在明白了,我可以用

@Override 
    public int getItemViewType(int position) { 
     return super.getItemViewType(position); 
    } 

可返回列表中的每一項獨特的位置。但是,接下來我必須編寫冗長的開關梯級來處理數據結構中的每一個單調乏味的項目。

我可以使用onCreateViewHolder(...)以整型參數返回絕對位置的方式(以便我可以使用該位置將數據傳遞給ViewHolder的構造函數),而無需在開關塊中單獨處理每個項目?

這裏是我的適配器:

public class Adapter extends RecyclerView.Adapter<Adapter.DataViewHolder> { 

    ArrayList<String> mContinentList; 
    ClickListener mListener; 

    public interface ClickListener{ 

     void onContinentClicked(String continent); 
    } 

    public class DataViewHolder extends RecyclerView.ViewHolder{ 

     TextView mDataItemTextView; 
     String mContinent; 

     public DataViewHolder(View itemView,String continent) { 
      super(itemView); 

      mDataItemTextView = (TextView) itemView.findViewById(R.id.data_text_view); 
      mContinent = continent; 
      Log.v("continent",mContinent); 
      mDataItemTextView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        mListener.onContinentClicked(mContinent); 
       } 
      }); 

     } 
    } 

    public Adapter(Context context, ArrayList<String> continentList){ 

     this.mContinentList = continentList; 
     this.mListener = (ClickListener) context; 
    } 

    @Override 
    public DataViewHolder onCreateViewHolder(ViewGroup parent, int position) { 

     Log.v("position", Integer.toString(position)); 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.data_item_view, parent, false); 
     return new DataViewHolder(view,mContinentList.get(position)); 
    } 

    @Override 
    public void onBindViewHolder(DataViewHolder holder, int position) { 

     holder.mDataItemTextView.setText(mContinentList.get(position)); 
    } 

    @Override 
    public int getItemCount() { 
     return mContinentList.size(); 
    } 
} 

,這裏是我的活動:

public class MainActivity extends AppCompatActivity implements Adapter.ClickListener{ 


    RecyclerView mRecyclerView; 
    Adapter mAdapter; 
    ArrayList<String> mDataList; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     initData(); 

     mRecyclerView = (RecyclerView)findViewById(R.id.recycler_view); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     mAdapter = new Adapter(this,mDataList); 
     mRecyclerView.setAdapter(mAdapter); 
    } 

    private void initData(){ 

     mDataList = new ArrayList<>(); 
     mDataList.add("Africa"); 
     mDataList.add("Antartica"); 
     mDataList.add("Asia"); 
     mDataList.add("Australia"); 
     mDataList.add("Europe"); 
     mDataList.add("North America"); 
     mDataList.add("South America"); 
    } 

    @Override 
    public void onContinentClicked(String continent) { 
     Log.v("continent",continent); 
    } 
} 

這裏是我的日誌:

07-14 15:53:59.271 2987-2987/com.android.test V/position: 0 
07-14 15:53:59.309 2987-2987/com.android.test V/continent: Africa 
07-14 15:53:59.312 2987-2987/com.android.test V/position: 0 
07-14 15:53:59.312 2987-2987/com.android.test V/continent: Africa 
07-14 15:53:59.315 2987-2987/com.android.test V/position: 0 
07-14 15:53:59.316 2987-2987/com.android.test V/continent: Africa 
07-14 15:53:59.316 2987-2987/com.android.test V/position: 0 
07-14 15:53:59.316 2987-2987/com.android.test V/continent: Africa 
07-14 15:53:59.316 2987-2987/com.android.test V/position: 0 
07-14 15:53:59.316 2987-2987/com.android.test V/continent: Africa 
07-14 15:53:59.317 2987-2987/com.android.test V/position: 0 
07-14 15:53:59.317 2987-2987/com.android.test V/continent: Africa 
07-14 15:53:59.317 2987-2987/com.android.test V/position: 0 
07-14 15:53:59.317 2987-2987/com.android.test V/continent: Africa 

回答

0

你不必寫長篇開關塊,除非你想爲每個項目的不同視圖。 getItemViewType通過絕對位置,就像onBindViewHolder一樣,所以只需返回從getItemViewHolder獲得的位置,並直接在onCreateViewHolder中使用它,即viewType將包含實際位置。

通過遺憾的答案結構的方式,我從手機瀏覽器回答;)

+0

感謝這個,如果我需要添加在我的列表中的頁眉和頁腳和ViewHolder每個頁眉,頁腳什麼和數據項? – user1841702

+0

在這種情況下可以使用一個開關在onCreateViewHolder來檢查位置是0或yourData.size()-1。然後在箱子上膨脹一個頭部基座。這意味着您的第一個和最後一個項目將分別代表頁眉和頁腳 –