I am trying to create a simple chat application. On the chat conversation screen, I use a ListView with an ArrayAdapter to store and display the message, but when I receive or send a new message, the entire last message changes to.
This is my adapter code:
public class MessageAdapter extends ArrayAdapter<Message> { private Context context; private ArrayList<Message> messages; private DatabaseHelper databaseHelper; private Message message; @Override public void add(Message object) { messages.add(object); super.add(object); } public MessageAdapter(Context context, int textViewResouceId, ArrayList<Message> messages) { super(context, textViewResouceId); this.context = context; this.messages = messages; databaseHelper = DatabaseHelper.getInstance(context); } public int getCount() { return messages.size(); } public Message getItem(int index) { return messages.get(index); } public long getItemId(int position) { return position; } @Override public int getPosition(Message item) { return super.getPosition(item); } @Override public View getView(int position, View convertView, ViewGroup parent) { MessageViewHolder messageViewHolder; if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.chat_item, parent, false); messageViewHolder = new MessageViewHolder(); messageViewHolder.tv_userName = (TextView) convertView.findViewById(R.id.tv_chatName); messageViewHolder.tv_message = (TextView) convertView.findViewById(R.id.tv_messageContent); convertView.setTag(messageViewHolder); } else { messageViewHolder = (MessageViewHolder) convertView.getTag(); } message = messages.get(position); String username = databaseHelper.getUserByUserId(message.getUserId()).getUserName(); if (message.getUserId() == AppConfig.USER_ID) { messageViewHolder.tv_message.setTextColor(Color.parseColor("#0066ff")); messageViewHolder.tv_userName.setTextColor(Color.parseColor("#0066ff")); } else { messageViewHolder.tv_message.setTextColor(Color.parseColor("#000000")); messageViewHolder.tv_userName.setTextColor(Color.parseColor("#000000")); } messageViewHolder.tv_userName.setText(username); messageViewHolder.tv_message.setText(message.getMessage()); return convertView; } static class MessageViewHolder { TextView tv_message; TextView tv_userName; } }
This is my ListView layout code:
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> <ScrollView android:id="@+id/scroll_chat" android:layout_width="match_parent" android:layout_height="380dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/listMessage" android:layout_width="match_parent" android:layout_height="380dp" android:background="@null" android:divider="@null" android:stackFromBottom="true" android:drawSelectorOnTop="false" android:transcriptMode="alwaysScroll" /> </LinearLayout> </ScrollView> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:weightSum="1"> <EditText android:id="@+id/txt_chat" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="0.92" /> <Button android:id="@+id/btn_send" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginLeft="30dp" android:text="@string/btn_send" /> </LinearLayout> </LinearLayout>
And this is an error when sending two messages (the same error occurs when I receive a message)


I think the problem is how to set the data in the View, but I cannot solve it. Can anyone help me solve this problem.
This is the chat screen when I close and reopen an action. He showed the correct message.

This is the Chatactivity code:
public class ChatActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_send; private static EditText txt_chat; private String registId; private Bundle bundle; private String chatTitle; private MessageSender mgsSender; private int userId; private DatabaseHelper databaseHelper; private TimeUtil timeUtil; private MessageAdapter messageAdapter; private ListView lv_message; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chat); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); } btn_send = (Button) findViewById(R.id.btn_send); txt_chat = (EditText) findViewById(R.id.txt_chat); lv_message = (ListView) findViewById(R.id.listMessage);
source share