#java #android #fragment
#java #Android #фрагмент
Вопрос:
Я пытаюсь запустить некоторый код, который я получил из какого-то онлайн-руководства по написанию фрагмента с recyclerview в нем, но я испытываю некоторые трудности при открытии действия из события onclick. Мой адаптер находится ниже
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.MyViewHolder> {
private final ArrayList<ItemModel> mArrayList;
private Context mcontext;
ItemAdapter(ArrayList<ItemModel> mArrayList) {
this.mArrayList = mArrayList;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
mcontext = parent.getContext();
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listing_item, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
//Glide.with(mcontext).load(mArrayList.get(position).getImage()).into(holder.item_image);
holder.item_name.setText(mArrayList.get(position).getTitle());
holder.item_description.setText(mArrayList.get(position).getDescription());
holder.item_tags.setText(mArrayList.get(position).getTags());
Log.d("MyAdapter", "position: " position);
}
@Override
public int getItemCount() {
return mArrayList.size();
}
class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private final ImageView item_image;
private final TextView item_name;
private final TextView item_description;
private final TextView item_tags;
private final LinearLayout cardViewLayout;
MyViewHolder(View view) {
super(view);
item_image = view.findViewById(R.id.item_image);
item_name = view.findViewById(R.id.item_name);
item_description = view.findViewById(R.id.item_description);
item_tags = view.findViewById(R.id.item_tags);
cardViewLayout = view.findViewById(R.id.cardViewLayout);
cardViewLayout.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Intent intent = new Intent(mcontext, ItemView.class);
mcontext.startActivity(intent);
}
}
}
Когда я запускаю код, ничего не происходит, когда я нажимаю на элемент, и я также не вижу никакой ошибки в logcat
Комментарии:
1. пожалуйста, попробуйте добавить код для фрагмента, где используется этот адаптер, мы посмотрим, есть ли способ решить проблему
2. Что это
ItemView
?3. Я считаю, что мы должны публиковать код, специфичный для проблемы, с которой мы сталкиваемся, из того, что находится на какой-либо странице tos здесь, на SO. На самом деле, как вы можете видеть, у меня уже есть четыре ответа, означающих, что люди имели представление о том, о чем я спрашивал. Я готов идти, приятель
Ответ №1:
Вместо этого попробуйте вот так,
ItemAdapter(Context context, ArrayList<ItemModel> mArrayList) {
this.mArrayList = mArrayList;
this.mContext = context;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listing_item, parent, false);
return new MyViewHolder(view);
}
В вашем фрагменте при настройке адаптера
ItemAdapter itemAdapter=new ItemAdapter(getActivity(),itemList);
Ответ №2:
Вы можете отправить прослушиватель из фрагмента в адаптер. Вместо того, чтобы пытаться запустить действие из адаптера, вы можете отправить его обратно во фрагмент, чтобы открыть действие.
1. Определите интерфейс
public interface MyAdapterListener {
void openActivity(/*any values to be sent*/);
}
2. Фрагмент должен реализовывать MyAdapterListener
3. отправьте объект прослушивателя адаптеру в конструкторе
ItemAdapter(ArrayList<ItemModel> mArrayList, MyAdapterListener listener) {..
mListener = listener;
}
4. На держателе представления адаптера: в onClick()
возврате к фрагменту
public void onClick(View view) {
mListener.openActivity(/*any values to be sent*/);
}
Ответ №3:
Я придерживался идеи, что в вашем приложении адаптера в каком-либо действии вы просто вызываете действие на setOnItemClickListener
адаптере
private void loadItemsData() {
RecyclerView itemsRecyclerView = view.findViewById(R.id.posts_recycler_view);
itemsRecyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
itemsRecyclerView.setLayoutManager(layoutManager);
ItemAdapter myadapter = new ItemAdapter(new ArrayList<MyItem>(), getContext());
myadapter.setOnItemClickListener(new ItemAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, PostItems items) {
ViewItem.passingIntent(getActivity(), items.postid);
}
});
itemsRecyclerView.setAdapter(ListAdapter );
}
затем, как только это будет сделано, вы переходите к действию получателя и освобождаете путь для получения переменных, передаваемых ему
public static void passingIntent(Activity activity, Integer postid){
Intent intent = new Intent(activity, ViewItem.class);
intent.putExtra(MY_ITEM, postid);
activity.startActivity(intent);
}
В последнее время я использовал этот подход в одном из своих приложений
Комментарии:
1. Что это
ListingAdapter
? ЧтоsetItemOnClickListener
такое RecyclerView??2. Я думаю, что этот ответ — это то, что я искал, потому что, несмотря на несколько ошибок в нем, он, как правило, устраняет мою проблему
Ответ №4:
Попробуйте настроить прослушиватель кликов в onBindViewHolder
, как показано ниже
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
//Glide.with(mcontext).load(mArrayList.get(position).getImage()).into(holder.item_image);
holder.item_name.setText(mArrayList.get(position).getTitle());
holder.item_description.setText(mArrayList.get(position).getDescription());
holder.item_tags.setText(mArrayList.get(position).getTags());
holder.setOnClickListener(this) // put this line
Log.d("MyAdapter", "position: " position);
}
Тогда, конечно, вы переопределите onClick
в адаптере, а не viewholder
Комментарии:
1. спасибо, я постараюсь реализовать ваш ответ и посмотреть, что я получу в результате
2. ваш ответ примерно такой же, как то, что он только что опубликовал