I have gone through the very convoluted task of learning how to implement a Recycler View. My recycler view is properly displaying the information from the ArrayList provided and updating according to new additions.
The issue : These individual items are meant to represent an item in my FireBase database. Each entry in the database has its own unique ID of course. However on implementing an onClickListener() to be able to press these items to obtain more information to be displayed on screen according to the database, the Item ID I am assigning the view holder is only consistent with the position of the view holder, not the assigned ArrayList. This in turn has my objects referencing the same ID over and over depending on what part of the RecyclerView the ScrollView I assigned it is located. How do I convert the position of the view clicked to its proper object representation in the original ArrayList?
Forgive my code, I am new to learning Java and it is very difficult to understand this recycler View. In it you will find a bunch of redundant stuff from my attempts at assigning the proper ID to each individual view instance.
Order Adapter
public class OrderAdapter extends RecyclerView.Adapter<OrderAdapter.OrderViewHolder> {
private ArrayList<Order> orderList;
private Context context;
private View.OnClickListener clickListener;
private HashMap<Integer, OrderViewHolder> holderlist;
public OrderAdapter(Context context, ArrayList<Order> orderList){
this.orderList = orderList;
this.context = context;
holderlist = new HashMap<>();
}
@NonNull
@Override
public OrderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.order_list, parent, false);
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
view.setLayoutParams(lp);
//View view = new TextView(context);
//View rootView = LayoutInflater.from(context).inflate(R.layout.order_list, parent, false);
Log.e("VIEW HOLDER", "VIEW CREATED");
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
clickListener.onClick(view);
}
});
return new OrderViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull OrderViewHolder holder, int position) {
holderlist.put(position,holder);
Order order = orderList.get(position);
holder.text.setText(order.getOrderText());
holder.getOrder().setOrderID(orderList.get(position).getOrderID());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
clickListener.onClick(view);
}
});
if(order.getOrderStatus().equals("ACCEPTED")) {
holder.text.setBackgroundResource(R.drawable.rounded_corner_green);
}
else{
holder.text.setBackgroundResource(R.drawable.rounded_corner_white);
}
holderlist.put(position,holder);
}
@Override
public int getItemCount() {
return orderList.size();
}
public void setClickListener(View.OnClickListener callback) {
clickListener = callback;
}
public OrderViewHolder returnHolderByPosition(int position){
return holderlist.get(position);
}
public class OrderViewHolder extends RecyclerView.ViewHolder{
public TextView text;
public Order order;
public OrderViewHolder(@NonNull View itemView) {
super(itemView);
text = (TextView) itemView;
order = new Order();
}
public void setOrder(Order order){
this.order = order;
}
public Order getOrder(){
return order;
}
}
My Implementation in my Activity
orderActiveAdapter.setClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int pos = cardActive.indexOfChild(view);
OrderAdapter.OrderViewHolder holder = orderActiveAdapter.returnHolderByPosition(pos);
int orderID = holder.getOrder().getOrderID();
Log.e("ORDER ID ", Integer.toString(orderID));
}
});