Onclick从片段的调整器打开活动不起作用

时间:2019-03-30 02:42:28

标签: java android fragment

我正在尝试运行一些在线教程中获得的代码,这些在线教程中编写了带有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 :(得分:0)

您可以将一个侦听器从片段发送到适配器。无需尝试从适配器启动活动,而是可以将其发送回片段以打开活动。

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

答案 1 :(得分:0)

相反,尝试这样,

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 :(得分:0)

我的想法是,在您的适配器应用程序中的某些活动中,您只需在适配器的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);
}

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

答案 3 :(得分:-1)

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