当前位置: 首页 > 知识库问答 >
问题:

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

郑翰海
2023-03-14

我已经完成了学习如何实现回收器视图这一非常复杂的任务。 我的回收器视图正在正确地显示来自提供的ArrayList的信息,并根据新的添加进行更新。

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

原谅我的代码,我是学习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;
        }


    }

我在我的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));
           }
       });

共有1个答案

端木明贤
2023-03-14

不需要使用视图来获取点击位置,只需调整Listener的实现即可。 创建一个侦听器来获取recycle视图中任何项目的数据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中或在嵌套类中实现侦听器。

调整代码如下-

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());
        holder.getOrder().setOrderID(orderList.get(position).getOrderID());
        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);

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

在您的activity/片段中实现这个(OrderSelectListener)侦听器,如下所示-

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

    }
});

快乐的编码!!

 类似资料:
  • 大家好我需要帮助我第一次使用android studio java。。。这是我的界面 在此输入图像描述 我想恢复列表中的EditText值时,用户点击"valider la命令"

  • 如果用户点击一个,我希望它做一些事情,也为两个和三个。我如何实现这一点?

  • 然后,在每个@test方法中,我调用activitytestrule.launchactivity(Intent.action_main)),然后进行单击。我发现,只有第一次点击不起作用,但第二次和第三次点击起作用。那么,这种行为的原因又能是什么呢?

  • 我有一个回收器视图有10个项目。我滚动到页面底部,现在我正尝试为第一个项目调用。当我调用它时,它不会触发第一个项目的。因此,简而言之,我的问题是,当我调用时,其位置没有显示在屏幕上,它是否触发了?。这是我的适配器代码

  • 在其他回收器视图中有一个回收器视图。两者都需要垂直滚动。外部回收器视图滚动正常,但内部回收器视图滚动不正常。 这是代码: ViewAdapter如下: 我尝试了以下两种回收商观点,但都无法解决问题 也尝试了这个:

  • 我试图使用picasso库将url加载到imageView,但无法获得来正确使用picasso库。

  • 我刚开始在firebase工作。我设法上传了文本和图像,但是,我无法检索要显示在回收器视图中的图像,只能检索文本。我用的是毕加索依赖。我已经包括了我的主要活动。java类,该类负责显示从问题“我的适配器”中的firebase检索的回收器视图项。java类和模型类。我相信,在我将图像URI上载到firebase存储时,我可能犯了没有存储图像URI的错误,因此适配器无法检索图像位置。我想这可能是因为我

  • 如何在回收者视图中收听触摸事件?我已经为视图持有者实现了click listener,但它可以在整个视图上工作。我在每个视图支架中都有一个图像视图,当用户单击图像视图时,我需要执行一个操作。 当前视图持有者代码。