简体   繁体   中英

Get the selected item or the item that is being clicked in the recyclerView

I am storing data from my firebase Realtime database into an Arraylist and displaying through recyclerAdapter. I Want to be able to open new Activity and pass information from this activity to the next but to do so i need to get the selected item or the item that is being clicked

Code:

protected void onStart() {
        super.onStart();
        if (ref != null) {
            ref.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    if (snapshot.exists()) {
                        list = new ArrayList<>();
                        for (DataSnapshot s : snapshot.getChildren()) {
                            list.add(s.getValue(jobclass.class));
                        }
                        myAdapter ma = new myAdapter(list);
                        result.setAdapter(ma);
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {
                    Toast.makeText(showjobs.this, error.getMessage(), Toast.LENGTH_LONG).show();

                }
            });
        }
        if(sv!=null)
        {
            sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String s) {
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String s) {
                    search(s);
                    return true;
                }
            });
        }
    }
    private void search(String str)
    {
        ArrayList<jobclass> mylist=new ArrayList<>();
        for(jobclass obj:list)
        {
            if(obj.getJobTitle().toLowerCase().contains(str.toLowerCase()))
            {
                mylist.add(obj);
            }
        }
        myAdapter myadaptor=new myAdapter(mylist);
        result.setAdapter(myadaptor);
    }

This is my custom adapter and viewholder class:


  public class myAdapter extends RecyclerView.Adapter<myAdapter.jobviewholder> {
        ArrayList<jobclass> list;
        public myAdapter(ArrayList<jobclass> list)
        {
            this.list=list;
        }
    
        @NonNull
        @Override
        public jobviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.listlayout,parent,false);
    
            return new jobviewholder(v);
        }
    
        @Override
        public void onBindViewHolder(@NonNull jobviewholder holder, int position) {
            holder.setDetails(list.get(position).getJobTitle(),list.get(position).getCompany(),list.get(position).getPay(),list.get(position).getAge(),list.get(position).getExperience(),list.get(position).getType());
        }
    
        @Override
        public int getItemCount() {
            return list.size() ;
        }
    
    
        class jobviewholder extends RecyclerView.ViewHolder{
            TextView jobtitle;
            TextView companyname;
            TextView payment;
            TextView age;
            TextView exprequired;
            TextView jobtype;
    
            View v;
    
            public jobviewholder(View itemView){
                super(itemView);
                jobtitle=itemView.findViewById(R.id.jname);
                companyname=itemView.findViewById(R.id.cname);
                payment=itemView.findViewById(R.id.sal);
                age=itemView.findViewById(R.id.agereq);
                exprequired=itemView.findViewById(R.id.reqex);
                jobtype=itemView.findViewById(R.id.type);
            }
            public void setDetails(String jobn, String companyn, String pay, String Ag, String xreq, String jtyp){
    
    
                jobtitle.setText(jobn);
                companyname.setText(companyn);
                payment.setText(pay);
                age.setText(Ag);
                exprequired.setText(xreq);
                jobtype.setText(jtyp);
            }
        }
    }

Try catch to try to catch the reason of my crash 

    try {
                                ma = new myAdapter(list, new myAdapter.OnItemClickListener() {
                                    @Override
                                    public void OnItemClick(int position) {
                                        Toast.makeText(showjobs.this, position, Toast.LENGTH_SHORT).show();
                                    }
                                });
                                result.setAdapter(ma);
                            }
                            catch(Exception e)
                            {
                                Toast.makeText(showjobs.this, e.getMessage(), Toast.LENGTH_LONG).show();
                            }

_______________________

You can do it using interface :

1 - Create an Interface and name it eg OnItemCallBack

2 - On the OnItemCallBack interface create a method onClick as follows :

public interface OnItemCallBack {
    void onClick(int itemPosition);
}

3 - Define the OnItemCallBack In your adapter :

 private ArrayList<jobclass> list;
 private OnItemCallBack onItemCallBack;

 public myAdapter(ArrayList<jobclass> list,OnItemCallBack onItemCallBack;) {
        this.list = list;
        this.onItemCallBack = onItemCallBack;
 }

4 - Make the jobviewholder implement from View.OnClickListener :

  class jobviewholder extends RecyclerView.ViewHolder implements View.OnClickListener {

       public jobviewholder(View itemView) {
                super(itemView);
                jobtitle = itemView.findViewById(R.id.jname);
                companyname = itemView.findViewById(R.id.cname);
                payment = itemView.findViewById(R.id.sal);
                age = itemView.findViewById(R.id.agereq);
                exprequired = itemView.findViewById(R.id.reqex);
                jobtype = itemView.findViewById(R.id.type);
                itemView.setOnClickListener(this);
             } }

5 - on the OnClick method of your item :

    @Override
    public void onClick(View v) {
        onItemCallBack.onClick(getAdapterPosition());
    }

6 - When you want to call your adapter :

myAdapter mAdapter = new myAdapter(list, new OnItemCallBack() {
            @Override
            public void onClick(int itemPosition) {
                Toast.makeText(context,"On Item click ; "+itemPosition,Toast.LENGTH_LONG).show();
            }
        });

add this to myAdapter class :

private CategoryTitleAdapter.OnItemClickListener mListener;

public interface OnItemClickListener {
    void onItemClick(int position);
}

public void setOnItemClickListener(CategoryTitleAdapter.OnItemClickListener listener) 
{
    mListener = listener;
}

then change jobviewholder to this :

class jobviewholder extends RecyclerView.ViewHolder{
    TextView jobtitle;
    TextView companyname;
    TextView payment;
    TextView age;
    TextView exprequired;
    TextView jobtype;

    View v;

    public jobviewholder(View itemView, , final OnItemClickListener mListener){
        super(itemView);
        jobtitle=itemView.findViewById(R.id.jname);
        companyname=itemView.findViewById(R.id.cname);
        payment=itemView.findViewById(R.id.sal);
        age=itemView.findViewById(R.id.agereq);
        exprequired=itemView.findViewById(R.id.reqex);
        jobtype=itemView.findViewById(R.id.type);


        // here you can add button and set OnClickListener to that : 
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mListener != null) {
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION) {
                        mListener.onItemClick(position);
                    }
                }
                notifyDataSetChanged();
            }
        });
    }
    public void setDetails(String jobn, String companyn, String pay, String Ag, String xreq, String jtyp){


        jobtitle.setText(jobn);
        companyname.setText(companyn);
        payment.setText(pay);
        age.setText(Ag);
        exprequired.setText(xreq);
        jobtype.setText(jtyp);
    }
}

then change onCreatViewHolder :

@NonNull
@Override
public jobviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.listlayout,parent,false);

    return new jobviewholder(v, mListener);
}

now you can get position in your activity/fragment like this :

myAdapter adapter = new myAdapter(Items);
    adapter.setOnItemClickListener(new CategoryTitleAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(int position) {
            Toast.makeText(getActivity(), "selected index: " + position, 
            Toast.LENGTH_SHORT).show();
            // do something 
        }
    });

There could be more elegant ways of doing this, but you can just add an on-click listener to the itemView in your adapter's setDetails method, which is already position aware, with something that looks like this:

public void setDetails(String jobn, String companyn, String pay, String Ag, String xreq, String jtyp){
   jobtitle.setText(jobn);
   companyname.setText(companyn);
   payment.setText(pay);
   age.setText(Ag);
   exprequired.setText(xreq);
   jobtype.setText(jtyp);
    
   itemView.setOnClickListener(new View.OnClickListener() {
            @Override
             public void onClick(View v) {
                  Intent intent = new Intent(itemView.getContext(), SecondActivity.class);
                  intent.putExtra("jobtitle", jobn);
                  //Add the rest of your parameters here
                   itemView.getContext().startActivity(intent);
                }
            });
        }     
  }

In your second activity you can then unwrap the intent

 Intent intent = getIntent();
 String jobTitle = intent.getStringExtra("jobtitle");
           //Add the rest of your data here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM