【问题标题】:Onclick to open activity from adapter of fragment not workingOnclick 从片段适配器打开活动不起作用
【发布时间】:2019-03-30 02:42:28
【问题描述】:

我正在尝试运行一些我从一些在线教程中获得的一些代码,该教程是在其中编写一个带有 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 中看到任何错误

【问题讨论】:

  • 请尝试为正在使用此适配器的片段添加代码,我们看看是否还有解决问题的方法
  • 什么是ItemView
  • 我相信我们应该从 SO 上的某些 tos 页面上发布特定于我们所面临问题的代码。实际上,正如您所看到的,我已经有了四个答案,这意味着人们知道我在问什么。很高兴去朋友

标签: java android fragment


【解决方案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】:

    你可以让一个监听器从片段发送到适配器。无需尝试从适配器启动 Activity,您可以将其发送回 Fragment 以打开 Activity。

    1.定义接口

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

    2.片段应该实现MyAdapterListener

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

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

    4. 在 Adapter - View Holder 上:在 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);
      }
      

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

      【讨论】:

      • 什么是ListingAdapter? RecyclerView 的 setItemOnClickListener 是什么??
      • 我认为这个答案是我一直在寻找的,因为尽管上面有一些错误,但它往往可以解决我的问题
      【解决方案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

      【讨论】:

      • 谢谢,我会尝试实施你的答案,看看我得到了什么结果
      • 你的回答和他刚刚发的差不多
      猜你喜欢
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      相关资源
      最近更新 更多