I have a listview that displays data from firebase.The listview works prefectly.But now i would like to implement an onclick listener in my recycler adapter that then displays more details in a new activity. I have searched everywhere for a solution but cant figure it out.I know i am supposed to be using firebase UI.
This is the fragment thats displaying the data from firebase to listview using recycler adaper:
public class CategoryFragment extends Fragment {
private static final String TAG = "CategoryFragment";
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
// private Adapter adapter;
private List<ListItem> listItems;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference myRef;
private AdapterView.OnItemSelectedListener listener;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View rootView =inflater.inflate(R.layout.recycler_view,container,false);
listItems = new ArrayList<>();
adapter = new CategoryRecycler(listItems,getContext());
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
mFirebaseDatabase = FirebaseDatabase.getInstance();
getFirebaseData();
progressBar = rootView.findViewById(R.id.progressBar);
recyclerView = rootView.findViewById(R.id.my_recycler_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setItemAnimator(new DefaultItemAnimator());
int tilePadding = getResources().getDimensionPixelSize(R.dimen.tile_padding);
recyclerView.setPadding(tilePadding, tilePadding, tilePadding, tilePadding);
recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2));
return recyclerView;
//return rootView
}
private void getFirebaseData() {
myRef = mFirebaseDatabase.getReference("Users");
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
ListItem data = dataSnapshot.getValue(ListItem.class);
listItems.add(data);
recyclerView.setAdapter(adapter);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
And heres my attempt to implement onclick inside recycler adapter :
public ViewHolder(LayoutInflater inflater, ViewGroup parent) {
super(inflater.inflate(R.layout.category_item_tile, parent, false));
username = itemView.findViewById(R.id.list_title);
imageUrl = itemView.findViewById(R.id.list_avatar);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Context context = v.getContext();
Intent pDetail = new Intent(context, ProfileDetail.class);
pDetail.putExtra(ProfileDetail.EXTRA_POSITION, getAdapterPosition());
context.startActivity(pDetail);
}
});
}
And this is my detailactivity:
public class ProfileDetail extends AppCompatActivity {
private static final String TAG = "EXTRA_POSITION";
public static final String EXTRA_POSITION = "profile_detail";
private List<ListItem> listItems;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference myRef;
private TextView tvName, tvSummary, tvStatus, tvDetail;
private ImageView ivImage;
private ImageView ivImageCard;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.categorydetails);
listItems = new ArrayList<>();
ivImage = findViewById(R.id.userAvatar);
ivImageCard = findViewById(R.id.header_img);
tvName = findViewById(R.id.userProfileName);
tvSummary = findViewById(R.id.ProfileSummary);
tvStatus = findViewById(R.id.userStatus);
tvDetail = findViewById(R.id.ProfileDetail);
}
}
This is the full code for the Adapter:
public class CategoryRecycler extends RecyclerView.Adapter<CategoryRecycler.ViewHolder> {
private List<ListItem> listItems;
private Context context;
public CategoryRecycler(List<ListItem>listItems,Context context) {
this.listItems = listItems;
this.context =context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()), parent);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
ListItem listItem = listItems.get(position);
holder.username.setText(listItem.getUsername());
//holder.summary.setText(listItem.getSummary());
Picasso.with(context).load(listItem.getImageurl()).into(holder.imageUrl);
}
@Override
public int getItemCount() {
return listItems.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView username;
public TextView summary;
public ImageView imageUrl;
public ViewHolder(LayoutInflater inflater, ViewGroup parent) {
super(inflater.inflate(R.layout.category_item_tile, parent, false));
username = itemView.findViewById(R.id.list_title);
imageUrl = itemView.findViewById(R.id.list_avatar);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Context context = v.getContext();
Intent pDetail = new Intent(context, ProfileDetail.class);
pDetail.putExtra(ProfileDetail.EXTRA_POSITION, getAdapterPosition());
context.startActivity(pDetail);
}
});
}
}
}
onBindViewHolder holder calls:
holder.username.setText(listItem.getUsername());
Picasso.with(context).load(listItem.getImageurl()).into(holder.imageUrl);
context is required for my picasso image management.
//declaring context
private Context context;
//using context
this.context =context;
But if you know any other way without using context on image,i would appreciate the suggestions.