1

異なるタイプのオブジェクトを同じ に表示したいのですが、ListViewこれらのオブジェクトを区別する方法がわかりませんgetItem(position)

は、 、 、および項目のいずれかで、異なるレイアウトListViewのリストを表示します。MessagesChatNotificationChatNotification

これはアダプターです:

public class MailboxAdapter extends BaseAdapter {

    private ArrayList<Messages> m_alMessages = null;

    private Messages getItem(int position) {

        return m_alMessages.get(position)
    }

   @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        if (m_alMessages != null) {
            if (getItem(position).isChat()) {
                final Chat cChatItem = getItem(position);
                if (convertView == null) {
                    //Cat logic
                    // ...
                }
            } else {
                final Notification nNotifItem = getItem(position);

                 if (convertView == null) {
                    //Notification logic
                    // ...
                }

            }
        }
    }

メッセージ クラス (最小限)

public class Message {
        private long m_lId = 0L;
        private boolean m_bIsChat = false;

        public boolean isChat() { return m_bIsChat; }

}

NotificationクラスChat:

public class Notification extends Message { ... }

public class Cat extends Message { ... }

アクティビティの開始時に Web サービスからチャットのリストと通知のリストを取得しているため、それらをそれぞれの順序 (日付) でメッセージの新しいリストに追加し、このリストを使用して m アダプターをインスタンス化する必要があります。のMessage

それは良い習慣ですか?

4

3 に答える 3

4

ブール値フラグをクラス オブジェクトに追加し、アダプターでフラグを確認し、チャットの場合は 1 つのレイアウトを使用し、通知としてフラグが立てられている場合は別のレイアウトを使用します。それで問題ない

listView内のさまざまなビューレイアウトで何をしようとしているのかを実際にカバーするチュートリアルがここにあります

アダプター内に、チャット用と通知用の 2 つのビューホルダーを作成します。次に、getView() で、ビューを作成しているオブジェクトを取得し、ブール フラグを確認し、正しいホルダーをインスタンス化し、フラグに基づいてビューを膨らませてから、ビュー要素を設定します。クラスと ListView は、その要素を適切に設定したビューを表示します。

于 2013-05-14T10:26:07.063 に答える
1

o0rebelious0o が言ったように、オブジェクトでフラグまたは ID を使用します。次に、アダプタでgetItemViewTypegetViewTypeCountを使用して、アイテム タイプを区別します。したがって、getView では、互換性のある convertView のみを受け取ります。

于 2013-05-14T10:38:48.517 に答える