Onclick для открытия действия из адаптера нерабочего фрагмента

#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. ваш ответ примерно такой же, как то, что он только что опубликовал