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.