Я пытаюсь выполнить Android Chat
, используя ListView
и Adapter
, и для проверки своего кода я использую два TextView, каждое со своей кнопкой отправки, факт в том, что он работает нормально, когда я последовательно впервые отправляюсообщение с использованием кнопки 1, а затем кнопки 2 и т. д. последовательно, и в представлении списка сообщения расположены последовательно, но если я отправил несколько сообщений только с помощью кнопки 1 или кнопки 2, эта последовательность будет потеряна, а представление списка повреждено,переменная myMessage
должна быть под контролем, но не работает, кто-то может сказать мне, как я могу это исправить.
Вот MainActivity:
public class MainActivity extends AppCompatActivity {
private ListView listView;
private View btnSend;
private EditText editText;
boolean myMessage = true;
private List<ChatBubble> ChatBubbles;
private ArrayAdapter<ChatBubble> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ChatBubbles = new ArrayList<>();
listView = (ListView) findViewById(R.id.list_msg);
btnSend1 = findViewById(R.id.btn_chat_send1);
btnSend2 = findViewById(R.id.btn_chat_send2);
editText1 = (EditText) findViewById(R.id.msg_type1);
editText2 = (EditText) findViewById(R.id.msg_type2);
//set ListView adapter first
adapter = new MessageAdapter(this, R.layout.left_chat_bubble, ChatBubbles);
listView.setAdapter(adapter);
//event for button SEND1
btnSend1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (editText1.getText().toString().trim().equals("")) {
Toast.makeText(MainActivity.this, "Please input some text...", Toast.LENGTH_SHORT).show();
} else {
myMessage = true;
ChatBubble ChatBubble = new ChatBubble(editText1.getText().toString(), myMessage);
ChatBubbles.add(ChatBubble);
adapter.notifyDataSetChanged();
editText1.setText("");
}
}
});
//event for button SEND2
btnSend2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (editText2.getText().toString().trim().equals("")) {
Toast.makeText(MainActivity.this, "Please input some text...", Toast.LENGTH_SHORT).show();
} else {
myMessage = false;
ChatBubble ChatBubble = new ChatBubble(editText2.getText().toString(), myMessage);
ChatBubbles.add(ChatBubble);
adapter.notifyDataSetChanged();
editText2.setText("");
}
}
});
}
}
Вот класс MessageAdapter:
public class MessageAdapter extends ArrayAdapter<ChatBubble> {
private Activity activity;
private List<ChatBubble> messages;
public MessageAdapter(Activity context, int resource, List<ChatBubble> objects) {
super(context, resource, objects);
this.activity = context;
this.messages = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
int layoutResource = 0; // determined by view type
ChatBubble ChatBubble = getItem(position);
int viewType = getItemViewType(position);
if (ChatBubble.myMessage()) {
layoutResource = R.layout.left_chat_bubble;
} else {
layoutResource = R.layout.right_chat_bubble;
}
if (convertView != null) {
holder = (ViewHolder) convertView.getTag();
} else {
convertView = inflater.inflate(layoutResource, parent, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}
//set message content
holder.msg.setText(ChatBubble.getContent());
return convertView;
}
@Override
public int getViewTypeCount() {
// return the total number of view types. this value should never change
// at runtime. Value 2 is returned because of left and right views.
return 2;
}
@Override
public int getItemViewType(int position) {
// return a value between 0 and (getViewTypeCount - 1)
return position % 2;
}
private class ViewHolder {
private TextView msg;
public ViewHolder(View v) {
msg = (TextView) v.findViewById(R.id.txt_msg);
}
}
}
А также класс ChatBubble:
public class ChatBubble {
private String content;
private boolean myMessage;
public ChatBubble(String content, boolean myMessage) {
this.content = content;
this.myMessage = myMessage;
}
public String getContent() {
return content;
}
public boolean myMessage() {
return myMessage;
}
}