我想在同一ListView
中显示不同类型的对象,但我不知道如何通过getItem(position)
来区分这些对象
ListView
会显示Messages
的列表,其中可以是Chat
,Notification
,以及Chat
项和{{1}项有不同的布局。
这是适配器:
Notification
消息类(最小)
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
我在启动活动时从Web服务检索聊天列表和通知列表,因此我必须将它们添加到各自订单(日期)中的新消息列表中,然后实例化m适配器使用此public class Notification extends Message { ... }
public class Cat extends Message { ... }
这是一个好习惯吗?
答案 0 :(得分:3)
只需在类对象和适配器中添加一个布尔标志,检查标志并在聊天时使用一个布局,如果标记为通知,则使用另一个布局。没问题
有一个教程here实际上涵盖了你在listView中使用不同视图布局尝试做的或多或少的事情
在适配器中创建两个视图,一个用于聊天,一个用于通知。然后,在getView()中,获取要为其创建视图的对象,检查布尔标志,实例化正确的持有者并根据标志对视图进行膨胀,然后设置视图元素,就像只有那个一样。 class和ListView将显示您在该位置设置该元素的视图。
答案 1 :(得分:1)
正如o0rebelious0所说,在你的对象中使用一个标志或一个id。然后,使用适配器中的getItemViewType和getViewTypeCount来区分您的项目类型。因此,在getView中,您只会收到兼容的convertView。
答案 2 :(得分:1)
我已经完成了这个
我有一个列表,在3种不同类型的对象列表中(如Tour / Hotel / Visa)
所以三个不同类型的对象列表每个列表包含一个不同类型的对象,但有一个扭曲,我用于识别我有三种类型的对象列表,所以我已经通过了Map&gt;到适配器,检查以下示例
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;
}
}
如果您对上述详细信息有任何疑问,请与我联系。