Issue
okay, so i got a listView in my android app to display messages, everything has been going good ever since i got help on time but now i got a bug where the last message wont show.
the message part wont show if its a "system" message. this is linked to firebase.
but when i get the data it all works good for each item besides for the type of message.
// this is what the message looks like in the database
"messages": "hi",
"number": "1",
"pfp": "",
"time": "2022-04-22T00:39:00.520Z",
// this tells the app what type of message it is
"type": "user",
"user_uid": "user id",
"username": "frugalnormal"
even switched to the recycleview and same thing
note: i just put a toast to tell me if it thinks the message is system and sure enough every timeenter image description here i send a "user" message it tells me that its a system message and wont show that part but can still show the time
also the time is supposed to appear over a text message
Update: okay so I've tired pretty much everything now the last message shows but the app still thinks the last message is always a "system" message
And also so the switch returns both somehow "User" and "system" for some reason
update2: So now I'm really confused, scrolling through it makes the system message thing happen randomly on different messages
UPDATE 3 /////////////////////////////////////////////////////////////////////////////// CODE FOR THE WHOLE ADAPTER:
this is for applying the data to the view:
_ch_child_listener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot _param1, String _param2) {
GenericTypeIndicator<HashMap<String, Object>> _ind = new GenericTypeIndicator<HashMap<String, Object>>() {};
final String _childKey = _param1.getKey();
final HashMap<String, Object> _childValue = _param1.getValue(_ind);
ch.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot _dataSnapshot) {
lop = new ArrayList<>();
try {
GenericTypeIndicator<HashMap<String, Object>> _ind = new GenericTypeIndicator<HashMap<String, Object>>() {};
for (DataSnapshot _data : _dataSnapshot.getChildren()) {
HashMap<String, Object> _map = _data.getValue(_ind);
lop.add(_map);
}
}
catch (Exception _e) {
_e.printStackTrace();
}
listview2.setAdapter(new Listview2Adapter(lop));
((BaseAdapter)listview2.getAdapter()).notifyDataSetChanged();
x.add(_childKey);
}
and here is the rest:
public class Listview2Adapter extends BaseAdapter {
ArrayList<HashMap<String, Object>> _data;
public Listview2Adapter(ArrayList<HashMap<String, Object>> _arr) {
_data = _arr;
}
@Override
public int getCount() {
return _data.size();
}
@Override
public HashMap<String, Object> getItem(int _index) {
return _data.get(_index);
}
@Override
public long getItemId(int _index) {
return _index;
}
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public View getView(final int _position, View _v, ViewGroup _container) {
LayoutInflater _inflater = (LayoutInflater) getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View _view = _v;
if (_view == null) {
_view = _inflater.inflate(R.layout.messgebubble, listview2, false);
}
final LinearLayout time = _view.findViewById(R.id.time);
final TextView textview1 = _view.findViewById(R.id.textview1);
final LinearLayout linear4 = _view.findViewById(R.id.linear4);
final TextView timetext = _view.findViewById(R.id.timetext);
final LinearLayout left = _view.findViewById(R.id.left);
final LinearLayout linear1 = _view.findViewById(R.id.linear1);
final de.hdodenhof.circleimageview.CircleImageView circleimageview1 = _view.findViewById(R.id.circleimageview1);
final TextView message = _view.findViewById(R.id.message);
final ImageView imageview1 = _view.findViewById(R.id.imageview1);
final TextView SystemText = _view.findViewById(R.id.systemtext);
final LinearLayout system = _view.findViewById(R.id.system);
Instant i = Instant.parse(_data.get(_position).get("time").toString());
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss").withZone(ZoneId.systemDefault());;
String Time = dateTimeFormatter.format(i);
timetext.setText(Time);
String messageType = lop.get(_position).get("type").toString();
switch (messageType){
case "system":
SystemText.setText(_data.get(_position).get("messages").toString());
Toast.makeText(GroupChatActiviy.this, "This is a system message", Toast.LENGTH_SHORT).show();
system.setVisibility(View.VISIBLE);
break;
case "user":
linear4.setVisibility(View.VISIBLE);
if (_data.get((int)_position).get("messages").toString().equals("")) {
if (_data.get((int)_position).containsKey("image")) {
imageview1.setVisibility(View.VISIBLE);
if (_data.get((int)_position).get("user_uid").toString().equals(FirebaseAuth.getInstance().getCurrentUser().getUid())) {
linear4.setGravity(Gravity.RIGHT);
linear1.setGravity(Gravity.RIGHT);
}
else {
linear4.setGravity(Gravity.LEFT);
linear1.setGravity(Gravity.LEFT);
}
}
else {
}
}
else {
message.setText(_data.get((int)_position).get("messages").toString());
message.setVisibility(View.VISIBLE);
if (lop.get((int)_position).get("user_uid").toString().equals(FirebaseAuth.getInstance().getCurrentUser().getUid())) {
linear4.setGravity(Gravity.RIGHT);
linear1.setGravity(Gravity.RIGHT);
linear1.setBackgroundResource(R.drawable.start);
}
else {
linear4.setGravity(Gravity.LEFT);
linear1.setGravity(Gravity.LEFT);
linear1.setBackgroundResource(R.drawable.right);
}
if (_data.get((int)_position).containsKey("image")) {
imageview1.setVisibility(View.VISIBLE);
}
else {
}
}
String LastTimeText = _data.get((int)_position - 1).get("time").toString();
Instant LastI = Instant.parse(LastTimeText);
Duration Dur = Duration.between(LastI, i);
if (Dur.getSeconds() <= 600) {
}
else {
if (lop.get((int)_position).get("user_uid").toString().equals(FirebaseAuth.getInstance().getCurrentUser().getUid())) {
}
else {
circleimageview1.setVisibility(View.VISIBLE);
textview1.setVisibility(View.VISIBLE);
//Glide.with(getApplicationContext()).load(Uri.parse(_data.get((int)_position).get("pfp").toString())).into(circleimageview1);
textview1.setText(_data.get((int)_position).get("username").toString());
}
time.setVisibility(View.VISIBLE);
}
break;
}
if(_data.get((int)_position).get("number") != null){
if (_data.get((int)_position).get("number").toString().equals("")) {
}
else {
if (Numberrr < Double.parseDouble(_data.get((int)_position).get("number").toString())) {
Numberrr = Double.parseDouble(_data.get((int)_position).get("number").toString()) + 1;
}
}
}
return _view;
}
}
Solution
Your adapter is based on _data
but the message type is being grabbed from lop
. These two can periodically get out of sync as new data comes in. Make sure your adapter is only accessing row item information from _data
and it should work as expected.
Answered By - Dan Harms
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.