PhxIT
PhxIT

Reputation: 29

how to get position from recyclerview and use it get key for firebase data

I have a recyclerview which upon selection of a radiobutton opens up a alertdialog with options. My problem is getting the position of the selected row(radiobutton) in the recyclerview so I can use it to read from firebase and pass it to the alertdialog.

My onclick method for the radiobutton is used in the RecyclerView.ViewHolder class. And this is where I want to get the position of the selected radiobutton.

RecyclerView onClick

I have read the link above, since I am new to recyclerview and android in general, the solutions in the above link confuse me, its really a headache, tried most of their solution and still unable to find a solution to mine

Main Activity

public class Review2 extends AppCompatActivity {
    private TextView impres, impress1, impress2,impress3,impress4,impress5;
    private RecyclerView patient_drug_list;
    private FirebaseAuth mAuth;
    private DatabaseReference mDrugList, mNameDiag, mName;
    private  TextView desker, name, dater;
    public String drug, dosing;
    FirebaseRecyclerAdapter<Drugs, DrugsViewHolder> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_review2);

        ///Firebase Authentication and related properties
        mAuth = FirebaseAuth.getInstance();
        FirebaseUser mUser = mAuth.getCurrentUser();
        String uId = mUser.getUid();/// id or users

        desker = findViewById(R.id.desk);

        String user_id = getIntent().getStringExtra(Review1.REVIEW_ID);///retrieve value from activity
        ///Toast.makeText(this, user_id, Toast.LENGTH_LONG).show();///verify if value is gotten
        Query query = FirebaseDatabase.getInstance().getReference().child("Drugs").child(uId).child(user_id);
        query.keepSynced(true);

        patient_drug_list = (RecyclerView) findViewById(R.id.recycler2); ////Recycler view from xml
        patient_drug_list.setLayoutManager(new LinearLayoutManager(this));
        patient_drug_list.setHasFixedSize(true);



        ///////////////////////////Assign Items
        impres = findViewById(R.id.diagnose1);
        impress1 = findViewById(R.id.diagnose2);
        impress2 = findViewById(R.id.diagnose3);
        impress3 = findViewById(R.id.diagnose4);
        impress4 = findViewById(R.id.diagnose5);
        impress5 = findViewById(R.id.diagnose6);

        name = findViewById(R.id.RName);
        dater = findViewById(R.id.RDate);


        /////////////Reading firebase data


        mNameDiag = FirebaseDatabase.getInstance().getReference().child("Diagnosis").child(uId).child(user_id);
        mNameDiag.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String diagnosis1 = dataSnapshot.child("diagnosis1").getValue().toString();
                String diagnosis2 = dataSnapshot.child("diagnosis2").getValue().toString();
                String diagnosis3 = dataSnapshot.child("diagnosis3").getValue().toString();
                String diagnosis4 = dataSnapshot.child("diagnosis4").getValue().toString();
                String diagnosis5 = dataSnapshot.child("diagnosis5").getValue().toString();


                impres.setText(diagnosis1);
                impress1.setText(diagnosis2);
                impress2.setText(diagnosis3);
                impress3.setText(diagnosis4);
                impress4.setText(diagnosis5);
                impress5.setText(diagnosis5);

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });



        /////////////////////////////////////////////////////////////////
        mName = FirebaseDatabase.getInstance().getReference().child("Patients").child(uId).child(user_id);
        mName.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String namer = dataSnapshot.child("name").getValue().toString();
                String dater1 = dataSnapshot.child("date").getValue().toString();

                name.setText(namer);
                dater.setText(dater1);
                adapter.startListening();

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });



                ////Firebase Adapter and related properties

        FirebaseRecyclerOptions<Drugs> options = new FirebaseRecyclerOptions.Builder<Drugs>()
                .setQuery(query, Drugs.class).build();

        adapter = new FirebaseRecyclerAdapter<Drugs, DrugsViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull DrugsViewHolder holder, final int position, @NonNull Drugs model) {
                holder.setDiag1(model.getBrand());
                holder.setDiag2(model.getGeneric());
                holder.setDiag3(model.getDose());
                holder.setDiag4(model.getFrequency1(), model.getFrequency2(), model.getDuration());






            }

            @NonNull
            @Override
            public DrugsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

                ////Recycler view item
                View view = LayoutInflater.from(viewGroup.getContext())
                        .inflate(R.layout.drug_display_list,viewGroup,false);///
                return new DrugsViewHolder(view);
            }
        };

        patient_drug_list.setLayoutManager(new LinearLayoutManager(this));
        patient_drug_list.setAdapter(adapter);//// setting adapter
        adapter.notifyDataSetChanged();
        adapter.startListening();
    }

    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
        adapter.notifyDataSetChanged();
    }




////////////////click for new option activities

           //This is a switch for the adio button options that appear after the above radiobutton
    public void clickers(View view) {
        switch (view.getId()){
            case  R.id.drug_needed:
                startActivity(new Intent(getApplicationContext(),Drug_needed.class));
                break;


            case R.id.wrong_drug:
                Toast.makeText(Review2.this, "2nd", Toast.LENGTH_SHORT).show();
                break;

            case R.id.dose_related:
                startActivity(new Intent(getApplicationContext(),Dose.class));
                break;
            case R.id.adverse_reaction:
                startActivity(new Intent(getApplicationContext(),ADR.class));
                break;

            case R.id.food_interaction:
                Toast.makeText(this, "yet to do", Toast.LENGTH_SHORT).show();
                break;

            default:
                Toast.makeText(Review2.this, "nothing to see", Toast.LENGTH_SHORT).show();
                break;
        }
    }


    ////////////////View Holder

    private class DrugsViewHolder extends  RecyclerView.ViewHolder{
        View mView;
        DrugsViewHolder(@NonNull View itemView) {
            super(itemView);
            mView = itemView;

            final RadioButton radioButton = mView.findViewById(R.id.not_appropriate);
            radioButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final int position1 = getAdapterPosition();
                    AlertDialog.Builder myDialog = new AlertDialog.Builder(Review2.this);
                    LayoutInflater inflater = LayoutInflater.from(Review2.this);
                    View myview = inflater.inflate(R.layout.adr_options, null);
                    myDialog.setView(myview);
                    myDialog.show();

                }
            });



        }



        void setDiag1(String diag1){
            TextView postdiag1 = mView.findViewById(R.id.brand);
            postdiag1.setText(diag1);

        }
        void setDiag2(String diag2){
            TextView postdiag2 = mView.findViewById(R.id.generic);
            postdiag2.setText(diag2);
            postdiag2.setTextSize(12);
        }
        public void setDiag3(String diag3){
            TextView postdiag3 = mView.findViewById(R.id.dose);
            postdiag3.setText("Dose:" + diag3);
        }
        public void setDiag4(String diag4, String diag5, String diag6){
            TextView postdiag4 = mView.findViewById(R.id.frequency);
            postdiag4.setText("Frequency:" + diag4 + " tab " + diag5+"x" + "daily for "+diag6 + "days");
        }
    }
}

So to keep it simple, I just want to be able to get the position of the recyclerview row with the selected radiobutton from the RecyclerView.ViewHolder class .Any suggestions, ideas or examples would be appreciated.

Upvotes: 0

Views: 1307

Answers (1)

Andrew Churilo
Andrew Churilo

Reputation: 2309

How I see it:

  1. You can create own adapter with inner ViewHolder class. So you can change fields of adapter from ViewHolder;
  2. Create selectedRowPosition or selectedRowsPositions field inside adapter;
  3. Change selectedRowPosition when state of radio button is changed;
  4. Read selectedRowPosition field of adapter when you need it.

Update

I've created repository when you can see strategy described above. Most important class is adapter:

public class RadioButtonsAdapter extends RecyclerView.Adapter<RadioButtonsAdapter.RadioViewHolder> {

    // Field when we store position of last clicked item
    private int lastClickedItemPosition;

    @NonNull
    @Override
    public RadioViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        RadioButton button = new RadioButton(parent.getContext());
        return new RadioViewHolder(button);
    }

    @Override
    public void onBindViewHolder(@NonNull RadioViewHolder holder, int position) {
        holder.radioButton.setText("It is button #" + position);
    }

    @Override
    public int getItemCount() {
        return 30;
    }

    // Use this method to get lastClickedItemPosition
    public int getLastClickedItemPosition() {
        return lastClickedItemPosition;
    }

    // This is inner class. From this class you can change 'lastClickedItemPosition' field of adapter
    class RadioViewHolder extends RecyclerView.ViewHolder {
        private RadioButton radioButton;

        public RadioViewHolder(@NonNull View itemView) {
            super(itemView);
            radioButton = (RadioButton) itemView;
            radioButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    lastClickedItemPosition = getAdapterPosition();
                }
            });
        }
    }
}

You can call adapter.getLastClickedItemPosition() to get position of last clicked item. Full code of MainActivty is on github. MainActivity is written on Kotlin but don't worry, it easy to understand.

Attention!!!

I don't recommend you to use RadioButton inside RecyclerView. The common usage of RadioButton is inside RadioGroup. Check this link to read more details about usage of RadioButton.

Upvotes: 1

Related Questions