繁体   English   中英

从回收站视图中获取原始项目?

[英]Getting original Item from Recycler View?

我已经完成了学习如何实现 Recycler View 的非常复杂的任务。 我的回收站视图正确显示来自 ArrayList 提供的信息,并根据新增内容进行更新。

问题:这些单独的项目旨在代表我的 FireBase 数据库中的一个项目。 当然,数据库中的每个条目都有自己的唯一 ID。 然而,在实现onClickListener()能够根据数据库按下这些项目以获得更多信息以显示在屏幕上时,我分配视图持有者的项目 ID 仅与视图持有者的 position 一致,而不是分配 ArrayList。 这反过来又让我的对象一遍又一遍地引用相同的 ID,具体取决于我分配给它的 ScrollView 所在的 RecyclerView 的哪个部分。 如何将单击的视图的 position 转换为原始 ArrayList 中正确的 object 表示形式?

原谅我的代码,我是学习 Java 的新手,很难理解这个回收器视图。 在其中,您会发现我尝试为每个单独的视图实例分配正确的 ID 时的一堆冗余内容。

订购适配器

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


    }

我在我的活动中的实现

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

无需使用view获取点击position,只需要调整listener的实现即可。 创建一个监听器以获取回收视图中任何项目的数据 onClick。 需要在这里删除监听器-

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

从 onCreateViewHolder 中移除监听器,并在 onBindViewholder 或嵌套的 class 中实现监听器。

调整后的代码如下 -

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

在您的活动/片段中实现此(OrderSelectListener)侦听器,如下所示 -

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

    }
});

编码快乐!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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