【问题标题】:Display different objects in the same ListAdapter在同一个 ListAdapter 中显示不同的对象
【发布时间】:2013-05-14 10:22:07
【问题描述】:

我想在同一个ListView中显示不同类型的对象,但不知道如何通过getItem(position)区分这些对象

ListView 显示Messages 列表,可以是ChatNotification,并且项目ChatNotification 具有不同的布局。

这是适配器:

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; }

}

NotificationChat 类:

public class Notification extends Message { ... }

public class Cat extends Message { ... }

我在开始活动时从网络服务检索聊天列表和通知列表,因此我必须将它们按各自的顺序(日期)添加到新的消息列表中,然后实例化 m 适配器有了这个Message列表

这是一个好习惯吗?

【问题讨论】:

标签: android listadapter


【解决方案1】:

只需向类对象和适配器中添加一个布尔标志,检查标志并使用一个布局,如果它是聊天,另一个如果它被标记为通知。没问题

有一个教程here 实际上或多或少地涵盖了您尝试对 listView 中的不同视图布局执行的操作

在您的适配器中创建两个视图,一个用于聊天,一个用于通知。然后,在 getView() 中,获取您正在为其创建视图的对象,检查布尔标志,实例化正确的持有者并根据标志膨胀视图,然后像只有那个一样设置视图元素类和 ListView 将显示您在适当位置设置该元素的视图。

【讨论】:

  • 如果对象类(isChat)中有布尔值,适配器中的布尔值是什么?
  • 如果您已经拥有该标志,那么可以,您可以在 getElement 方法中检查是否可以获取正在填充的视图占位符的对象,检查该标志并相应地膨胀视图。
【解决方案2】:

正如 o0rebelious0o 所说,在您的对象中使用标志或 id。然后,在适配器中使用getItemViewTypegetViewTypeCount 来区分您的项目类型。因此,在 getView 中,您只会收到兼容的 convertView。

【讨论】:

    【解决方案3】:

    我已经这样做了

    我有一个列表,在这 3 种不同类型的对象列表中(如旅游/酒店/签证)

    所以三个不同类型的对象列表每个列表都包含不同类型的对象,但是我使用了一个扭曲来识别我有三种类型的对象列表,所以我已经将 Map> 传递给适配器,检查下面的例子

            BookingDetails details = gson.fromJson(result, BookingDetails.class);
            Map<String, List<Object>> serviceListMap = new HashMap<>();
            if (details.getHotelList() != null) {
                List<Object> list = new ArrayList<>();
                list.addAll(details.getHotelList());
                serviceListMap.put("Hotel", list);
            }
            if (details.getTourList() != null) {
                List<Object> list = new ArrayList<>();
                list.addAll(details.getTourList());
                serviceListMap.put("Tour", list);
            }
            if (details.getVisaList() != null) {
                List<Object> list = new ArrayList<>();
                list.addAll(details.getVisaList());
                serviceListMap.put("Visa", list);
            }
            if (serviceListMap.size() > 0){
                HomeListAdapter adapter = new HomeListAdapter(HomeActivity.this, serviceListMap);
                listView.setAdapter(adapter);
            }
    

    在 HomeListAdapter 中

    public class HomeListAdapter extends BaseAdapter {
    
    private List<String> mDataList;
    private Map<String, List<Object>> detailMap;
    private Context mContext;
    
    public HomeListAdapter(Context context, Map<String, List<Object>> dataList) {
        mContext = context;
        mDataList = new ArrayList<>(dataList.keySet());
        detailMap = dataList;
    }
    
    
    @Override
    public int getCount() {
        return mDataList.size();
    }
    
    @Override
    public String getItem(int position) {
        return mDataList.get(position);
    }
    
    @Override
    public long getItemId(int position) {
        return 0;
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String key = mDataList.get(position);
        final HolderVoucher holderVoucher;
        if (convertView == null) {
            convertView = View.inflate(mContext, R.layout.item_row, null);
            holderVoucher = new HolderVoucher();
            convertView.setTag(holderVoucher);
            holderVoucher.title = convertView.findViewById(R.id.title);
            holderVoucher.checkin = convertView.findViewById(R.id.checkin);
            holderVoucher.checkout = convertView.findViewById(R.id.checkout);
        } else {
            holderVoucher = (HolderVoucher) convertView.getTag();
        }
        StringBuilder desc = null;
        holderVoucher.title.setText(key);
        List<Object> services = detailMap.get(key);
        desc = new StringBuilder();
    
        if (services.size() > 0) {
            for (int i = 0; i < services.size(); i++) {
                desc.append("\n");
                if (services.size() > 1) {
                    desc.append((i + 1) + ". ");
                }
                if (key.equalsIgnoreCase("Visa")) {
                 VisaDetails detail = (VisaDetails) services.get(i);
                    desc.append(detail.getVisaName());
                    desc.append("\nTravel Date : " +  detail.getTravelDate()));
                } else if (key.equalsIgnoreCase("Hotel")) {
                    HotelDetails detail = (HotelDetails) services.get(i);
                    desc.append(detail.getHotelName() + "\n" + detail.getRoomType());
                    desc.append("\nCheck in : " + detail.getCheckInDate()) +
                            " Check out : " + detail.getCheckOutDate()));
                } else if (key.equalsIgnoreCase("Tour")) {
                    TourDetails detail = (TourDetails) services.get(i);
                    desc.append("Tour - " + detail.getTourName());
                    desc.append("\nTravel Date : " +detail.getTravelDate()));
                }
        holderVoucher.checkin.setText(desc.toString());
    
        return convertView;
      }
      private class HolderVoucher {
        private TextView title, checkin, checkout;
      }
    }
    

    如果您对上述详细信息有任何疑问,请告诉我。

    【讨论】:

      猜你喜欢
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 2020-12-04
      • 2014-11-18
      • 2017-05-18
      • 1970-01-01
      相关资源
      最近更新 更多