0

背景:アプリにメッセージング システムを実装しようとしています。チャット ウィンドウにCursorAdapterメッセージを表示するカスタムを作成しています。ListView受信メッセージと送信メッセージ (カーソル内の SQLite 行に保存される情報) に異なる行レイアウトを使用したい。各行には、同じ ID を持つ同じ要素がありますが、配置が異なります。

問題:現在、私は と をオーバーライドnewView()していbindView()ます。がListView最初に読み込まれると、すべての がView完全に作成され、各行が受信か送信かを確認し、適切な XML ファイルが展開されます。ただし、スクロールするか、新しいメッセージがウィンドウに追加されると、アダプターViewは間違った行の s をリサイクルします。をオーバーライドしますgetView()が、パラメーターとして渡さCursorれないため、行が着信か発信かを知る方法がありません。

私はコードを探しているのではなく、エレガントな実装の提案を探しています。前もって感謝します!

4

2 に答える 2

5

考えられる解決策は次の 2 つです。

(1) すべてのアイテムに単一のレイアウトを使用します。これは、製本時に必要に応じて表示するように調整できます。最も簡単な方法は、ルート ビューを、さまざまな状態ごとに N 個の子を含む FrameLayout にすることです。バインド時に、そのうちの 1 つを表示し、他のすべてを非表示にします。もちろん、これによってアイテムに含まれるビューの数が急増しないように注意する必要があります。

(2) Adapter.getItemViewType() http://developer.android.com/reference/android/widget/Adapter.html#getItemViewType(int ) を実装して、リスト ビューにさまざまな種類のアイテムを伝え、リサイクルします。正しいもの。

于 2011-06-04T03:40:00.317 に答える
0

ListViewちょっと考えただけで、個人的には全体と組み合わせが少しだけだと思いCursorAdapterます...えーと...肥大化という言葉が正しいですか?要求に応じて適切なものを追加するScrollView/の組み合わせを使用する方が簡単でしょうか?LinearLayoutTextView

しかし、ソリューションに関しては、メッセージが追加されたときにユーザーがメッセージの順序を変更できないように見えるため、ArrayList<String>カスタムCursorAdapterにフィールドを追加して、メッセージが着信か発信かを追跡できます。何かのようなもの:

private ArrayList<String> cursorMonitor; //"incoming" and "outgoing" as your options.

...そして、どこにでもListView使用するだけです

cursorMonitor.add(my_cursor.getString("outgoing_or_incoming"));

そして、 でそれgetView()をオーバーライドし、 を使用して、cursorMonitorどのレイアウトをインフレートする必要があるかを判断できます。

于 2011-06-04T02:21:24.350 に答える