How to remove a ViewPager item from Firebase? - android

I am creating an App with ViewPager (with 2 String elements: Model Class: Title and Content). I have a floating action button and I want when pressing a specific button, to delete that item from Firebase & ViewPager.
I tried in MyAdapter Class to remove from the list my current item [ modelList.remove(position)] and in TravelNotes to create a method for delete from Firebase database reference.removeEventListener(this); but I don't know where to call it.
public class MyAdapter extends PagerAdapter {
Context context;
List<Model> modelList;
LayoutInflater inflater;
public MyAdapter(Context context, List<Model> modelList) {
this.context = context;
this.modelList = modelList;
inflater = LayoutInflater.from(context);
}
#Override
public int getCount() {
return modelList.size();
}
#Override
public boolean isViewFromObject(#NonNull View view, #NonNull Object o) {
return view == o;
}
#Override
public void destroyItem(#NonNull ViewGroup container, int position, #NonNull Object object) {
((ViewPager)container).removeView((View) object);
}
#NonNull
#Override
public Object instantiateItem(#NonNull ViewGroup container, final int position) {
View view = inflater.inflate(R.layout.adapter,container,false);
TextView model_titlu = view.findViewById(R.id.titleTextView);
TextView model_continut = view.findViewById(R.id.contentTextView);
FloatingActionButton fab_delete = view.findViewById(R.id.fab_delete);
model_titlu.setText(modelList.get(position).getTitlu());
model_continut.setText(modelList.get(position).getContinut());
fab_delete.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
//Model m = modelList.get(position);
modelList.remove(position);
notifyDataSetChanged();
//how to delete?
}
});
container.addView(view);
return view;
}
}
public class TravelNotes extends AppCompatActivity implements IFirebaseLoadDone, ValueEventListener {
ViewPager viewPager;
MyAdapter adapter;
DatabaseReference databaseReference;
IFirebaseLoadDone iFirebaseLoadDone;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_swipe_data);
databaseReference = FirebaseDatabase.getInstance().getReference("Movie");
iFirebaseLoadDone = this;
loadModel();
viewPager = findViewById(R.id.viewPager);
viewPager.setPageTransformer(true,new DepthPageTransformer());
}
private void loadModel() {
databaseReference.addValueEventListener(this);
}
//where to use this method?
private void delete(){
databaseReference.removeValue();
}
#Override
public void onFirebaseLoadSuccess(List<Model> modelList) {
adapter = new MyAdapter(this,modelList);
viewPager.setAdapter(adapter);
}
#Override
public void onFirebaseLoadFailed(String message) {
Toast.makeText(this,message,Toast.LENGTH_LONG).show();
}
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
List<Model> modelList = new ArrayList<>();
for(DataSnapshot modelSnapshot:dataSnapshot.getChildren())
modelList.add(modelSnapshot.getValue(Model.class));
iFirebaseLoadDone.onFirebaseLoadSuccess(modelList);
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
iFirebaseLoadDone.onFirebaseLoadFailed(databaseError.getMessage());
}
#Override
protected void onDestroy() {
databaseReference.removeEventListener(this);
super.onDestroy();
}
#Override
protected void onResume() {
super.onResume();
databaseReference.addValueEventListener(this);
}
#Override
protected void onStop() {
databaseReference.removeEventListener(this);
super.onStop();
}
}
Could you please advice what should I change in the code for deleting a specific item from ViewPager & Firebase?

Here is what helped me, in MyAdapter Class:
final ArrayList<String> keyList = new ArrayList<>();
TravelNotesActivity.databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
Log.e("TAG", "MyAdaptor :" + ds.getKey());
keyList.add(ds.getKey());
}
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
fab_delete.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
modelList.remove(position);
notifyDataSetChanged();
TravelNotesActivity.databaseReference.child(keyList.get(position)).removeValue();
keyList.remove(position);
}
});

Related

How do I add an OnClickListener And An Animation In A RecyclerView?

Okay so I have RecyclerView in which I retrieve some data from Firebase realtime database and I have a SearchView which filters my database. Now I want two things
I want an OnClicListener in my activity with which I could open a fragment by clicking on of the items.
I want to apply animation to my RecyclerView every time I scroll down.
Note: The OnClickListener should also work after filtering the data.
So far I am unable to achieve this. Here is my code
Adapter Class -> AdapterClass.java
public class AdapterClass extends RecyclerView.Adapter<AdapterClass.MyViewHolder>{
ArrayList<Deal> list;
public AdapterClass(ArrayList<Deal> list)
{
this.list = list;
}
#NonNull
#Override
public MyViewHolder onCreateViewHolder(#NonNull ViewGroup viewGroup, int viewType) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_holder,viewGroup,false);
return new MyViewHolder(view);
}
#Override
public void onBindViewHolder(#NonNull MyViewHolder myViewHolder, final int i) {
myViewHolder.id.setText(list.get(i).getDealId());
myViewHolder.desc.setText(list.get(i).getDealDisc());
}
#Override
public int getItemCount() {
return list.size();
}
static class MyViewHolder extends RecyclerView.ViewHolder{
TextView id,desc;
public MyViewHolder(#NonNull View itemView) {
super(itemView);
id= itemView.findViewById(R.id.dealId);
desc=itemView.findViewById(R.id.description);
}
}
}
Model Class -> Deal.java
public class Deal {
private String dealDisc;
private String dealId;
private String dealImage;
private String price;
public Deal() {
}
public Deal(String dealDisc, String dealId, String dealImage, String price) {
this.dealDisc = dealDisc;
this.dealId = dealId;
this.dealImage = dealImage;
this.price = price;
}
public String getDealDisc() {
return dealDisc;
}
public void setDealDisc(String dealDisc) {
this.dealDisc = dealDisc;
}
public String getDealId() {
return dealId;
}
public void setDealId(String dealId) {
this.dealId = dealId;
}
public String getDealImage() {
return dealImage;
}
public void setDealImage(String dealImage) {
this.dealImage = dealImage;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
Main Activity -> MainActivity.java
public class MainActivity extends AppCompatActivity {
DatabaseReference ref;
ArrayList<Deal> list;
RecyclerView recyclerView;
SearchView searchView;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ref= FirebaseDatabase.getInstance().getReference().child("rana");
recyclerView = findViewById(R.id.rv);
searchView=findViewById(R.id.searchView);
}
#Override
protected void onStart() {
super.onStart();
if (ref != null)
{
ref.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists())
{
list = new ArrayList<>();
for (DataSnapshot ds : dataSnapshot.getChildren())
{
list.add(ds.getValue(Deal.class));
}
AdapterClass adapterClass = new AdapterClass(list);
recyclerView.setAdapter(adapterClass);
}
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
Toast.makeText(MainActivity.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
if (searchView != null)
{
searchView.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<Deal> myList = new ArrayList<>();
for (Deal object : list)
{
if (object.getDealDisc().toLowerCase().contains(str.toLowerCase()) || object.getDealId().toLowerCase().contains(str.toLowerCase()))
{
myList.add(object);
}
}
AdapterClass adapterClass = new AdapterClass(myList);
recyclerView.setAdapter(adapterClass);
}
}
myViewHolder.id.setonclickListener()

Recyclerview fetch existing data after delete an item from adapter and does not update properly

I try to implement a friend request feature in the fragment using custom adapter with firebase database. The problem is when a user accepts or delete someone request, it deletes from firebase but not properly update in the RecyclerView. this problems occurred in only runtime. If I refresh the page then my problem goes away.
Let I have two friend request. If I delete 2nd data then 2nd data will gone from RecyclerView but the problem is RecyclerView shows 1st data doubles. and if I delete 1st data then 1st data goes in the 2nd row and 2nd data came into the first row.
here is my database screenshot
Fragment class-
public class NotificationFragment extends Fragment {
private RecyclerView NotificationRecyclerView;
private NotificationAdapter adapter;
private List<Friend> friendList;
public NotificationFragment() {
// Required empty public constructor
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_notification, container, false);
NotificationRecyclerView = view.findViewById(R.id.NotificationRecyclerView);
NotificationRecyclerView.setHasFixedSize(true);
LinearLayoutManager LayoutManager = new LinearLayoutManager(getContext());
NotificationRecyclerView.setLayoutManager(LayoutManager);
friendList = new ArrayList<>();
adapter = new NotificationAdapter(getContext(), friendList);
NotificationRecyclerView.setAdapter(adapter);
readAllNotification();
return view;
}
private void readAllNotification() {
final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("FriendRequest");
reference.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Friend friend = snapshot.getValue(Friend.class);
if (firebaseUser.getUid().equals(friend.getReceiverID())) {
friendList.add(friend);
}
}
Collections.reverse(friendList);
adapter.notifyDataSetChanged();
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
}
}
Custom Adapter -
public class NotificationAdapter extends RecyclerView.Adapter<NotificationAdapter.NotificationViewHolder> {
private Context context;
private List<Friend> friendList;
public NotificationAdapter(Context context, List<Friend> friendList) {
this.context = context;
this.friendList = friendList;
}
#NonNull
#Override
public NotificationViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.single_notification_item, parent, false);
return new NotificationAdapter.NotificationViewHolder(view);
}
#Override
public void onBindViewHolder(#NonNull final NotificationViewHolder holder, final int position) {
final Friend friend = friendList.get(position);
getUserInfo(holder.profileImage, holder.NotificationUserName, friend.getSenderID());
holder.cancelRequestButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
FirebaseDatabase.getInstance().getReference("FriendRequest")
.child(friend.getRequestID()).removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
#Override
public void onComplete(#NonNull Task<Void> task) {
removeItem(position);
Toast.makeText(context, "removed", Toast.LENGTH_SHORT).show();
}
});
}
});
}
public void removeItem(int position) {
friendList.remove(position);
notifyDataSetChanged();
}
#Override
public int getItemCount() {
return friendList.size();
}
private void getUserInfo(final CircleImageView prfileImage, final TextView NotificationUserName, String senderID) {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users").child(senderID);
reference.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
Users users = dataSnapshot.getValue(Users.class);
NotificationUserName.setText(users.getUserName());
Picasso.with(context).load(users.getImageUrl()).into(prfileImage);
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
}
public class NotificationViewHolder extends RecyclerView.ViewHolder {
private TextView NotificationUserName;
private Button cancelRequestButton;
private CircleImageView profileImage;
public NotificationViewHolder(#NonNull View itemView) {
super(itemView);
NotificationUserName = itemView.findViewById(R.id.NotificationUserName);
cancelRequestButton = itemView.findViewById(R.id.cancelRequestBtn);
profileImage = itemView.findViewById(R.id.profileImage);
}
}
}
My APP Problems screenshot -
let I have two request
1) if I delete 2nd data 1st data show doubles:
2) if I delete 1st data, 1st data goes into 2nd row and 2nd data came into 1st row:
Replace
removeItem(position);
with
removeItem(holder.getAdapterPosition());
You initialize your recyclerView and adapter in onCreateView which was not appropriate.You have to override the method onViewCreated then initialize your recyclerView and adapter.try like this
public class NotificationFragment extends Fragment {
private RecyclerView NotificationRecyclerView;
private NotificationAdapter adapter;
private List<Friend> friendList;
public NotificationFragment() {
// Required empty public constructor
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_notification, container, false);
return view;
}
#Override
public void onViewCreated(#NonNull View view, #Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
NotificationRecyclerView = view.findViewById(R.id.NotificationRecyclerView);
NotificationRecyclerView.setHasFixedSize(true);
LinearLayoutManager LayoutManager = new LinearLayoutManager(getContext());
NotificationRecyclerView.setLayoutManager(LayoutManager);
friendList = new ArrayList<>();
adapter = new NotificationAdapter(getContext(), friendList);
NotificationRecyclerView.setAdapter(adapter);
readAllNotification();
}
private void readAllNotification() {
final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("FriendRequest");
reference.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Friend friend = snapshot.getValue(Friend.class);
if (firebaseUser.getUid().equals(friend.getReceiverID())) {
friendList.add(friend);
}
}
Collections.reverse(friendList);
adapter.notifyDataSetChanged();
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
}
Ok I just noticed you passed a parameter in removeItem method using holder.getAdapterPosition() which is causing your problem.Try to pass the position which is provided by public void onBindViewHolder(#NonNull final NotificationViewHolder holder, final int position).So the basic error is when you are in onBindViewHolder you don't need to use holder.getAdapterPosition() because onBindViewHolder already giving you the position
In your removeItem method use notifyDataSetChanged instead of notifyItemRemoved(position)
try like this
#Override
public void onBindViewHolder(#NonNull final NotificationViewHolder holder, final int position) {
final Friend friend = friendList.get(position);
holder.cancelRequestButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
FirebaseDatabase.getInstance().getReference("FriendRequest").child(friend.getRequestID()).removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
#Override
public void onComplete(#NonNull Task<Void> task) {
removeItem(position);
Toast.makeText(context, "removed", Toast.LENGTH_SHORT).show();
}
});
}
});
}
public void removeItem(int position) {
friendList.remove(position);
notifyDataSetChanged();
}

My list view is automatically populating when other users are using my application(Firebase,android)

Im using custom Adapter to populate my list view dynamically.Getting data from firebase realtime database. i dont want application to populate it with users who are using my application.because when everyone is offline listview stays normal.
This is whats happening
This is how it should be
i've tried everything i could. im using myadapter in 3/4 activities
My adapter.java
public class MyAdapter extends ArrayAdapter<String> {
ArrayList<String> name=new ArrayList<>();
ArrayList<String> status=new ArrayList<>();
ArrayList<String> imgs=new ArrayList<>();
ArrayList<String> key=new ArrayList<>();
private Context context;
private int resource;
private LayoutInflater layoutInflater;
public MyAdapter(#NonNull Context context, int resource, ArrayList<String> name, ArrayList<String> status, ArrayList<String> imgs,ArrayList<String> key) {
super(context, resource);
this.imgs=imgs;
this.name=name;
this.status=status;
this.key=key;
this.resource=resource;
this.context=context;
layoutInflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
#Override
public int getCount() {
return name.size();
}
#NonNull
#Override
public View getView(final int position, #Nullable View convertView, #NonNull ViewGroup parent) {
// return super.getView(position, convertView, parent);
View v=layoutInflater.inflate(resource,parent,false);
CircleImageView view=v.findViewById(R.id.single_user_image);
if(imgs!=null) {
Picasso.get().load(imgs.get(position)).placeholder(R.drawable.user).into(view);
}else{
Picasso.get().load(R.drawable.user).into(view);
Toasty.error(context,"check internet connection", Toast.LENGTH_SHORT).show();
}
TextView tv1=v.findViewById(R.id.single_user_name);
TextView tv2=v.findViewById(R.id.single_user_status);
tv1.setText(name.get(position));
tv2.setText("Connected Since:"+status.get(position));
v.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Intent intent=new Intent(getContext(),SingleUserProfileActivity.class);
intent.putExtra("key",key.get(position));
getContext().startActivity(intent);
}
});
return v;
}
}
Myactivity.java
public class ConnectedUsersFragment extends Fragment {
ListView connectedUsersList;
DatabaseReference connectedUsersReference;
DatabaseReference userInfoRefernce;
DatabaseReference presenceReference;
ArrayList<String> name=new ArrayList<>();
ArrayList<String> status=new ArrayList<>();
ArrayList<String> imgs=new ArrayList<>();
ArrayList<String> key=new ArrayList<>();
MyAdapter adapter;
FirebaseUser user;
public ConnectedUsersFragment() {
// Required empty public constructor
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v= inflater.inflate(R.layout.fragment_connected_users, container, false);
connectedUsersList=v.findViewById(R.id.connected_users_list);
user=FirebaseAuth.getInstance().getCurrentUser();
presenceReference=FirebaseDatabase.getInstance().getReference().child("users").child(user.getUid());
connectedUsersReference= FirebaseDatabase.getInstance().getReference().child("connected_users").child(user.getUid());
userInfoRefernce=FirebaseDatabase.getInstance().getReference().child("users");
adapter=new MyAdapter(getContext(),R.layout.single_user_layout,name,status,imgs,key);
connectedUsersList.setAdapter(adapter);
connectedUsersReference.addChildEventListener(new ChildEventListener() {
#Override
public void onChildAdded(#NonNull DataSnapshot dataSnapshot, #Nullable String s) {
String userKey=dataSnapshot.getKey();
final String userConnectedDate=dataSnapshot.child("date").getValue(String.class);
userInfoRefernce.child(userKey).addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
String userKey=dataSnapshot.getKey();
String username=dataSnapshot.child("name").getValue(String.class);
String userstatus=dataSnapshot.child("profile_status").getValue(String.class);
String userimg=dataSnapshot.child("thumb_image").getValue(String.class);
name.add(username);
status.add(userConnectedDate);
imgs.add(userimg);
key.add(userKey);
adapter.notifyDataSetChanged();
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
Toasty.error(getContext(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
#Override
public void onChildChanged(#NonNull DataSnapshot dataSnapshot, #Nullable String s) {
}
#Override
public void onChildRemoved(#NonNull DataSnapshot dataSnapshot) {
}
#Override
public void onChildMoved(#NonNull DataSnapshot dataSnapshot, #Nullable String s) {
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
Toasty.warning(getContext(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
return v;
}
#Override
public void onStart() {
super.onStart();
if(user!=null) {
presenceReference.child("online").setValue("true");
}
}
#Override
public void onResume() {
super.onResume();
if(user!=null) {
presenceReference.child("online").setValue("true");
}
}
#Override
public void onStop() {
super.onStop();
if(user!=null) {
presenceReference.child("online").setValue(ServerValue.TIMESTAMP);
}
}
#Override
public void onPause() {
super.onPause();
if(user!=null) {
presenceReference.child("online").setValue(ServerValue.TIMESTAMP);
}
}
}
In userInfoRefernce.child(userKey) you are setting a ValueEventListener that is triggered every time a user triggers any lifecycle event (see onStart, onResume, onPause and onStop). Try using a ChildEventListener and using a Query for filtering your data before downloading it.
Hope this helps you.
I replaced ValueEventListener() to ListenerForSingleValueEvent() as i wanted to show listen for event just once on these pages and thanks to #Victor Maldonado i remembered the difference :P

How to Use ViewPager Button On MainActivity Page?

How can I use Viewpager Adapter Button into MainActivity? I am developing a quiz app and I am comparing button value into MainActivity. How can I access ViewPagerAdapter class buttons In MainActivity?
#Override
protected void onStart() {
super.onStart();
Ref.child("Exam_Category").child("PRACTICE TEST").child("PREVIOUS YEAR PAPER'S").child(ct1).child(ct2).child("ENGLISH COMPREHENSION").addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
for (DataSnapshot data : dataSnapshot.getChildren()) {
key = data.getKey().toString();
Ref.child("Exam_Category").child("PRACTICE TEST").child("PREVIOUS YEAR PAPER'S").child(ct1).child(ct2).child("ENGLISH COMPREHENSION").child(String.valueOf(key))
.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
final questions studentDetails = dataSnapshot.getValue(questions.class);
list.add(studentDetails);
adapter = new RecyclerViewAdapter(Previous_Yr_Quiz.this, list);
viewPager.setAdapter(adapter);
}
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
}
}
//total_q.setText(Question_No +" / "+key);
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
This is My ViewPager Adapter
public class RecyclerViewAdapter extends PagerAdapter {
// Declare Variables
Context context;
LayoutInflater inflater;
public List<questions> list;
public RecyclerViewAdapter(Context context, List<questions> TempList) {
this.context = context;
this.list = TempList;
}
#Override
public int getCount() {
return list.size();
}
#Override
public boolean isViewFromObject(View view, Object object) {
return view == ((RelativeLayout) object);
}
#Override
public Object instantiateItem(ViewGroup container, final int position) {
// Declare Variables
TextView question;
final Button option1,option2,option3,option4;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View itemView = inflater.inflate(R.layout.quiz_layout_listview, container,
false);
// Locate the TextViews in viewpager_item.xml
question = (TextView)itemView.findViewById(R.id.question);
option1 = (Button) itemView.findViewById(R.id.optiona);
option2 = (Button) itemView.findViewById(R.id.optionb);
option3 = (Button) itemView.findViewById(R.id.optionc);
option4 = (Button) itemView.findViewById(R.id.optiond);
// Capture position and set to the TextViews
questions studentDetails = list.get(position);
question.setText(studentDetails.getQuestion());
option1.setText(studentDetails.getOption1());
option1.setId(position);
option2.setText(studentDetails.getOption2());
option3.setText(studentDetails.getOption3());
option4.setText(studentDetails.getOption4());
option1.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
option1.setBackgroundResource(R.drawable.wrong);
}
});
((ViewPager) container).addView(itemView);
return itemView;
}
#Override
public void destroyItem(ViewGroup container, int position, Object object) {
// Remove viewpager_item.xml from ViewPager
((ViewPager) container).removeView((RelativeLayout) object);
}
private int getItem(int i) {
return list.size();
}
}
How can used button options A, B, C, D OnClick in MainActivity because I compare button value into A, B, C, D buttons....
You have two options:
1) Make Buttons as class members and access them from your Activity by get methods.
2) Write an Interface that will have the callback methods so you know which Button is being clicked. Once you write the interface you pass it as a constructor parameter or by a set method. Something like:
interface QuizListener {
void answered(Button whichButton);
}
...
[RecyclerViewAdapter.java]
public RecyclerViewAdapter(Context context, List<questions> TempList, QuizListener quizListener) {
this.context = context;
this.list = TempList;
this.quizListener = quizListener;
}
...
option1.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
if (quizListener != null) {
quizListener.answered(option1);
}
option1.setBackgroundResource(R.drawable.wrong);
}
});

android: checkbox usage in fragment which contains recycler view

In my app about health, there is a fragment in which doctor can add or deny patient to his/her own patient list. I use a recyclerView to show all patients, in each items there are informations about patiens like names, birthday, city and a checkBox which shows patient is added or not. Top of the page there is another checkBox to select all patients, also there are add and deny textViews. I want to use these textViews to add or deny patients which is selected of their own checkBoxes. After click add textView patients will add to Firebase Database. I could not do that features.How can i do? Here is my codes:
public class FragmentHastaBasvurulari extends Fragment {
private ArrayList<String> hastaAdi=new ArrayList<>();
private ArrayList<String> hastaOzellikleri=new ArrayList<>();
private ArrayList<String> hastaliklar=new ArrayList<>();
private ArrayList<String> hastaOnayi=new ArrayList<>();
private ArrayList<Users> hastalar=new ArrayList<>();
private FirebaseAuth mAuth;
private FirebaseUser firebaseUser;
private FirebaseDatabase database;
private DatabaseReference myRef;
private RecyclerView rvHastaBasvuru;
private CheckBox checkBoxHepsiniSec;
private TextView tvReddet,tvOnayla;
#Override
public void onViewCreated(#NonNull View view, #Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getActivity().setTitle("Hasta Başvuruları");
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_hasta_basvurulari, container, false);
mAuth=FirebaseAuth.getInstance();
firebaseUser=mAuth.getCurrentUser();
database=FirebaseDatabase.getInstance();
myRef=database.getReference();
rvHastaBasvuru=(RecyclerView) view.findViewById(R.id.rvHastaBasvuru);
checkBoxHepsiniSec=(CheckBox) view.findViewById(R.id.checkBoxHepsiniSec);
tvOnayla=(TextView) view.findViewById(R.id.tvOnayla);
tvReddet=(TextView) view.findViewById(R.id.tvReddet);
myRef.child("kullanicilar")
.child(firebaseUser.getUid()).child("hastalar").addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot ds: dataSnapshot.getChildren()){
EklenecekHasta eklenecekHasta = ds.getValue(EklenecekHasta.class);
DatabaseReference hastaRef= FirebaseDatabase.getInstance().getReference().child("kullanicilar").child(eklenecekHasta.getUserId());
hastaRef.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
Users hasta = dataSnapshot.getValue(Users.class);
String sehir, dogumTarihi,hastaliklar1;
if(hasta.getSehir().equals("Seçiniz")){
sehir="---";
} else {
sehir=hasta.getSehir();
}
if(hasta.getDogumtarihi().equals("../../....")){
dogumTarihi="---";
} else {
dogumTarihi=hasta.getDogumtarihi();
}
if(hasta.getHastaliklar().equals("")){
hastaliklar1="---";
} else {
hastaliklar1=hasta.getHastaliklar();
}
hastaAdi.add(hasta.getAd()+" "+hasta.getSoyad());
hastaOzellikleri.add(hasta.getCinsiyet()+" "+sehir+" "+dogumTarihi);
hastaliklar.add(hastaliklar1);
hastaOnayi.add(hasta.getOnay());
hastalar.add(hasta);
}
rvHastaBasvuru.setAdapter(adapter);
rvHastaBasvuru.setLayoutManager(new LinearLayoutManager(getContext()));
adapter.notifyDataSetChanged();
}
#Override
public void onCancelled(DatabaseError error) {
}
});
}
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
HastaListesiAdapter adapter= new HastaListesiAdapter(getContext(),hastaAdi,hastaOzellikleri,hastaliklar,hastaOnayi,hastalar);
});
tvOnayla.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
}
});
tvReddet.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
}
});
return view;
}
Here is my adapter class codes:
public class HastaListesiAdapter extends RecyclerView.Adapter<HastaListesiAdapter.ViewHolder>{
private static final String TAG="HekimListesiAdapter";
private ArrayList<String> hastaAdi=new ArrayList<>();
private ArrayList<String> hastaOzellikleri=new ArrayList<>();
private ArrayList<String> hastaliklar=new ArrayList<>();
private ArrayList<String> hastaOnayi=new ArrayList<>();
private ArrayList<Users> hastalar=new ArrayList<>();
private Context myContext;
public HastaListesiAdapter(Context myContext, ArrayList<String> hastaAdi, ArrayList<String> hastaOzellikleri,
ArrayList<String> hastaliklar,ArrayList<String> hastaOnayi,ArrayList<Users> hastalar) {
this.hastaAdi = hastaAdi;
this.hastaOzellikleri = hastaOzellikleri;
this.myContext = myContext;
this.hastaliklar=hastaliklar;
this.hastaOnayi=hastaOnayi;
this.hastalar=hastalar;
}
#NonNull
#Override
public ViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int i) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.hasta_item,parent,false);
ViewHolder holder=new ViewHolder(view);
return holder;
}
#Override
public void onBindViewHolder(#NonNull final ViewHolder holder, final int i) {
holder.itemHastaAd.setText(hastaAdi.get(i));
holder.itemHastaOz.setText(hastaOzellikleri.get(i));
holder.itemHastaliklar.setText(hastaliklar.get(i));
//Hasta hekim tarafından onaylanmış mı onaylanmamış mı
if(hastaOnayi.get(i).equals("evet")){
holder.checkBoxHastaSec.setChecked(true);
} else if(hastaOnayi.get(i).equals("hayır")){
holder.checkBoxHastaSec.setChecked(false);
}
// CheckBox ın tıklanması üzerine yapılacak işlem
holder.checkBoxHastaSec.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
#Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
String secilimi;
if(buttonView.isChecked()){
secilimi="evet";
} else {
secilimi="hayır";
}
}
});
}
#Override
public int getItemCount() {
return hastaAdi.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView itemHastaAd,itemHastaOz,itemHastaliklar;
CheckBox checkBoxHastaSec;
public ViewHolder(#NonNull View itemView) {
super(itemView);
itemHastaAd=itemView.findViewById(R.id.itemHastaAd);
itemHastaOz= itemView.findViewById(R.id.itemHastaOz);
itemHastaliklar=itemView.findViewById(R.id.itemHastaliklar);
checkBoxHastaSec=itemView.findViewById(R.id.checkBoxHastaSec);
}
}
i suggest you to replace your string arrayLists with one arrayList of your custom model and also you can have a boolean for representing data in your checkbox.for example create a model like this:
class YourModel()
{
String hastaAdi;
String hastaOzellikleri;
//... another variables
Boolean isAdded;
//... set & get or other methods
}
now you should pass ArrayList to your adapter and set value for your recyclerView widgets by this arrayList. and then you can initialise or change checkBox value with your isAdded boolean.

Categories

Resources