2013-12-25 2 views
1

Я делаю чат-приложение, и у меня есть 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); 
     } 
}); 

, потому что это единственный способ расположить к последнему добавленного сообщения. Последние добавленные сообщения находятся в нижней части экрана, как в других чат-приложениях.

У меня также есть проблема с мерцанием. Вероятно, это связано с тем, что я каждую секунду перерисовываю чат. Как удалить мерцание?

+1

Это лучше, чтобы прокрутить вниз к последнему сообщению только тогда, когда приходит новое сообщение, не каждую секунду, только если вам ** необходимо ** прокрутить вниз новые сообщения. В любом случае, из моего опыта чатов, это раздражает, когда чат прокручивает вас вниз, когда вы ищете старые сообщения. –

+0

Кто-нибудь знает, как это исправить? Я заплачу, если хочешь. – user3051755

+0

Сначала вы должны создать ListView только один раз и динамически обновлять его содержимое каждый раз, когда вам нужно это делать (новое сообщение, сообщение удалено, ...). Для этого вы можете работать с объектом «ListAdapter». Пользовательский интерфейс обновится после вызова метода notifyDataSetChanged на адаптере. –

ответ

Смежные вопросы