如何只更改ListView中的一个项目?

时间:2013-12-25 12:23:11

标签: android xml listview

我正在制作聊天应用程序,每条消息都有2个参数:消息文本和发送消息的时间,我每秒重绘这两个参数。

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 :(得分:0)

尝试使用ViewHolder模式(这里有一个解释:http://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html),您可以重复使用视图而无需重新绘制视图,并且只在必要时填充它们