3

IMクライアントを作成していて、(ファイルシステムまたはネットワークから)ダウンロードして、ListViewの上部に新しい要素を表示する必要があります(メッセージの履歴です。古いメッセージが上部に、新しいメッセージが下部に表示されます)。ListView用に独自のアダプタを実装しましたが、リストの先頭に新しい要素を追加して再描画することができません。(notifyDataSetChanged()は、ListViewのメッセージのインデックスが変更され、Androidが正常に再描画できないため、私には適していません)。

他のアプリはどのように同様のことをしますか?

特別なコードは作成しません。ListView用の新しいアダプターを作成するだけです。

messagesListView.setAdapter(new MessagesListAdapter(this));

そして、MessagesListAdapterでgetView()メソッドとgetCount()メソッドを再定義します(ArrayAdapterを拡張します)。

ListViewの私のXMLは

<ListView
  android:id="@+id/dialog_messages_list"
  android:layout_height="fill_parent"
  android:layout_width="fill_parent"
  android:layout_marginTop="@dimen/title_height">
</ListView>

そして、1つの要素(1つのメッセージ)のXMLは

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal" >

  <TextView
      android:id="@+id/dialogMessageText"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text=""
      android:background="@drawable/dialog_message_in"
      />

  <TextView
    android:id="@+id/dialogMessageDatetime"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text=""/>

</LinearLayout>

他のコードが必要かもしれませんか?

編集:私は試しました

    messagesListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList));
    (new Thread() {
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            arrayList.add(0, "qwer");
        }
    }).start();

しかし、それも良くないようです。スレッドで呼び出そうとしまし((ArrayAdapter<String>)messagesListView.getAdapter()).notifyDataSetChanged();たが、例外になります。

4

2 に答える 2

2

リストの順序を逆にして、最新の結果を最初に表示することをお勧めします。

この例を実行します。

public class Example extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String[] array = {"oldest", "older", "old", "new", "newer"};
        List<String> list = new ArrayList<String>();
        Collections.addAll(list, array);
        Collections.reverse(list);

        // When you want to add new Strings, put them at the beginning of list
        list.add(0, "newest");

        ListView listView = (ListView) findViewById(R.id.list);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
        listView.setAdapter(adapter);
    }
}

この方法で、ArrayAdapterまたはListViewの内容をオーバーライドする必要はありません。

于 2012-07-01T20:30:14.243 に答える
0

リスト ビューに関連付けられたクラスに、プログラムでいくつかのビューを追加できます。例えば:

レイアウトに要素を追加して新しい要素を作成するには:

TextView tv = new TextView(getApplicationContext());
EditText edit = new EditText(getApplicationContext());
relative.addView(tv);
relative.addView(edit);

これは、xml レイアウト内の既存の要素を操作するためのものです。

final TextView tv = (TextView) v.findViewById(R.id.listItem);
    tv.setText("This an item I am changing");

関連する質問のいくつかを見ると、これに関する詳細情報が得られます。ただし、他の人のカスタム リストビューとアダプターをオンラインでチェックアウトすることもできます。これは本当に素晴らしいです: http://www.androidhive.info/2012/02/android-custom-listview-with-image-and-text/

于 2012-07-01T18:34:52.770 に答える