简体   繁体   中英

Getting original Item from Recycler View?

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

No need to use view to get click position, you simply need to adjust the implementation of listener. Create a listener to get data onClick of any item in recycle view. Need to remove the listener here-

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

Remove listener from onCreateViewHolder, and implement the listener in either onBindViewholder or inside nested class.

Adjusted Code as follow-

public class OrderAdapter extends RecyclerView.Adapter<OrderAdapter.OrderViewHolder> {

    private ArrayList<Order> orderList;
    private Context context;
    private HashMap<Integer, OrderViewHolder> holderlist;
    
    //Add this Listener to pass data from recycle view to activity/fragment
    private OrderSelectListener orderSelectListener;

    public OrderAdapter(Context context, ArrayList<Order> orderList){
        this.orderList = orderList;
        this.context = context;
        holderlist = new HashMap<>();
    }
    
    //Create an interface
    public interface OrderSelectListener{
        void onOderClick(Order order, int position);
    }
    
    //create a method for the activity/fragment which will implement this listener
    public void setOrderClickListener(OrderSelectListener orderSelectListener){
        this.orderSelectListener = orderSelectListener;
    }
}

    @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");
        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());
        if(order.getOrderStatus().equals("ACCEPTED")) {
            holder.text.setBackgroundResource(R.drawable.rounded_corner_green);
        }
        else{
            holder.text.setBackgroundResource(R.drawable.rounded_corner_white);
        }

        // passing Order and Position as parameter to interface method,
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                orderSelectListener.onOrderClick(orderList.get(position),position);
            }
        });

    }

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

    public class OrderViewHolder extends RecyclerView.ViewHolder{

        public TextView text;
        public View itemView;
        public Order order;

        public OrderViewHolder(@NonNull View itemView) {
            super(itemView);
            text = (TextView) itemView;
            order = new Order();
            this.itemView = itemView;
        }

        public void setOrder(Order order){
            this.order = order;
        }

        public Order getOrder(){
            return order;
        }
}

In your activity/fragment implement this (OrderSelectListener) listener, as following-

orderActiveAdapter.orderSelectListener(new OrderAdapter.OrderSelectListener() {
    @Override
    public void onOrderClick(Order order, int position) {
        //do something amazing here

    }
});

Happy Coding!!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM