如何解决适配器中的位置问题?使用 firebase 作为后端

问题描述

我正在创建一个以 firebase 作为后端的应用。我正在为不同的活动使用相同的适配器,现在它运行良好,但位置不匹配,例如:位置 0 的输出显示在位置 1 中,位置 1 的输出显示在位置 2 中等等。如何解决这个问题,输出位置的问题。

 Adapter:
    public class Frontlistadapter extends FirebaseRecyclerAdapter<Gamedata,Frontlistadapter.ViewHolder> {
        private static final String TAG = "GameAdapter";
        Context mContext;
    int positions;
    public Frontlistadapter(@NonNull FirebaseRecyclerOptions<Gamedata> options,Context context) {
            super(options);
            mContext = context;
        }
     @Override
        protected void onBindViewHolder(@NonNull ViewHolder holder,int position,@NonNull Gamedata model) {
            holder.name.setText(model.getName());
            holder.address.setText(model.getAddress());
            //Picasso.get().load(model.getFrontcover()).into(holder.Frontcover);
            Glide.with(mContext).load(model.getFrontcover()).into(holder.Frontcover);
            positions = position; //<-- here I'm having positions but output shows different for each positions
           
        }
    
        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
            View v = layoutInflater.inflate(R.layout.gamerow,parent,false);
            ViewHolder viewHolder = new ViewHolder(v);
            return viewHolder;
        }
    
    
        public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    
                ImageView Frontcover;
                TextView name;
                TextView address;
            View v;
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
    
                Frontcover = (ImageView)itemView.findViewById(R.id.frontcover);
                name = (TextView)itemView.findViewById(R.id.frontname);
                address=(TextView)itemView.findViewById(R.id.frontaddress);
                v = itemView;
                itemView.setClickable(true);
                itemView.setonClickListener((View.OnClickListener) this);
            }
    
            @Override
            public void onClick(View v) {
                String className = mContext.getClass().getSimpleName();
                Intent intent = null;
                switch (className) {
                    case "GameActivity":
                        intent =  new Intent(mContext,Center_details.class);
                        intent.putExtra("User",getRef(positions).getKey());
                        break;
                    case "KidsActivity":
                        intent = new Intent(mContext,AllCenterDetails.class);
                        intent.putExtra("Kids",getRef(positions).getKey());
                        break;
                }
                mContext.startActivity(intent);
            }
        }
    }

enter image description here

解决方法

首先你要做的就是创建这样的界面

  public interface ClickListner {
   void onClick(View view,int position);
  }

然后在您的活动中像这样创建接口的对象并将其与其他数据一起传递给适配器

         ClickListner listener = ClickListner();
         FrontlistAdapter customAdapter = new 
         FrontlistAdapter(AcceptedOrdersActivity.this,listener);
         riderView.setAdapter(customAdapter);

在 onCreate 和 Intent 外复制此内容

        private ClickListner ClickListner() {
        ClickListner listener = new ClickListner() {
        @Override
        public void onClick(View view,int position) {


            int tag = (int) view.getTag();

            if(tag == 0)
            {
                //Intent here
            }

        }
    };

    return listener;
}

现在你的适配器应该是这个

      public class FrontlistAdapter extends 
      RecyclerView.Adapter<FrontlistAdapter .DataObjectHolder>{

ClickListner listenr;
Context context;

public FrontlistAdapter (Context context,ClickListner listenr) {
    this.context = context;
    this.listenr = listenr;
}

public static class DataObjectHolder extends RecyclerView.ViewHolder {


    Context context;

    public DataObjectHolder(View itemView,ClickListner listenr) {
        super(itemView);

        this.listenr = listenr;
         Frontcover = (ImageView)itemView.findViewById(R.id.frontcover);
        name = (TextView)itemView.findViewById(R.id.frontname);
        address=(TextView)itemView.findViewById(R.id.frontaddress);
        v = itemView;
       
        setOnClickListeners();
    }


    private void setOnClickListeners() {
    `v.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            v.setTag(0);
            listenr.onClick(v,getAdapterPosition());
        }
    });
    }

}

@NonNull
@Override
public FrontlistAdapter.DataObjectHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.cell_orderdetail_list,parent,false);
    FrontlistAdapter.DataObjectHolder dataObjectHolder = new 
FrontlistAdapter.DataObjectHolder(view,listenr);

    return dataObjectHolder;
}

@Override
public void onBindViewHolder(@NonNull FrontlistAdapter.DataObjectHolder holder,int 
position) {

}

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

}

,
positions = position;

这是你的问题。您正在为适配器中的所有内容设置一个全局位置。

在您当前使用 position 的任何地方,您都应该在 ViewHolder 上调用 getBindingAdapterPosition()