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
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
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 –