Я делаю чат-приложение, и у меня есть 2 параметра для каждого сообщения: текст сообщения и время отправки сообщения, и я перерисовываю эти 2 параметра каждую секунду.Как изменить только один элемент в ListView?
single_message.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
// каждый 1 второй сделать это MyJavaClass.java
messagesList = new ArrayList<HashMap<String, String>>();
... sending parameters to database and fetch messages
messages = json.getJSONArray("messages");
for (int i = 0; i < messages.length(); i++) {
JSONObject object = messages.getJSONObject(i);
message= object.getString("message");
time= object.getString("time");
HashMap<String, String> messagesMap = new HashMap<String, String>();
messagesMap.put("message", message);
messagesMap.put("time", time);
messagesList.add(messagesMap);
}
runOnUiThread(new Runnable() {
public void run() {
final ListAdapter adapter = new SimpleAdapter(
MyJavaClass.this, messagesList,
R.layout.single_message, new String[]{"message", "time"}, new int[]{R.id.message, R.id.time});
getListView().post(new Runnable() {
@Override
public void run() {
getListView().setSelection(adapter.getCount() - 1);
}
});
setListAdapter(adapter);
}
});
Как только перерисовывать время и это сообщение остается, когда нет новых сообщений? Примечание. Пользователь может удалить каждое сообщение в любое время.
Также у меня проблема с прокруткой. Поскольку каждую секунду я перерисовываю чат и позицию для последнего добавленного сообщения, я не могу нормально прокручивать, он всегда возвращает меня к последнему добавленному сообщению, я не могу нормально смотреть старые сообщения. мне нужно иметь
getListView().post(new Runnable() {
@Override
public void run() {
getListView().setSelection(adapter.getCount() - 1);
}
});
, потому что это единственный способ расположить к последнему добавленного сообщения. Последние добавленные сообщения находятся в нижней части экрана, как в других чат-приложениях.
У меня также есть проблема с мерцанием. Вероятно, это связано с тем, что я каждую секунду перерисовываю чат. Как удалить мерцание?
Это лучше, чтобы прокрутить вниз к последнему сообщению только тогда, когда приходит новое сообщение, не каждую секунду, только если вам ** необходимо ** прокрутить вниз новые сообщения. В любом случае, из моего опыта чатов, это раздражает, когда чат прокручивает вас вниз, когда вы ищете старые сообщения. –
Кто-нибудь знает, как это исправить? Я заплачу, если хочешь. – user3051755
Сначала вы должны создать ListView только один раз и динамически обновлять его содержимое каждый раз, когда вам нужно это делать (новое сообщение, сообщение удалено, ...). Для этого вы можете работать с объектом «ListAdapter». Пользовательский интерфейс обновится после вызова метода notifyDataSetChanged на адаптере. –