Как исправить эту ошибку в ListView в чате Android - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь выполнить 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;
 }
}

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Я думаю, что ViewType переключается между четным и нечетным.Как насчет этого кода?

MessageAdapter

@Override
public int getItemViewType(int position) {
    ChatBubble chatBubble = messages.get(position);
    return chatBubble.myMessage() ? 1 : 0;
}
1 голос
/ 13 апреля 2019

Ошибка # 1: тип переменной и сама переменная не должны иметь одно и то же имя.

ChatBubble ChatBubble = new ChatBubble(...); // INCORRECT
ChatBubble chatBubble = new ChatBubble(...); // CORRECT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...