Search code examples
javaandroidfirebaseandroid-recyclerviewadapter

How to solve position problem in adapter? Using firebase as the backend


I'm creating an app with firebase as a backend. I'm using same adapter for different activity, now it is working good but positions were mismatched for example: The output of position 0 shows in position 1 and for position 1 shows in position 2 and so on.. How to solve this problem, The problem with the positions of the output.

 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


Solution

  • first what you have to do is create the interface like this

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

    then in your activity create object of the interface like this and pass to the adapter along with your other data

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

    copy this outside onCreate and intent in this

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

    now your adapter should be this one

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

    }