Нажмите, чтобы открыть действие из адаптера фрагмента не работает - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь запустить какой-то код, полученный из какого-то онлайн-учебника по написанию фрагмента с обзором recylerview, но я испытываю некоторые трудности при открытии активности из события 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

Ответы [ 4 ]

0 голосов
/ 31 марта 2019

Мне пришло в голову, что при использовании адаптера в каком-либо действии вы просто вызываете действие на 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);
}

В последнее время я использовал этот подход в одном из моих приложений

0 голосов
/ 30 марта 2019

Вы можете отправить слушателя из фрагмента в адаптер.Вместо того, чтобы пытаться запустить действие из адаптера, вы можете отправить его обратно во фрагмент, чтобы открыть действие.

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*/);
    }
0 голосов
/ 30 марта 2019

Вместо этого попробуйте вот так,

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);
0 голосов
/ 30 марта 2019

Попробуйте настроить прослушиватель кликов на 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

...