2

私はRecyclerViewを持っていると私はonCreateViewHolder(ViewGroup parent, int viewType)RecyclerView.AdapterViewHolderのコンストラクタにデータを渡すしたいと思います。アンドロイド - onCreateViewHolderにViewHolderコンストラクタにデータを渡す(..)

私がしたいのは、パラメータ(データ項目自体)をViewHolderのコンストラクタに渡して、アイテムをクリックするたびに取得する必要がないようにすることです。私はonCreateViewHolder(のViewGroupの親、INTビュータイプ)内の位置を取得しようとすると、

はしかし、私はいつも私がRecyclerViewを使用したくない0

を返す行、ビュータイプの絶対位置を得ることはありません.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かを確認できます。次にケースにヘッダベースを展開します。これは、最初と最後の項目がそれぞれヘッダーとフッターを表すことを意味します –

関連する問題