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



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

问题:这些单独的项目表示FireBase数据库中的一个项目。当然,数据库中的每个条目都有自己唯一的ID。然而,在实现onClickListener()以能够按下这些项目来获得根据数据库显示在屏幕上的更多信息时,我分配给视图持有者的项目ID仅与视图持有者的位置一致,而不是分配的ArrayList。这反过来又让我的对象一遍又一遍地引用相同的ID,这取决于我分配给它的ScrollView位于RecyclerView的哪个部分如何将单击的视图的位置转换为其在原始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;
}

}

我在活动中的实施

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

无需使用视图来获取点击位置,只需调整监听器的实现即可。创建一个侦听器以在单击回收视图中的任何项目时获取数据。需要在此处删除侦听器-

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

快乐编码!!

最新更新