I am trying to make android app for chatting when I send message done see it done but when I am trying to delete It nothing happens ... this is my adapter chat ... dialog message appear but when I am clicking on delete nothing happen ... when i am click on no dismiss dialog happen it is fine ... but nothing with delete ... any one can help me please ?
public class AdapterChat extends RecyclerView.Adapter<AdapterChat.MyHolder> {
private static final int MSG_TYPE_LEFT = 0;
private static final int MSG_TYPE_RIGHT = 1;
Context context;
List<Modelchat> chatList;
String imageUrl;
FirebaseUser fUser;
public AdapterChat(Context context, List<Modelchat> chatList, String imageUrl) {
this.context = context;
this.chatList = chatList;
this.imageUrl = imageUrl;
}
#NonNull
#Override
public MyHolder onCreateViewHolder(#NonNull ViewGroup viewGroup, int i) {
if (i == MSG_TYPE_RIGHT) {
View view = LayoutInflater.from(context).inflate(R.layout.row_chat_right, viewGroup, false);
return new MyHolder(view);
} else {
View view = LayoutInflater.from(context).inflate(R.layout.row_chat_left, viewGroup, false);
return new MyHolder(view);
}
}
#Override
public void onBindViewHolder(#NonNull MyHolder myHolder, final int i) {
String message = chatList.get(i).getMessage();
String timeStamp = chatList.get(i).getTimestamp();
Calendar cal = Calendar.getInstance(Locale.ENGLISH);
cal.setTimeInMillis(Long.parseLong(timeStamp));
String dataTime = DateFormat.format("dd/MM/yyyy hh:mm aa", cal).toString();
myHolder.messageTv.setText(message);
myHolder.timeTv.setText(dataTime);
try {
Picasso.get().load(imageUrl).into(myHolder.profileTv);
} catch (Exception e) {
}
//show delete dialog message
myHolder.messageLAyout.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Delete");
builder.setMessage("Are you sure to delete this message?");
builder.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
deleteMessage(i);
}
});
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
});
if (i == chatList.size() - 1) {
if (chatList.get(i).isSeen()) {
myHolder.isSeenTv.setText("Seen");
} else {
myHolder.isSeenTv.setText("Delivered");
}
} else {
myHolder.isSeenTv.setVisibility(View.GONE);
}
}
private void deleteMessage(int position) {
String myUID = FirebaseAuth.getInstance().getCurrentUser().getUid();
String msgTimeStamp = chatList.get(position).getTimestamp();
DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("Chats");
Query query = dbRef.orderByChild("timestamp").equalTo(msgTimeStamp);
query.addListenerForSingleValueEvent(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
if (ds.child("sender").getValue().equals(myUID)) {
// ds.getRef().removeValue();
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("message", "This message was deleted...");
ds.getRef().updateChildren(hashMap);
chatList.remove(i);
notifyItemRemoved(i);
notifyItemRangeChanged(i, chatList.size());
Toast.makeText(context, "message deleted...", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "You can delete only your messages...", Toast.LENGTH_SHORT).show();
}
}
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
}
#Override
public int getItemCount() {
return chatList.size();
}
#Override
public int getItemViewType(int position) {
fUser = FirebaseAuth.getInstance().getCurrentUser();
if (chatList.get(position).getSender().equals(fUser.getUid())) {
return MSG_TYPE_RIGHT;
} else {
return MSG_TYPE_LEFT;
}
}
class MyHolder extends RecyclerView.ViewHolder {
ImageView profileTv;
TextView messageTv, timeTv, isSeenTv;
LinearLayout messageLAyout;
public MyHolder(#NonNull View itemView) {
super(itemView);
profileTv = itemView.findViewById(R.id.profileTv);
messageTv = itemView.findViewById(R.id.messageTv);
timeTv = itemView.findViewById(R.id.timeTv);
isSeenTv = itemView.findViewById(R.id.isSeenTv);
messageLAyout = itemView.findViewById(R.id.messageLayout);
}
}
}
Emulator
I assume by delete you mean changing the text of the message to "This message was deleted...", if that is the case then the issue is that you update the database and don't update the object in the list:
Do this in deleteMessage(int position) function:
....
....
if (ds.child("sender").getValue().equals(myUID)) {
//ds.getRef().removeValue();
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("message", "This message was deleted...");
ds.getRef().updateChildren(hashMap);
Toast.makeText(context, "message deleted...", Toast.LENGTH_SHORT).show();
//here add these lines to update the list value.........
chatList.get(position).setMessage("This message was deleted...");
notifyDataSetChanged();
......
......
Just delete message success remove that position from list and notifyItemRemoved() try following code
if (ds.child("sender").getValue().equals(myUID)) {
// ds.getRef().removeValue();
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("message", "This message was deleted...");
ds.getRef().updateChildren(hashMap);
chatList.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, chatList.size());
Toast.makeText(context, "message deleted...", Toast.LENGTH_SHORT).show();
}
Related
holder.itemView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
//handle item clicks show item details (in bottom sheet)
detailBottomProduct(productModel);
}
});
private void detailBottomProduct(ProductModel productModel) {
final BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(context);
View view = LayoutInflater.from(context).inflate(R.layout.bs_product_details_seller,null);
//init View
ImageView productIconIv = view.findViewById(R.id.productIconIv);
TextView discountNoteTv = view.findViewById(R.id.discountNoteTv);
TextView titleTv = view.findViewById(R.id.titleTv);
TextView descriptionTv = view.findViewById(R.id.descriptionTv);
TextView categoryTv = view.findViewById(R.id.categoryTv);
TextView quantityTv = view.findViewById(R.id.quantityTv);
TextView discountPriceTv = view.findViewById(R.id.discountPriceTv);
TextView priceTv = view.findViewById(R.id.priceTv);
//get Data
final String id = productModel.getProductId();
String uid = productModel.getUid();
String discountAvailable = productModel.getDiscountAvailable();
String discountNote = productModel.getDiscountNote();
String discountPrice = productModel.getDiscountPrice();
String productCategory = productModel.getProductCategory();
String productIcon = productModel.getProductIcon();
final String title = productModel.getProductTitle();
String description = productModel.getProductDescription();
String productQuantity = productModel.getProductQuantity();
String timestamp = productModel.getTimestamp();
String actualPrice = productModel.getProductPrice();
//setData
titleTv.setText(title);
descriptionTv.setText(description);
categoryTv.setText(productCategory);
priceTv.setText("₹ "+ actualPrice);
quantityTv.setText(productQuantity);
discountPriceTv.setText("₹ "+discountPrice);
discountNoteTv.setText(discountNote);
if (discountAvailable.equals("true")){
//product is on discount
discountPriceTv.setVisibility(View.VISIBLE);
discountNoteTv.setVisibility(View.VISIBLE);
priceTv.setPaintFlags(priceTv.getPaintFlags()| Paint.STRIKE_THRU_TEXT_FLAG);
}
else {
//product is not on discount
discountPriceTv.setVisibility(View.GONE);
discountNoteTv.setVisibility(View.GONE);
}
try {
Glide.with(context).load(productIcon).into(productIconIv);
}
catch (Exception e){
productIconIv.setImageResource(R.drawable.ic_add_shopping_primary);
}
//set view
bottomSheetDialog.setContentView(view);
//show dialog
bottomSheetDialog.show(); // app crashed point (Line 173 )
}
Complete Adapter Code:
public class AdapterProductSeller extends
RecyclerView.Adapter<AdapterProductSeller.HolderProductSeller>
implements Filterable {
private Context context;
public ArrayList<ProductModel> productList,filterList;
private FilterProduct filter;
public AdapterProductSeller(Context context, ArrayList<ProductModel> productList) {
this.context = context;
this.productList = productList;
this.filterList = productList;
}
#NonNull
#Override
public HolderProductSeller onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
//inflate layout
View view = LayoutInflater.from(context).inflate(R.layout.row_product_seller,parent,false);
return new HolderProductSeller(view);
}
#Override
public void onBindViewHolder(#NonNull HolderProductSeller holder, int position) {
//getData
ProductModel productModel = productList.get(position);
String id = productModel.getProductId();
String uid = productModel.getUid();
String discountAvailable = productModel.getDiscountAvailable();
String discountNote = productModel.getDiscountNote();
String discountPrice = productModel.getDiscountPrice();
String productCategory = productModel.getProductCategory();
String productIcon = productModel.getProductIcon();
String title = productModel.getProductTitle();
String description = productModel.getProductDescription();
String productQuantity = productModel.getProductQuantity();
String timestamp = productModel.getTimestamp();
String actualPrice = productModel.getProductPrice();
//setData
holder.discountNoteTv.setText(discountNote);
holder.titleTv.setText(title);
holder.quantityTv.setText(productQuantity);
holder.discountPriceTv.setText("₹"+discountPrice);
if (discountAvailable.equals("true")){
//product is on discount
holder.discountPriceTv.setVisibility(View.VISIBLE);
holder.discountNoteTv.setVisibility(View.VISIBLE);
holder.priceTv.setPaintFlags(holder.priceTv.getPaintFlags()| Paint.STRIKE_THRU_TEXT_FLAG);
}
else {
//product is not on discount
holder.discountPriceTv.setVisibility(View.GONE);
holder.discountNoteTv.setVisibility(View.GONE);
}
try {
Glide.with(context).load(productIcon).into(holder.productIconIv);
}
catch (Exception e){
holder.productIconIv.setImageResource(R.drawable.ic_add_shopping_primary);
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
//handle item clicks show item details (in bottom sheet)
detailBottomProduct(productModel);
}
});
}
private void detailBottomProduct(ProductModel productModel) {
final BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(context);
View view = LayoutInflater.from(context).inflate(R.layout.bs_product_details_seller,null);
//init View
ImageButton backBtn = view.findViewById(R.id.backBtn);
ImageButton editBtn = view.findViewById(R.id.editBtn);
ImageButton deleteBtn = view.findViewById(R.id.deleteBtn);
ImageView productIconIv = view.findViewById(R.id.productIconIv);
TextView discountNoteTv = view.findViewById(R.id.discountNoteTv);
TextView titleTv = view.findViewById(R.id.titleTv);
TextView descriptionTv = view.findViewById(R.id.descriptionTv);
TextView categoryTv = view.findViewById(R.id.categoryTv);
TextView quantityTv = view.findViewById(R.id.quantityTv);
TextView discountPriceTv = view.findViewById(R.id.discountPriceTv);
TextView priceTv = view.findViewById(R.id.priceTv);
//get Data
final String id = productModel.getProductId();
String uid = productModel.getUid();
String discountAvailable = productModel.getDiscountAvailable();
String discountNote = productModel.getDiscountNote();
String discountPrice = productModel.getDiscountPrice();
String productCategory = productModel.getProductCategory();
String productIcon = productModel.getProductIcon();
final String title = productModel.getProductTitle();
String description = productModel.getProductDescription();
String productQuantity = productModel.getProductQuantity();
String timestamp = productModel.getTimestamp();
String actualPrice = productModel.getProductPrice();
//setData
titleTv.setText(title);
descriptionTv.setText(description);
categoryTv.setText(productCategory);
priceTv.setText("₹ "+ actualPrice);
quantityTv.setText(productQuantity);
discountPriceTv.setText("₹ "+discountPrice);
discountNoteTv.setText(discountNote);
if (discountAvailable.equals("true")){
//product is on discount
discountPriceTv.setVisibility(View.VISIBLE);
discountNoteTv.setVisibility(View.VISIBLE);
priceTv.setPaintFlags(priceTv.getPaintFlags()| Paint.STRIKE_THRU_TEXT_FLAG);
}
else {
//product is not on discount
discountPriceTv.setVisibility(View.GONE);
discountNoteTv.setVisibility(View.GONE);
}
try {
Glide.with(context).load(productIcon).into(productIconIv);
}
catch (Exception e){
productIconIv.setImageResource(R.drawable.ic_add_shopping_primary);
}
//set view
bottomSheetDialog.setContentView(view);
//show dialog
bottomSheetDialog.show();
// edit click
editBtn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
bottomSheetDialog.dismiss();
//open product activity
Intent intent = new Intent(context, EditProductActivity.class);
intent.putExtra("productId",id);
context.startActivity(intent);
}
});
//delete Btn
deleteBtn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
bottomSheetDialog.dismiss();
//show delete confirm dialog
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Delete")
.setMessage("Are you sure you want to delete product"+title+"?")
.setPositiveButton("DELETE", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
//delete
deleteProduct(id);
}
}).setNegativeButton("NO", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
//cancel dialog dismiss
dialog.dismiss();
}
})
.show();
}
});
//back btn
backBtn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
//dismiss bottom sheet
bottomSheetDialog.dismiss();
}
});
}
private void deleteProduct(String id) {
//delete product with string id
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Sellers");
reference.child(firebaseAuth.getUid()).child("products").child(id).removeValue()
.addOnSuccessListener(new OnSuccessListener<Void>() {
#Override
public void onSuccess(Void aVoid) {
Toast.makeText(context, "Product Deleted...", Toast.LENGTH_SHORT).show();
}
})
.addOnFailureListener(new OnFailureListener() {
#Override
public void onFailure(#NonNull Exception e) {
//failed deleting product
Toast.makeText(context, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
#Override
public int getItemCount() {
return productList.size();
}
#Override
public Filter getFilter() {
if (filter == null){
filter = new FilterProduct(this,filterList);
}
return filter;
}
class HolderProductSeller extends RecyclerView.ViewHolder{
/* holds view of recycler view */
private ImageView productIconIv,nextIv;
private TextView discountNoteTv,titleTv,quantityTv,
discountPriceTv,priceTv;
public HolderProductSeller(#NonNull View itemView) {
super(itemView);
productIconIv = itemView.findViewById(R.id.productIconIv);
nextIv = itemView.findViewById(R.id.nextIv);
discountNoteTv = itemView.findViewById(R.id.discountNoteTv);
titleTv = itemView.findViewById(R.id.titleTv);
quantityTv = itemView.findViewById(R.id.quantityTv);
quantityTv = itemView.findViewById(R.id.quantityTv);
discountPriceTv = itemView.findViewById(R.id.discountPriceTv);
priceTv = itemView.findViewById(R.id.priceTv);
}
}
}
When I clicked any items in the appFirebase showing the crashes closed an exception error occursLogcat showing Crashes
MY ORIGINAL QUESTION
I am making an android app with firebase Realtime database. I am getting sum of the firebase nodes in side recycler view. I have a text view out side the recycler view where I am getting the sub total of the values of the recycler view. MY PROBLEM is that I cannot get the actual sum and also the sum keeps increasing when I scroll up and down. Here is my Main activity JAVA code:
public class MainActivity extends AppCompatActivity {
FirebaseDatabase myfire;
DatabaseReference myRef;
private FirebaseRecyclerOptions<entry> options;
int totalEarned = 0;
int totalSpent = 0;
int totalSaved=0;
#Override
public void onBackPressed() {
final AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("Are you sure to exit?");
dialog.setPositiveButton("Play", (dialog1, which) -> {
});
dialog.setNegativeButton("Exit", (dialog12, which) -> {
FirebaseAuth.getInstance().signOut();
MainActivity.this.finish();
});
dialog.show();
}
private String getUID() {
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
if (mUser != null) {
String strUID = mUser.getUid();
if (!TextUtils.isEmpty(strUID)) {
return strUID;
}
}
return "";
}
#SuppressLint("SetTextI18n")
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//==============
final RecyclerView userlist = (RecyclerView) findViewById(R.id.idRecycleView);
myfire = FirebaseDatabase.getInstance();
userlist.setLayoutManager(new LinearLayoutManager(this));
//==================
final TextView tvTotalIncome = findViewById(R.id.idTotalIncome);
final TextView tvTotalExpanse = findViewById(R.id.idTotalExpanse);
final TextView tvTotalSaved = findViewById(R.id.idTotalSaved);
//==================
final FloatingActionButton btnBudget = findViewById(R.id.idCreateBudget);
myfire = FirebaseDatabase.getInstance();
final String strUID = getUID();
if (TextUtils.isEmpty(strUID)) {
//handle case of null UID
}
final Intent i = getIntent();
final String month = Objects.requireNonNull(i.getExtras()).getString("Month");
//-------------------------------
btnBudget.setOnClickListener(v -> {
Intent o;
o = new Intent(MainActivity.this, AddBudgetActivity.class);
o.putExtra("Month",month);
startActivity(o);
finish();
});
if (type.equals("Income")) {
try {
totalEarned = (totalEarned+sum);
} catch (NumberFormatException ex) {
}
tvTotalIncome.setText("-)"+String.valueOf( totalEarned));
holder.btnIcon.setBackgroundResource(R.drawable.circlegreen);
holder.tvEntry.setText("(+)"+String.valueOf(sum) );
try {
totalSaved = (totalEarned-totalSpent);
} catch (NumberFormatException ex) {
}
tvTotalSaved.setText("(=)"+String.valueOf( totalSaved));
}else if (type.equals("Expanse")) {
try {
totalSpent = (totalSpent+sum);
} catch (NumberFormatException ex) {
}
tvTotalExpanse.setText("-)"+String.valueOf( totalSpent));
holder.btnIcon.setBackgroundResource(R.drawable.circlered);
holder.tvEntry.setText("(-)"+String.valueOf(sum) );
try {
totalSaved = (totalEarned-totalSpent);
} catch (NumberFormatException ex) {
}
tvTotalSaved.setText("(=)"+String.valueOf( totalSaved));
}else {
Toast.makeText(MainActivity.this, " Something Went Wrong !", Toast.LENGTH_SHORT).show();
}
//======================
myRef = myfire.getReference().child("Data").child(strUID).child(month);
//-------------------------
options = new FirebaseRecyclerOptions.Builder<entry>()
.setQuery(myRef, entry.class)
.build();
final FirebaseRecyclerAdapter<entry, holder_menu> adapter = new FirebaseRecyclerAdapter<entry, holder_menu>(options) {
#Override
protected void onBindViewHolder(#NonNull #NotNull holder_menu holder, final int i, #NonNull #NotNull entry model) {
final String title = getRef(i).getKey();
assert title != null;
myRef = myfire.getReference().child("Data").child(strUID).child(month).child(title).child("Budget");
myRef.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
int budget = 0;
if (dataSnapshot.getValue() == null) {
Toast.makeText(getApplicationContext(), "Data Not Available", Toast.LENGTH_LONG).show();
} else {
final String stData1 = (Objects.requireNonNull(dataSnapshot.child("stData1").getValue())).toString();
final String stData2 = (Objects.requireNonNull(dataSnapshot.child("stData2").getValue())).toString();
final String stData3 = (Objects.requireNonNull(dataSnapshot.child("stData3").getValue())).toString();
final String stData4 = (Objects.requireNonNull(dataSnapshot.child("stData4").getValue())).toString();
entry basic = new entry(stData1, stData2, stData3, stData4);
String first = stData2.substring(0, 1);
holder.btnIcon.setText(first);
holder.tvHead.setText(stData2);
String type;
type=(stData3);
holder.tvBudget.setText("#" + stData4);
int amount = 0;
//important line
try {
amount = (Integer.parseInt(stData4));
} catch (NumberFormatException ex) {
}
//======================
budget = amount;
myRef = myfire.getReference().child("Data").child(strUID).child(month).child(title).child("Entry");
final int finalBudget = budget;
myRef.addValueEventListener(new ValueEventListener() {
int sum = 0;
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot data : dataSnapshot.getChildren()) {
String section = data.child("stData2").getValue(String.class);
String value = data.child("stData4").getValue(String.class);
assert value != null;
int total = 0;
//important line
try {
total = (Integer.parseInt(value));
} catch (NumberFormatException ex) {
}
//======================
sum = sum + total;
//==============
//======================
if (section.equals("Saving")) {
holder.tvHead.setBackgroundColor(getResources().getColor(R.color.saving));
}else if (section.equals("Paying")) {
holder.tvHead.setBackgroundColor(getResources().getColor(R.color.paying));
}else if (section.equals("Using")) {
holder.tvHead.setBackgroundColor(getResources().getColor(R.color.using));
}else if (section.equals("Earning")) {
holder.tvHead.setBackgroundColor(getResources().getColor(R.color.earning));
}else if (section.equals("Taking")) {
holder.tvHead.setBackgroundColor(getResources().getColor(R.color.taking));
}else if (section.equals("Drawing")) {
holder.tvHead.setBackgroundColor(getResources().getColor(R.color.drawing));
}else {
Toast.makeText(MainActivity.this, " Something Went Wrong !", Toast.LENGTH_SHORT).show();
}
}
holder.tvEntry.setText("(+)" + String.valueOf(sum) );
holder.tvBalance.setText("(=)" + String.valueOf(finalBudget - sum) );
//important line
holder.btnView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Intent o;
o = new Intent(MainActivity.this, ViewHistoryActivity.class);
o.putExtra("Title", title);
o.putExtra("Month", month);
o.putExtra("Type", type);
startActivity(o);
finish();
}
});
holder.btnAdd.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
if (type.equals("Income")) {
Intent o;
o = new Intent(MainActivity.this, EntryIncomeActivity.class);
o.putExtra("Title", title);
o.putExtra("Month", month);
o.putExtra("Type", type);
startActivity(o);
finish();
}else if (type.equals("Expanse")) {
Intent o;
o = new Intent(MainActivity.this, EntryExpanseActivity.class);
o.putExtra("Title", title);
o.putExtra("Month", month);
o.putExtra("Type", type);
startActivity(o);
finish();
}else {
Toast.makeText(MainActivity.this, " Something Went Wrong !", Toast.LENGTH_SHORT).show();
}
}
});
if (type.equals("Income")) {
try {
totalEarned = (totalEarned+sum);
} catch (NumberFormatException ex) {
}
tvTotalIncome.setText("-)"+String.valueOf( totalEarned));
holder.btnIcon.setBackgroundResource(R.drawable.circlegreen);
holder.tvEntry.setText("(+)"+String.valueOf(sum) );
try {
totalSaved = (totalEarned-totalSpent);
} catch (NumberFormatException ex) {
}
tvTotalSaved.setText("(=)"+String.valueOf( totalSaved));
}else if (type.equals("Expanse")) {
try {
totalSpent = (totalSpent+sum);
} catch (NumberFormatException ex) {
}
tvTotalExpanse.setText("-)"+String.valueOf( totalSpent));
holder.btnIcon.setBackgroundResource(R.drawable.circlered);
holder.tvEntry.setText("(-)"+String.valueOf(sum) );
try {
totalSaved = (totalEarned-totalSpent);
} catch (NumberFormatException ex) {
}
tvTotalSaved.setText("(=)"+String.valueOf( totalSaved));
}else {
Toast.makeText(MainActivity.this, " Something Went Wrong !", Toast.LENGTH_SHORT).show();
}
//======================
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}
});
}
}
#Override
public void onCancelled(#NonNull DatabaseError error) {
throw error.toException(); // never ignore errors
}
});
}
#NonNull
#Override
public holder_menu onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item1, parent, false);
return new holder_menu(v);
}
};
adapter.startListening();
userlist.setAdapter(adapter);
}
}
EDITED QUESTION As per #androidLearner 's suggestion
MAIN ACTIVITY
public class MainActivity extends AppCompatActivity {
FirebaseDatabase myfire;
DatabaseReference myRef;
int totalEarned = 0;
int totalSpent = 0;
int totalSaved=0;
madapter adapter;
String iconsData;
String headsData;
int budgetsData=0;
int enteriesData=0;
int balancesData=0;
#Override
public void onBackPressed() {
final AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("Are you sure to exit?");
dialog.setPositiveButton("Play", (dialog1, which) -> {
});
dialog.setNegativeButton("Exit", (dialog12, which) -> {
FirebaseAuth.getInstance().signOut();
MainActivity.this.finish();
});
dialog.show();
}
private String getUID() {
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
if (mUser != null) {
String strUID = mUser.getUid();
if (!TextUtils.isEmpty(strUID)) {
return strUID;
}
}
return "";
}
#RequiresApi(api = Build.VERSION_CODES.N)
#SuppressLint("SetTextI18n")
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//==============
final RecyclerView userlist = (RecyclerView) findViewById(R.id.idRecycleView);
myfire = FirebaseDatabase.getInstance();
userlist.setLayoutManager(new LinearLayoutManager(this));
//==================
final TextView tvTotalIncome = findViewById(R.id.idTotalIncome);
final TextView tvTotalExpanse = findViewById(R.id.idTotalExpanse);
final TextView tvTotalSaved = findViewById(R.id.idTotalSaved);
//==================
final FloatingActionButton btnBudget = findViewById(R.id.idCreateBudget);
myfire = FirebaseDatabase.getInstance();
final String strUID = getUID();
if (TextUtils.isEmpty(strUID)) {
//handle case of null UID
}
final Intent i = getIntent();
final String month = Objects.requireNonNull(i.getExtras()).getString("Month");
//-------------------------------
btnBudget.setOnClickListener(v -> {
Intent o;
o = new Intent(MainActivity.this, AddBudgetActivity.class);
o.putExtra("Month",month);
startActivity(o);
finish();
});
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&---new method
myRef = myfire.getReference().child("Data").child(strUID).child(month);
myRef.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot data : dataSnapshot.getChildren()) {
String title = dataSnapshot.getKey();
assert title != null;
myRef = myfire.getReference().child("Data").child(strUID).child(month).child(title).child("Budget");
myRef.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() == null) {
Toast.makeText(getApplicationContext(), "Data Not Available", Toast.LENGTH_LONG).show();
} else {
final String stData1 = (Objects.requireNonNull(dataSnapshot.child("stData1").getValue())).toString();
final String stData2 = (Objects.requireNonNull(dataSnapshot.child("stData2").getValue())).toString();
final String stData3 = (Objects.requireNonNull(dataSnapshot.child("stData3").getValue())).toString();
final String stData4 = (Objects.requireNonNull(dataSnapshot.child("stData4").getValue())).toString();
entry basic = new entry(stData1, stData2, stData3, stData4);
iconsData = stData2.substring(0, 1);
headsData=stData2;
//---------------------------------------------------------------------------entry
myRef = myfire.getReference().child("Data").child(strUID).child(month).child(title).child("Entry");
myRef.addValueEventListener(new ValueEventListener() {
int sum = 0;
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot data : dataSnapshot.getChildren()) {
String section = data.child("stData2").getValue(String.class);
String value = data.child("stData4").getValue(String.class);
assert value != null;
int total = 0;
try {
total=(Integer.parseInt(value));
} catch (NumberFormatException ex) {
}
//==============
sum=sum+total;
}
enteriesData=sum;
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}
});
}
}
#Override
public void onCancelled(#NonNull DatabaseError error) {
throw error.toException(); // never ignore errors
}
});
}
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}
});
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&------NewMethod
balancesData=budgetsData-enteriesData;
ArrayList<String> iconList = new ArrayList<>();
iconList.add(iconsData);
ArrayList<String> headList= new ArrayList<>();
headList.add(headsData);
ArrayList<Integer> budgetList = new ArrayList<>();
budgetList.add(budgetsData);
ArrayList<Integer> entryList = new ArrayList<>();
entryList.add(enteriesData);
ArrayList<Integer> balanceList = new ArrayList<>();
balanceList.add(balancesData);
adapter = new madapter ( this, iconList,headList,budgetList,entryList,balanceList);
userlist.setAdapter(adapter);
}
}
RECYCLER VIEW Adapter
public class madapter extends RecyclerView.Adapter<madapter.ViewHolder> {
private List<String> stricon;
private List<String> strhead;
private List<Integer> intbudget;
private List<Integer> intentry;
private List<Integer> intbalance;
//---
private LayoutInflater mInflater;
private ItemClickListener mClickListener;
// data is passed into the constructor
public madapter(MainActivity mainActivity, ArrayList<String> iconList, ArrayList<String> headList, ArrayList<Integer> budgetList, ArrayList<Integer> entryList, ArrayList<Integer> balanceList) {
this.mInflater = LayoutInflater.from(mainActivity);
this.stricon = iconList;
this.strhead = headList;
this.intbudget = budgetList;
this.intentry = entryList;
this.intbalance= balanceList;
}
// inflates the row layout from xml when needed
#Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.item1, parent, false);
return new ViewHolder(view);
}
// binds the data to the TextView in each row
#Override
public void onBindViewHolder(ViewHolder holder, int position) {
String icons = stricon.get(position);
String heads = strhead.get(position);
int budgets = intbudget.get(position);
int entries = intentry.get(position);
int balances = intbalance.get(position);
holder.btnIcon.setText(icons);
holder.tvHead.setText(heads);
holder.tvBudget.setText(String.valueOf(budgets));
holder.tvEntry.setText(String.valueOf(entries));
holder.tvBalance.setText(String.valueOf(balances));
}
// total number of rows
#Override
public int getItemCount() {
return stricon.size();
}
// stores and recycles views as they are scrolled off screen
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public Button btnIcon;
public TextView tvHead;
public TextView tvBudget;
public TextView tvEntry;
public TextView tvBalance;
public Button btnView;
public Button btnAdd;
ViewHolder(View itemView) {
super(itemView);
btnIcon= (Button) itemView.findViewById(R.id.idIcon);
tvHead = (TextView) itemView.findViewById(R.id.idHead);
tvBudget = (TextView) itemView.findViewById(R.id.idBudget);
tvEntry = (TextView) itemView.findViewById(R.id.idEntry);
tvBalance = (TextView) itemView.findViewById(R.id.idBalance);
btnView= (Button) itemView.findViewById(R.id.idView);
btnAdd = (Button) itemView.findViewById(R.id.idAdd);
itemView.setOnClickListener(this);
}
#Override
public void onClick(View view) {
if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
}
}
// convenience method for getting data at click position
String getItem(int id) {
return stricon.get(id);
}
// parent activity will implement this method to respond to click events
public interface ItemClickListener {
void onItemClick(View view, int position);
}
}
THE NEW PROBLEM AFTER EDITING
I am not able to get any data from firebase to my array list by the method datasnapshot. But yes my recycler view shows data if I add hardcore text or numbers to my list manually.
This is the crash report
2021-05-24 00:07:12.368 19933-19933/com.myappname E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myappname, PID: 19933
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.get(ArrayList.java:437)
at com.myappname.model.rvAdapter.onBindViewHolder(mAdapter.java:54)
at com.myappname.model.rvAdapter.onBindViewHolder(mAdapter.java:16)2021-05-24 .......................................
set Adapter after got data from firebase
myRef.addValueEventListener(new ValueEventListener() {
int sum = 0;
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot data : dataSnapshot.getChildren()) {
String section = data.child("stData2").getValue(String.class);
String value = data.child("stData4").getValue(String.class);
assert value != null;
int total = 0;
//==============
sum=sum+total;
}
enteriesData=sum;
//Send your data to adapter as per your need from here
adapter = new madapter ( this, iconList,headList,budgetList,entryList,balanceList);
userlist.setAdapter(adapter);
}
Hi I have switch button (switchTaskFinished) on my recycler view,when I am clicking any button, the last button is getting selected. Also when I press button it updates the data to firebase. And changes the button status accordingly. But even though buttons value is true it only updates last button status not others.
public class MyAdaptorUser extends RecyclerView.Adapter<MyAdaptorUser.myViewHolder> {
private Context context;
private ArrayList<TaskModel> taskLists;
private Switch switchTaskFinished;
private OnTaskClickListner mTaskListner;
private AlertDialog dialog;
private AlertDialog.Builder builder;
private TaskConfirmationSender taskConfirmationSender;
public MyAdaptorUser(Context c, ArrayList<TaskModel> t, OnTaskClickListner onTaskClickListner) {
context = c;
taskLists = t;
this.mTaskListner = onTaskClickListner;
}
#NonNull
#Override
public MyAdaptorUser.myViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
builder = new AlertDialog.Builder(parent.getContext());
builder.setTitle("Please Wait").setView(R.layout.my_progress_view).setCancelable(false);
dialog = builder.create();
return new MyAdaptorUser.myViewHolder(LayoutInflater.from(context).inflate(R.layout.task_preview, parent, false), mTaskListner);
}
#Override
public void onBindViewHolder(#NonNull MyAdaptorUser.myViewHolder holder, final int position) {
//Set title and description to task preview textviews
holder.title.setText(taskLists.get(position).getTaskTitle());
holder.dueDate.setText(taskLists.get(position).getDueDate());
holder.description.setText(taskLists.get(position).getTaskDescription());
//Sets the path of database to taskAwatingConfirmation/task_title/UserEmail
final DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference();
try {
String email = FirebaseAuth.getInstance().getCurrentUser().getEmail();
email = removeSpecialCharacter(email);
final DatabaseReference taskConfirmationRef = dbRef
.child("taskAwatingConfirmation")
.child(taskLists.get(position).getTaskTitle())
.child(email);
taskConfirmationRef.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
//Fetching switchButton Status (Task finished) from database
switchTaskFinished.setChecked(false);
String buttonStatus = (String) dataSnapshot.child("buttonStatus").getValue();
if (buttonStatus != null) {
Log.d("taskerror", buttonStatus);
if (buttonStatus.equals("true")) {
switchTaskFinished.setChecked(true);
} else if (buttonStatus.equals("false")) {
switchTaskFinished.setChecked(false);
}
}
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
switchTaskFinished.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
#Override
public void onCheckedChanged(final CompoundButton buttonView, boolean isChecked) {
//dialog = builder.show();
taskConfirmationSender = new TaskConfirmationSender();
//When Task Finished button is clicked send data to database
sendConfirmationToAdmin(new FirebaseCallBack() {
#Override
public void Callback(TaskConfirmationSender taskConfirmationSender) {
taskConfirmationSender.setButtonStatus(String.valueOf(buttonView.isChecked()));
taskConfirmationSender.setTaskDueDate(taskLists.get(position).getDueDate());
if (buttonView.isChecked()) {
taskConfirmationRef.setValue(taskConfirmationSender).addOnSuccessListener(new OnSuccessListener<Void>() {
#Override
public void onSuccess(Void aVoid) {
dialog.dismiss();
}
});
}else{
taskConfirmationRef.setValue(taskConfirmationSender).addOnSuccessListener(new OnSuccessListener<Void>() {
#Override
public void onSuccess(Void aVoid) {
dialog.dismiss();
}
});
}
}
});
}
});
} catch (NullPointerException ignored) {
dialog.dismiss();
}
}
private String removeSpecialCharacter(String email) {
StringBuffer sbf = new StringBuffer(email);
email = String.valueOf(sbf.reverse());
int length = email.length();
email = email.substring(4, length);
StringBuffer stringBuffer = new StringBuffer(email);
email = String.valueOf(stringBuffer.reverse());
return email.replace("#", "_");
}
private void sendConfirmationToAdmin(final FirebaseCallBack firebaseCallBack) {
DatabaseReference volunteerRef = FirebaseDatabase.getInstance().getReference()
.child("Volunteer").child("Member")
.child(FirebaseAuth.getInstance().getCurrentUser().getUid());
taskConfirmationSender = new TaskConfirmationSender();
try {
//Fetching details of users (full name, email) from database and setting their value to taskConfirmation Object
volunteerRef.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
String userName = dataSnapshot.child("fullName").getValue().toString();
String userEmail = dataSnapshot.child("email").getValue().toString();
String userId = dataSnapshot.getKey();
//TODO: Fetch UID of user and set it to taskConfirmation OBject
taskConfirmationSender.setUserEmail(userEmail);
taskConfirmationSender.setUserName(userName);
taskConfirmationSender.setId(userId);
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
String submissionDate = day + "/" + month + "/" + year;
taskConfirmationSender.setSubmissionDate(submissionDate);
firebaseCallBack.Callback(taskConfirmationSender);
/**/
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
} catch (NullPointerException ee) {
}
}
private interface FirebaseCallBack {
void Callback(TaskConfirmationSender taskConfirmationSender);
}
#Override
public int getItemCount() {
return taskLists.size();
}
class myViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView title, dueDate, description;
OnTaskClickListner onTaskClickListner;
public myViewHolder(#NonNull View itemView, OnTaskClickListner onTaskClickListner) {
super(itemView);
title = itemView.findViewById(R.id.taskTitle);
dueDate = itemView.findViewById(R.id.taskDueDate);
description = itemView.findViewById(R.id.taskDescription);
switchTaskFinished = itemView.findViewById(R.id.switchTaskFinished);
this.onTaskClickListner = onTaskClickListner;
ConstraintLayout taskBar = itemView.findViewById(R.id.linearLayoutTaskBar);
itemView.setOnClickListener(this);
//hides delete task button
taskBar.setVisibility(View.GONE);
}
#Override
public void onClick(View v) {
onTaskClickListner.onTaskClick(getAdapterPosition());
}
}
public interface OnTaskClickListner {
void onTaskClick(int position);
}
}
Maybe its because of the valueEventListener that stays attached:
Instead of this:
taskConfirmationRef.addValueEventListener(new ValueEventListener() {.........
Do this:
taskConfirmationRef.addListenerForSingleValueEvent(new ValueEventListener() {......
And set the switch to checked or unchecked when you turn on or off:
if (buttonView.isChecked()) {
//here
switchTaskFinished.setChecked(true);
taskConfirmationRef.setValue(taskConfirmationSender).addOnSuccessListener(new OnSuccessListener<Void>() {
#Override
public void onSuccess(Void aVoid) {
dialog.dismiss();
}
});
}else{
//here
switchTaskFinished.setChecked(false);
...................
I have a fire node by the name of myHire which has a child which is identified by the current user id (whoever is logged in), The child further below the current user id node is the PostNode which can be anything and below postnode, lies the id,s of all those people who are interacting with the post. the postnode id and peopleInvolvedNode id in the postnode are not known to me by some specific identifier so i am trying to retreive their keys and values using ValueEventListener/onDataChange loop. my problem arises when the the loop only retrieve the last node child and ignored the all the node which are above.
I am trying to solve this from a very long time. So any help would be appreciated
Thank You and have a nice day
This is my database structure to help understanding the question precisely
Below is my code
myHire = FirebaseDatabase.getInstance().getReference().child("My Hire").child(currentUserID);
myHire.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot child1 : dataSnapshot.getChildren()) {
String checkKeys1 = child1.getKey();
Query query = myHire.child(checkKeys1);
FirebaseRecyclerOptions<hiredListDetails> options = new FirebaseRecyclerOptions.Builder<hiredListDetails>()
.setQuery(query, hiredListDetails.class).build();
final FirebaseRecyclerAdapter<hiredListDetails, MyViewHolder> adapter =
new FirebaseRecyclerAdapter<hiredListDetails, MyViewHolder>(options) {
#Override
protected void onBindViewHolder(#NonNull final MyViewHolder holder, int position, #NonNull final hiredListDetails model) {
Log.d(TAG, "onBindViewHolder: call 4");
holder.topic.setText(model.getWorktitle());
Log.d(TAG, "onBindViewHolder: the topic is "+model.getWorktitle());
holder.hiredPersonName.setText(model.getHiredpersonname());
holder.hiredPersonBidPrice.setText(model.getHiredpersonprice() + " BD");
String givenDateString = model.getCurrentdateandtime();
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy, HH:mm");
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Bahrain"));
long timeInMilliseconds = 0;
try {
Date mDate = sdf.parse(givenDateString);
timeInMilliseconds = mDate.getTime();
} catch (ParseException e) {
e.printStackTrace();
}
final CharSequence ch = DateUtils.getRelativeTimeSpanString(timeInMilliseconds, System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS);
holder.timeAgo.setText(ch);
Picasso.get().load(model.getHiredpersonimage()).placeholder(R.drawable.profile)
.into(holder.hiredPersonPic);
holder.requestTracker.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
String clickedRecyclerKey = getRef(holder.getAdapterPosition()).getKey();
Log.d(TAG, "onClick: clicked Recycler key is " + clickedRecyclerKey);
String checkStatusForTracking = model.getActivatelocation();
if (checkStatusForTracking.equalsIgnoreCase("True")) {
Intent intent = new Intent(getContext(), TrackUserMap.class);
startActivity(intent);
} else {
getLocationRequest(clickedRecyclerKey);
Toast.makeText(getContext(), "Please wait while the tracking process is completed",
Toast.LENGTH_LONG).show();
}
}
});
String checkStatusForTracking = model.getActivatelocation();
if (checkStatusForTracking.equalsIgnoreCase("Request")) {
holder.requestTrackerStatusMark.setImageDrawable(getResources().getDrawable(R.drawable.statusyellow));
} else if (checkStatusForTracking.equalsIgnoreCase("True")) {
holder.requestTrackerStatusMark.setImageDrawable(getResources().getDrawable(R.drawable.statusgreen));
}
loadingBar.dismiss();
}
#NonNull
#Override
public MyViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.hired_individual_row_layout, parent, false);
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
};
myHiredList.setAdapter(adapter);
adapter.startListening();
}
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
});
I'm working on a chat app. In this app I want to sort contact lists with latest message timestamp.
adapter = new ContactListAdapter(ob1, getActivity(), fusername);
if (!adapted) {
chatLists.setAdapter(adapter);
adapted = true;
}else {
adapter.updateList(ob1, getActivity(), fusername);
}
Here setAdapter works fine and updating the complete recyclerview with setAdapter works fine too. But it reloads the complete view with all data like image and user message. So I just want to refresh the index without loading all data again.
On the above code. adapted is a boolean value. It's initial value is false. And after setting the adapter initial value changes to true. Then to update the adapter I call updateList function.
public class ContactListAdapter extends RecyclerView.Adapter<ContactListAdapter.viewHolder>{
com.google.firebase.database.DataSnapshot d;
Context c;
JsonParser parser = new JsonParser();
String username;
ArrayList<ChatroomLists> ob1 = new ArrayList<ChatroomLists>();
public ContactListAdapter(ArrayList<ChatroomLists> ob1, Context c, String fusername) {
this.c = c;
this.username = fusername;
this.ob1.addAll(ob1);
}
public void updateList(ArrayList<ChatroomLists> ob1, Context c, String fusername) {
this.ob1.clear();
this.ob1.addAll(ob1);
this.notifyDataSetChanged();
}
public class viewHolder extends RecyclerView.ViewHolder {
CircleImageView user_img;
ImageView message_stats;
TextView user_name;
TextView user_message;
TextView timestamp;
CircleImageView unreadbadge;
public viewHolder(View itemView) {
super(itemView);
user_img = (CircleImageView) itemView.findViewById (R.id.user_img_list);
user_name = (TextView) itemView.findViewById (R.id.contact_name);
user_message = (TextView) itemView.findViewById (R.id.user_message);
message_stats = (ImageView) itemView.findViewById (R.id.message_status);
timestamp = (TextView)itemView.findViewById(R.id.time);
unreadbadge = (CircleImageView) itemView.findViewById(R.id.unread);
}
}
#Override
public viewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.chat_list_style, parent, false);
return new viewHolder(v);
}
#Override
public void onBindViewHolder(viewHolder holder, int position) {
ChatroomLists chatroomLists = ob1.get(position);
Iterator<ChatroomLists> iter = ob1.iterator();
String id = chatroomLists.getId();
String time = chatroomLists.getTimestamp();
Handler h = new Handler();
FirebaseDatabase.getInstance().getReference().child("unread").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("chatrooms").addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(DataSnapshot dataSnapshot) {
try{
if (dataSnapshot.hasChild(id)){
holder.unreadbadge.setVisibility(View.VISIBLE);
}else {
holder.unreadbadge.setVisibility(View.GONE);
}
}catch (Exception e){
}
}
#Override
public void onCancelled(DatabaseError databaseError) {
}
});
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
#Override
public void run() {
try{
long mtime = TimeUnit.MILLISECONDS.toMinutes(System.currentTimeMillis())-TimeUnit.MILLISECONDS.toMinutes(Long.parseLong(time));
if (mtime<60){
holder.timestamp.setText(String.valueOf(mtime)+ " mins");
if (mtime==1)
holder.timestamp.setText(1+ " min");
else if (mtime<1){
holder.timestamp.setText("Just Now");
}
else
holder.timestamp.setText(mtime+ " mins");
}
else if (mtime>60 && mtime<1440){
if (mtime/60==1)
holder.timestamp.setText(String.valueOf(mtime/60)+ " hour");
else
holder.timestamp.setText(String.valueOf(mtime/60)+ " hours");
}
else if (mtime>=1440&&mtime<10080){
if (mtime/1440==1)
holder.timestamp.setText(String.valueOf(mtime/1440)+ " day");
else
holder.timestamp.setText(String.valueOf(mtime/1440)+ " days");
}else if(mtime>10080&&mtime<3679200){
if (mtime/10080==1)
holder.timestamp.setText(String.valueOf(mtime/10080)+ " week");
else
holder.timestamp.setText(String.valueOf(mtime/10080)+ " weeks");
}else if(mtime>3679200){
if (mtime/3679200==1)
holder.timestamp.setText(String.valueOf(mtime/3679200)+ " year");
else
holder.timestamp.setText(String.valueOf(mtime/3679200)+ " years");
}
}catch (Exception e){
}
h.postDelayed(this,60000);
}
},60000);
FirebaseDatabase.getInstance().getReferenceFromUrl("https://droidchatz.firebaseio.com/groupchat/" + id + "/chat").limitToLast(1).addValueEventListener(new com.google.firebase.database.ValueEventListener() {
#Override
public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) {
for (com.google.firebase.database.DataSnapshot d: dataSnapshot.getChildren()){
if (dataSnapshot.child(d.getKey()).child("type").getValue(String.class).equals("text"))
holder.user_message.setText (dataSnapshot.child(d.getKey()).child("message").getValue(String.class));
else if(dataSnapshot.child(d.getKey()).child("type").getValue(String.class).equals("video"))
holder.user_message.setText ("New Video Message");
else if(dataSnapshot.child(d.getKey()).child("type").getValue(String.class).equals("image"))
holder.user_message.setText ("New Image Message");
else if(dataSnapshot.child(d.getKey()).child("type").getValue(String.class).equals("gif"))
holder.user_message.setText ("New GIF Message");
else if(dataSnapshot.child(d.getKey()).child("type").getValue(String.class).equals("file"))
holder.user_message.setText ("New Document");
else {
holder.user_message.setText (dataSnapshot.child(d.getKey()).child("message").getValue(String.class));
}
}
}
#Override
public void onCancelled(DatabaseError databaseError) {
}
});
FirebaseDatabase.getInstance().getReferenceFromUrl("https://droidchatz.firebaseio.com/groups/"+id+"/image").addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() {
#Override
public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) {
try{
Glide
.with(c)
.load(dataSnapshot.getValue(String.class))
.asBitmap()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.dontAnimate()
.into(new SimpleTarget<Bitmap>() {
#Override
public void onResourceReady(Bitmap arg0, GlideAnimation<? super Bitmap> arg1) {
holder.user_img.setImageBitmap(arg0);
}});
}catch (Exception e){
}
}
#Override
public void onCancelled(DatabaseError databaseError) {
}
});
holder.user_name.setText (id);
holder.itemView.setOnClickListener (new View.OnClickListener () {
#Override
public void onClick(View v) {
Intent intent = new Intent (c, ChatRoom.class);
intent.putExtra("username",username);
intent.putExtra ("group_name", id);
c.startActivity (intent);
}
});
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public int getItemViewType(int position) {
return position;
}
#Override
public int getItemCount() {
return ob1.size();
}
}
So what am I doing wrong?
You just have to add values to your ob1 object and call adapter.notifyDataSetChanged(); to update your list.
Initialize your adapter only once and populate the ob1 list.
You are storing your activity ArrayList reference into your adapter ArrayList reference:
this.ob1 = ob1;
change in your adapter constructor, try it once:
public ContactListAdapter(ArrayList<ChatroomLists> ob1, Context c, String fusername) {
this.c = c;
this.username = fusername;
this.ob1.addAll(ob1);
}