Hat jemand, der RecyclerView
verwendet, einen Weg gefunden, um einen onClickListener
für Elemente im RecyclerView
festzulegen? Ich dachte daran, für jedes Element einen Listener für jedes Layout festzulegen, aber das scheint etwas zu umständlich zu sein. Ich bin sicher, dass es eine Möglichkeit gibt, dass der RecyclerView
auf das onClick
-Ereignis hört, aber ich kann es nicht ganz herausfinden.
Antworten
Zu viele Anzeigen?Es gibt einen viel einfacheren Weg, dies zu tun. Wenden Sie einfach im onBindViewHolder
auf der Stammansicht einen Klick an.
Angenommen dies ist Ihre Ansicht für den Adapter,
Dann tun Sie folgendes in Ihrem Adapter
//Layout erhalten und View Holder erstellen
@Override
public RVAdapter.ViewHolder1 onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_layout, null);
ViewHolder1 viewHolder = new ViewHolder1(view);
return viewHolder;
}
@Override
public void onBindViewHolder(RVAdapter.ViewHolder1 holder, int position) {
//Klicken Sie auf Ihre Stammansicht
holder.linearlayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Klicken Sie auf die Durchführung
}
});
}
//Verweise auf Ansichten im Layout einschließlich der Stammansicht erstellen
public class ViewHolder1 extends RecyclerView.ViewHolder {
protected LinearLayout linearlayout = null
protected TextView textview = null;
public CareerLinksViewHolder(View itemView) {
super(itemView);
this.linearlayout = (LinearLayout) itemView.findViewById(R.id.linearlayout);
this.tvCompName = (TextView) itemView.findViewById(R.id.textview);
}
}
Vielleicht zu einfach und effektiv.
Anstatt das Interface View.OnClickListener
innerhalb des Ansichtshalters zu implementieren oder ein Interface zu erstellen und das Interface in Ihrer Aktivität zu implementieren - Ich habe diesen Code für eine einfache OnClickListener
-Implementierung verwendet.
public static class SimpleStringRecyclerViewAdapter
extends RecyclerView.Adapter {
// Ihre Initialisierungen gehen hier...
private List mValues;
public static class ViewHolder extends RecyclerView.ViewHolder {
//ein Variable mView erstellen
public final View mView;
/*Alle Ihre Zeilen-Widgets gehen hier
public final ImageView mImageView;
public final TextView mTextView;*/
public ViewHolder(View view) {
super(view);
//Initialisieren Sie es hier
mView = view;
/* Ihre Zeilen-Widgets-Initialisierungen gehen hier
mImageView = (ImageView) view.findViewById(R.id.avatar);
mTextView = (TextView) view.findViewById(android.R.id.text1);*/
}
}
public String getValueAt(int position) {
return mValues.get(position);
}
public SimpleStringRecyclerViewAdapter(Context context, List items) {
mBackground = mTypedValue.resourceId;
mValues = items;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
view.setBackgroundResource(mBackground);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.mBoundString = mValues.get(position);
holder.mTextView.setText(mValues.get(position));
//Hier wird einfach ein onItemClick-Listener geschrieben
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Context context = v.getContext();
Intent intent = new Intent(context, ExampleActivity.class);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return mValues.size();
}
}
Sie können einen clickListener
an den Adapter
übergeben.
In Ihrer Activity
:
private View.OnClickListener mItemClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = null;
int position = list.getChildPosition(v);
switch (position) {
case 0:
intent = new Intent(MainActivity.this, LeakCanaryActivity.class);
break;
case 1:
intent = new Intent(MainActivity.this, ButterKnifeFragmentActivity.class);
break;
}
if (intent != null) {
MainActivity.this.startActivity(intent);
}
}
};
dann übergeben Sie ihn an den Adapter
:
MainAdapter mainAdapter = new MainAdapter(this, mItemClick);
In Adapter
's onCreateViewHolder
:
@Override
public MainAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
View itemView = activity.getLayoutInflater().inflate(R.layout.main_adapter_item, viewGroup, false);
ViewHolder holder = new ViewHolder(itemView);
itemView.setOnClickListener(mItemClick);
return holder;
}
Ich habe eine leichte Bibliothek für Android entwickelt, die du auf GitHub besuchen und diesem Beispiel folgen kannst:
RecycleClick.addTo(DEIN_RECYCLE_VIEW).setOnItemClickListener(new RecycleClick.OnItemClickListener() {
@Override
public void onItemClicked(RecyclerView recyclerView, int position, View v) {
// Dein Code hier
}
});
Sie können View.OnClickListener implementieren
zu Ihrer ViewHolder
Klasse.
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public Item item;
@InjectView(R.id.tv_title)
public TextView tvTitle;
@InjectView(R.id.rl_row)
public RelativeLayout rlRow;
public ViewHolder(View v) {
super(v);
ButterKnife.inject(this, v);
v.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Log.e("item title",item.getTitle());
}
}
Und onBindViewHolder
setzen Sie das Item Ihres ViewHolders:
public void onBindViewHolder(ViewHolder holder, int position) {
holder.tvTitle.setText(objects.get(position).getTitle());
holder.item = objects.get(position);
}