Как установить OnClickListener в адаптере с использованием RecyclerView для отображения внутри фрагмента

#java #android #android-fragments

#java #Android #android-фрагменты

Вопрос:

Я не могу получить доступ к идентификатору элемента, чтобы просмотреть его в ToastMessage или даже сохранить его в базе данных (используйте базу данных Room) Я пробовал, но сообщение не появляется, мне нужен идентификатор ссылки для использования для хранения базы данных и завершения процесса хранения корзины покупок

itemAdapter.java

 public class itemAdapter extends RecyclerView.Adapter<itemAdapter.ItemViewHolder> {
    private Context context;
    private ArrayList<Items> arrayList;
    private AdapterView.OnItemClickListener listener;
    public itemAdapter(Context context, ArrayList<Items> arrayList) {
        this.context = context;
        this.arrayList = arrayList;
    }

    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
        return new ItemViewHolder(v);
    }


    @Override
    public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
        holder.name.setText(arrayList.get(position).getItemName());
        holder.desc.setText(arrayList.get(position).getItemDesc());
        holder.price.setText(arrayList.get(position).getItemPrice());
        holder.add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context,arrayList.get(position).getItemIid(),Toast.LENGTH_SHORT);
            }
        });
        holder.name.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context,arrayList.get(position).getItemPrice(),Toast.LENGTH_SHORT);
            }
        });

    }

    @Override
    public int getItemCount() {
        return arrayList.size();
    }

    class ItemViewHolder extends RecyclerView.ViewHolder {

        TextView name, desc, price;
        ImageView remove, add;

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.tvName);
            desc = itemView.findViewById(R.id.tvDesc);
            price = itemView.findViewById(R.id.tvPrice);
            remove = itemView.findViewById(R.id.btnDelete);
            add = itemView.findViewById(R.id.btnAdd);
        }
    }
   
}
 

MealsFragment.java

общедоступный класс MealsFragment расширяет фрагмент {

 public MealsFragment() {
    // Required empty public constructor
}

RecyclerView recyclerView;
itemAdapter adapter;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_meals, container, false);
}

@Override
public void onViewCreated( View view, Bundle savedInstanceState) {
    ArrayList<Items> ItemsList = (ArrayList<Items>) RoomDatabaseSingleton.getInstance(getContext().getApplicationContext())
            .getAppDatabase()
            .getDao()
            .getItems("meals");
    recyclerView = view.findViewById(R.id.rvMeals);
    RecyclerView.LayoutManager manager = new LinearLayoutManager(
            getContext(), RecyclerView.VERTICAL, false);
    recyclerView.setLayoutManager(manager);
    adapter = new itemAdapter(getContext(), ItemsList);
    recyclerView.setAdapter(adapter);

}
 

}

Комментарии:

1. В конструкторе вашего адаптера попробуйте использовать this.arrayList = new ArrayList<>(arrayList); для инициализации элементов arraylist .

2. Та же проблема

3. Не могли бы вы, пожалуйста, немного прояснить свои сомнения. Итак, вы говорите, что когда вы нажимаете на add Imageview, тост не отображается?

4. @Khaled проверьте ответ и посмотрите, решит ли он вашу проблему

5. У ваших тостов нет .show() 🙂

Ответ №1:

Вместо этого попробуйте следующее

        holder.add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context,arrayList.get(position).getItemIid(),Toast.LENGTH_SHORT).show();
            }
        });
        holder.name.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context,arrayList.get(position).getItemPrice(),Toast.LENGTH_SHORT).show();
            }
        });
 

Статический метод makeText Toast используется для создания Toast объекта, а show() метод для Toast объекта используется для отображения тоста