单击以从不工作的片段适配器打开 activity

Onclick to open activity from adapter of fragment not working

我正在尝试 运行 我从一些在线教程中获得的一些代码,这些代码是编写一个带有 recyclerview 的片段,但是我在从 onclick 事件中打开 activity 时遇到了一些困难。我的适配器在下面

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

中看到任何错误

尝试在 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

您可以将侦听器从片段发送到适配器。您可以将其发送回片段以打开 activity.

,而不是尝试从适配器启动 activity

1.定义接口

public interface MyAdapterListener {
   void openActivity(/*any values to be sent*/);
 }

2. 片段应实现 MyAdapterListener

3. 将侦听器对象发送到构造函数中的适配器

ItemAdapter(ArrayList<ItemModel> mArrayList, MyAdapterListener listener) {..
         mListener = listener;
      }

4. 在适配器上 - View Holder:在 onClick() return 到 fragment

public void onClick(View view) {
        mListener.openActivity(/*any values to be sent*/);
    }

相反,像这样尝试,

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);

我的想法是,在某些 activity 中应用适配器时,您只需在适配器 setOnItemClickListener 上调用 activity

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 );
}

然后一旦完成,您就可以来到接收器 activity 并让路让变量传递给它

public static void passingIntent(Activity activity, Integer postid){
    Intent intent = new Intent(activity, ViewItem.class);
    intent.putExtra(MY_ITEM, postid);
    activity.startActivity(intent);
}

我最近在我的一个应用程序中使用了这种方法