Android 在同一ListAdapter中显示不同的对象
我想在同一个Android 在同一ListAdapter中显示不同的对象,android,listadapter,Android,Listadapter,我想在同一个列表视图中显示不同类型的对象,但我不知道如何通过getItem(position) 列表视图显示消息的列表,这些消息可以是聊天,也可以是通知,并且聊天和通知项具有不同的布局 这是适配器: public class MailboxAdapter extends BaseAdapter { private ArrayList<Messages> m_alMessages = null; private Messages getItem(int positi
列表视图中显示不同类型的对象,但我不知道如何通过getItem(position)
列表视图
显示消息的列表
,这些消息可以是聊天
,也可以是通知
,并且聊天
和通知
项具有不同的布局
这是适配器:
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 Notification extends Message { ... }
public class Cat extends Message { ... }
在启动活动时,我正在从web服务检索聊天列表和通知列表,因此我必须将它们以各自的顺序(日期)添加到新的消息列表中,然后使用此消息列表实例化m adapter
这是一种好的做法吗 只需向类对象添加一个布尔标志,并在适配器中检查该标志,如果是聊天,则使用一种布局,如果标记为通知,则使用另一种布局。没问题
有一个教程实际上或多或少地介绍了如何使用listView中的不同视图布局
在适配器中创建两个视图持有者,一个用于聊天,一个用于通知。然后,在getView()中,获取要为其创建视图的对象,检查布尔标志,实例化正确的支架并根据标志放大视图,然后设置视图元素,如果只有一个类,则ListView将显示您设置该元素的视图。只需向类对象添加布尔标志,并在适配器中检查标志,如果是聊天,则使用一种布局,如果它被标记为通知,则为另一个。没问题
有一个教程实际上或多或少地介绍了如何使用listView中的不同视图布局
在适配器中创建两个视图持有者,一个用于聊天,一个用于通知。然后,在getView()中,获取要为其创建视图的对象,检查布尔标志,实例化正确的支架,并根据标志对视图进行充气,然后设置视图元素,就像只有一个类一样,ListView将显示您设置该元素的视图。正如o0rebelious0o所说,在对象中使用标志或id。然后,在适配器中使用和来区分项目类型。因此,在getView中,您将只收到兼容的convertView。正如o0rebelious0o所说,在对象中使用标志或id。然后,在适配器中使用和来区分项目类型。因此,在getView中,您将只收到兼容的convertView。我已经这样做了
我有一个单一的列表,其中有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);
}
BookingDetails=gson.fromJson(结果,BookingDetails.class);
Map serviceListMap=newhashmap();
if(details.getHotelList()!=null){
列表=新的ArrayList();
list.addAll(details.getHotelList());
serviceListMap.put(“酒店”,列表);
}
if(details.getTourList()!=null){
列表=新的ArrayList();
addAll(details.getTourList());
serviceListMap.put(“Tour”,list);
}
if(details.getVisaList()!=null){
列表=新的ArrayList();
list.addAll(details.getVisaList());
serviceListMap.put(“Visa”,列表);
}
如果(serviceListMap.size()>0){
HomeListAdapter=新的HomeListAdapter(HomeActivity.this,serviceListMap);
setAdapter(适配器);
}
在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;
}
}
公共类HomeListAdapter扩展了BaseAdapter{
私人名单专家;
私有地图;
私有上下文;
公共HomeListAdapter(上下文、映射数据列表){
mContext=上下文;
mDataList=newarraylist(dataList.keySet());
detailMap=数据列表;
}
@凌驾
public int getCount(){
返回mDataList.size();
}
@凌驾
公共字符串getItem(int位置){
返回mDataList.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
String key=mDataList.get(位置);
最终持票人持票人持票人;
if(convertView==null){
convertView=查看。充气(mContext,R.layout.item_行,空);
holderVoucher=新的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);
}否则{
holderVoucher=(holderVoucher)convertView.getTag();
}
StringBuilder desc=null;
holderVoucher.title.setText(键);
List services=detailMap.get(key);
desc=新的StringBuilder();
if(services.size()>0){
对于(int i=0;i1){
desc.append((i+1)+”);
}
if(关键同等信号情况(“Visa”)){
VisaDetails detail=(VisaDetails)services.get(i);
desc.append(detail.getVisaName());
desc.append(“\n行程日期:+detail.getTravelDate());
}其他条件(钥匙等信号(“酒店”)){
HotelDetails detail=(HotelDetails)services.get(i);
desc.append(detail.getHotelName()+“\n”+detail.getRoomType());
desc.append(“\n签入:
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;
}
}