2

Ich habe einen RecyclerView und ich würde gerne Daten der RecyclerView.Adapter passieren 's ViewHolder' s Konstruktor in onCreateViewHolder(ViewGroup parent, int viewType).Android - Übergabe von Daten an ViewHolder Konstruktor in onCreateViewHolder (..)

Ich möchte einen Parameter (das Datenelement selbst) an den Konstruktor des ViewHolders übergeben, damit ich ihn nicht jedes Mal abrufen muss, wenn auf das Element geklickt wird.

aber wenn ich versuche, eine Position in onCreateViewHolder (Viewgroup Eltern, int Viewtype) abzurufen, ich habe nicht die absolute Position der Reihe, die immer Viewtype 0 zurück

Ich will nicht RecyclerView verwenden .onItemTouchListener().

Ich verstehe jetzt, dass ich

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

die eindeutigen Positionen für jedes Element in der Liste zurückkehren kann. Aber ich müsste dann (lange) Schaltleitern schreiben, um jedes Element in der Datenstruktur zu handhaben, was mühsam ist.

Kann ich OnCreateViewHolder (...) so verwenden, dass der Integer-Parameter absolute Positionen zurückgibt (damit ich die Position zum Übergeben von Daten an den Konstruktor von ViewHolder verwenden kann), ohne jedes Element einzeln in einem Switch-Block behandeln zu müssen?

Hier ist mein Adapter:

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(); 
    } 
} 

und hier ist meine Aktivität:

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); 
    } 
} 

Und hier meine Protokolle sind:

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 

Antwort

0

Sie müssen lange nicht schreiben wechseln Sie den Block, sofern Sie nicht für jedes Element eine andere Ansicht wünschen. getItemViewType wird eine absolute Position wie onBindViewHolder übergeben, also geben Sie einfach die Position zurück, die Sie von getItemViewHolder erhalten haben, und verwenden Sie sie direkt in onCreateViewHolder, d. H. ViewType enthält die tatsächliche Position.

Durch die Art und Weise entschuldigen sich für die Antwort-Struktur, von einem Telefon-Browser ist zu beantworten;)

+0

Vielen Dank für das, was passiert, wenn ich brauche eine Kopf- und Fußzeile um meine Liste und eine ViewHolder jeweils für die Kopf- und Fußzeile hinzufügen und Datenelement? – user1841702

+0

In diesem Fall können Sie einen Schalter im onCreateViewHolder verwenden, um zu überprüfen, ob die Position 0 oder yourData.size() -1 ist. Dann aufblasen eine Kopfzeile auf dem Fall. Das bedeutet, dass Ihr erster und letzter Eintrag die Kopf- bzw. Fußzeile darstellt –