Android 具有两个不同对象的不同布局的ListView

Android 具有两个不同对象的不同布局的ListView,android,listview,android-listview,android-adapter,baseadapter,Android,Listview,Android Listview,Android Adapter,Baseadapter,我想用奇数行和偶数行的不同布局填充ListView。应该是这样的: 我使用两个对象“OddListItem”和“EvenListItem”来存储/访问数据。我不知道如何将这两个对象传递给我的自定义listview适配器并获得正确的视图 我的对象类: public class OddListItem { private String time_start; private String time_end; private String location; pu

我想用奇数行和偶数行的不同布局填充ListView。应该是这样的:

我使用两个对象“OddListItem”和“EvenListItem”来存储/访问数据。我不知道如何将这两个对象传递给我的自定义listview适配器并获得正确的视图

我的对象类:

public class OddListItem {

    private String time_start;
    private String time_end;
    private String location;

    public OddListItem(String time_start, String time_end, String location) {
        super();
        this.time_start = time_start;
        this.time_end = time_end;
        this.location = location;
    }

    // getters and setters
    void setTimeStart(String time_start) {
        this.time_start = time_start;
    }

    void setTimeEnd(String time_end) {
        this.time_end = time_end;
    }

    void setLocation(String location) {
        this.location = location;
    }

    public String getTimeStart() {
        return time_start;
    }

    public String getTimeEnd() {
        return time_end;
    }

    public String getLocation() {
        return location;
    }
}

public class EvenListItem {

    private String image;
    private String location;

    public EvenListItem (String image, String location) {
        super();
        this.image = image;
        this.location = location;
    }

    // getters and setters
    void setImage(String image) {
        this.image = image;
    }

    void setLocation(String location) {
        this.location = location;
    }

    public String getImage() {
        return image;
    }

    public String getLocation() {
        return location;
    }
}
MyCustomAdapter:

public class MyCustomAdapter extends BaseAdapter {

    // Tag for Logging
    private static final String TAG = "MyCustomAdapter";

    int type;
    private static final int TYPE_ITEM = 0;
    private static final int TYPE_SEPARATOR = 1;
    private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;

    private ArrayList<OddListItem> mData = new ArrayList<OddListItem>();
    private LayoutInflater mInflater;
    //private TreeSet mSeparatorsSet = new TreeSet();

    private Context context;

    public MyCustomAdapter(Context context) {
        mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.context = context;
    }

    public void addItem(final OddListItem item) {
        mData.add(item);
        //The notification is not necessary since the items are not added dynamically
        //notifyDataSetChanged();
    }

    public void addSeparatorItem(final OddListItem item) {
        mData.add(item);
        //The notification is not necessary since the items are not added dynamically
        //notifyDataSetChanged();
    }

    @Override
    public int getItemViewType(int position) {
        /*if ((position%2) == 0){
            type = TYPE_ITEM;
        } else {
            type = TYPE_SEPARATOR;
        }
        return type;*/
        return position%2;
    }

    @Override
    public int getViewTypeCount() {
        return TYPE_MAX_COUNT;
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public OddListItem getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        int type = getItemViewType(position);
        Log.d(TAG, "getView " + position + " " + convertView + " type = " + type);
        if (convertView == null) {
            holder = new ViewHolder();
            switch (type) {
                case TYPE_ITEM:
                    //inflate the new layout
                    convertView = mInflater.inflate(R.layout.detail_list_row_odd, parent, false);
                    holder.tv_time_from = (TextView) convertView.findViewById(R.id.tv_time_from);
                    holder.tv_time_to = (TextView) convertView.findViewById(R.id.tv_time_to);
                    holder.tv_current_location_odd = (TextView) convertView.findViewById(R.id.tv_current_location_odd);
                    //fill the layout with values
                    /*holder.tv_time_from.setText("12:34");
                    holder.tv_time_to.setText("12:37");
                    holder.tv_current_location_odd.setText("Aktueller Standort");*/
                    holder.tv_time_from.setText(mData.get(position).getTimeStart());
                    holder.tv_time_to.setText(mData.get(position).getTimeEnd());
                    holder.tv_current_location_odd.setText(mData.get(position).getLocation());
                    break;
                case TYPE_SEPARATOR:
                    //inflate the new layout
                    convertView = mInflater.inflate(R.layout.detail_list_row_even, parent, false);
                    holder.tv_current_location_even = (TextView) convertView.findViewById(R.id.tv_current_location_even);
                    holder.img_transport = (ImageView) convertView.findViewById(R.id.img_transport);
                    //fill the layout with values
                    holder.tv_current_location_even.setText("Hauptbahnhof");
                    holder.img_transport.setImageDrawable(context.getResources().getDrawable(R.drawable.rollator));
                    break;
                default:
                    break;
            }
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        return convertView;
    }

    private static class ViewHolder {
        public TextView tv_time_from;
        public TextView tv_time_to;
        public TextView tv_current_location_odd;
        public TextView tv_current_location_even;
        public ImageView img_transport;
    }
}
公共类MyCustomAdapter扩展了BaseAdapter{
//日志记录标签
私有静态最终字符串标记=“MyCustomAdapter”;
int型;
私有静态最终整数类型\u项=0;
私有静态final int TYPE_SEPARATOR=1;
私有静态最终整数类型\最大\计数=类型\分隔符+1;
private ArrayList mData=new ArrayList();
私人停车场;
//私有树集mseparatorset=新树集();
私人语境;
公共MyCustomAdapter(上下文){
mInflater=(LayoutInflater)context.getSystemService(context.LAYOUT\u充气机\u服务);
this.context=上下文;
}
公共无效附加项(最终OddListItem){
mData.add(项目);
//由于项目不是动态添加的,因此不需要通知
//notifyDataSetChanged();
}
公共void addSeparatorItem(最终OddListItem){
mData.add(项目);
//由于项目不是动态添加的,因此不需要通知
//notifyDataSetChanged();
}
@凌驾
public int getItemViewType(int位置){
/*如果((位置%2)==0){
类型=类型项目;
}否则{
类型=类型\分离器;
}
返回类型*/
返回位置%2;
}
@凌驾
public int getViewTypeCount(){
返回类型\最大\计数;
}
@凌驾
public int getCount(){
返回mData.size();
}
@凌驾
公共OddListItem getItem(内部位置){
返回mData.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder=null;
int type=getItemViewType(位置);
Log.d(标记“getView”+位置+“”+convertView+”类型=“+type”);
if(convertView==null){
holder=新的ViewHolder();
开关(类型){
案例类型\u项目:
//使新布局膨胀
convertView=mInflater.充气(R.layout.detail\u list\u row\u odd,parent,false);
holder.tv\u time\u from=(TextView)convertView.findViewById(R.id.tv\u time\u from);
holder.tv\u time\u to=(TextView)convertView.findViewById(R.id.tv\u time\u to);
holder.tv\u current\u location\u odd=(TextView)convertView.findViewById(R.id.tv\u current\u location\u odd);
//用值填充布局
/*持有人。电视时间从。设定文本(“12:34”);
持有者.tv\u time\u to.setText(“12:37”);
持有者。电视、当前位置、奇数。setText(“Aktueller站”)*/
holder.tv\u time\u from.setText(mData.get(position.getTimeStart());
holder.tv_time_to.setText(mData.get(position.getTimeEnd());
holder.tv\u current\u location\u odd.setText(mData.get(position.getLocation());
打破
箱型分离器:
//使新布局膨胀
convertView=mInflater.充气(R.layout.detail\u list\u row\u偶数,父项,false);
holder.tv\u current\u location\u偶=(TextView)convertView.findViewById(R.id.tv\u current\u location\u偶);
holder.img_transport=(ImageView)convertView.findViewById(R.id.img_transport);
//用值填充布局
holder.tv\u current\u location\u偶.setText(“Hauptbahnhof”);
holder.img_transport.setImageDrawable(context.getResources().getDrawable(R.drawable.rollator));
打破
违约:
打破
}
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
返回视图;
}
私有静态类视图持有者{
公共文本查看电视时间;
公共文本查看电视时间;
公共文本查看电视\u当前位置\u奇数;
公共文本查看电视\u当前位置\u偶数;
公共图像查看img_交通;
}
}
在这里,我生成数据并调用适配器:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detailed_connection);

    generateData();

    //fill ListView with custom content from MyCustomAdapter class
    mAdapter = new MyCustomAdapter(getApplicationContext());

    for (int i = 1; i < odd_items.size(); i++) {
        mAdapter.addItem(odd_items.get(i));
        if (i % 1 == 0) {
            mAdapter.addSeparatorItem(odd_items.get(i));
        }
    }
    setListAdapter(mAdapter);

    //set duration text
    tv_duration = (TextView)findViewById(R.id.tv_duration);
    tv_duration.setText("Dauer: 22 Minuten");
}

private void generateData() {

    odd_items = new ArrayList<OddListItem>();
    odd_items.add(new OddListItem("12:34", "", "Aktueller Standort"));
    odd_items.add(new OddListItem("12:37", "12:37", "TUM"));
    odd_items.add(new OddListItem("12:42", "12:42", "Hauptbahnhof Nord"));
    odd_items.add(new OddListItem("12:48", "12:48", "Hauptbahnhof"));

    even_items = new ArrayList<EvenListItem>();
    even_items.add(new EvenListItem("R.drawable.rollator", "3 Minuten Fußweg"));
    even_items.add(new EvenListItem("R.drawable.bus", "Richtung Hauptbahnhof Nord"));
    even_items.add(new EvenListItem("R.drawable.rollator", "6 Minuten Fußweg"));

    mData = new Data(odd_items, even_items);
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u详细连接);
生成数据();
//使用MyCustomAdapter类中的自定义内容填充ListView
mAdapter=新的MyCustomAdapter(getApplicationContext());
对于(int i=1;ipublic class Items {


    private String time_start;
    private String time_end;
    private String location;
    private int image;
    private String locationeven;
    private int oddoreven;

    public String getTime_start() {
        return time_start;
    }
    public void setTime_start(String time_start) {
        this.time_start = time_start;
    }
    public String getTime_end() {
        return time_end;
    }
    public void setTime_end(String time_end) {
        this.time_end = time_end;
    }
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }
    public int getImage() {
        return image;
    }
    public void setImage(int image) {
        this.image = image;
    }
    public String getLocationeven() {
        return locationeven;
    }
    public void setLocationeven(String locationeven) {
        this.locationeven = locationeven;
    }
    public int getOddoreven() {
        return oddoreven;
    }
    public void setOddoreven(int oddoreven) {
        this.oddoreven = oddoreven;
    }

}
 generateData() ;
 ArrayList<Items>  oddorevenlist = new ArrayList<Items>();
 private void generateData() {

           Items item1 = new Items();
           item1.setTime_start("12:34");
           item1.setTime_end("");
           item1.setLocation("Aktueller Standort");
           item1.setOddoreven(0);
           oddorevenlist.add(item1);

           Items item2 = new Items();
           item2.setImage(R.drawable.ic_launcher);
           item2.setLocationeven("3 Minuten Fußweg");
           item2.setOddoreven(1);
           oddorevenlist.add(item2);

           Items item3 = new Items();
           item3.setTime_start("12:37");
           item3.setTime_end("12:37");
           item3.setLocation("Tum");
           item3.setOddoreven(0);
           oddorevenlist.add(item3);

           Items item4 = new Items();
           item4.setImage(R.drawable.ic_launcher);
           item4.setLocationeven("Richtung Hauptbahnhof Nord");
           item4.setOddoreven(1);
           oddorevenlist.add(item4);

           Items item5 = new Items();
           item5.setTime_start("12:42");
           item5.setTime_end("12:42");
           item5.setLocation("Hauptbahnhof Nord");
           item5.setOddoreven(0);
           oddorevenlist.add(item5);

           Items item6 = new Items();
           item6.setImage(R.drawable.ic_launcher);
           item6.setLocationeven("R6 Minuten Fußweg");
           item6.setOddoreven(1);
           oddorevenlist.add(item6);

           Items item7 = new Items();
           item7.setTime_start("12:48");
           item7.setTime_end("12:48");
           item7.setLocation("HHauptbahnhof");
           item7.setOddoreven(0);
           oddorevenlist.add(item7);

           MyCustomAdapter mAdapter = new MyCustomAdapter(this,oddorevenlist);
           setListAdapter(mAdapter);

       }
public class MyCustomAdapter extends BaseAdapter {

    // Tag for Logging
    private static final String TAG = "MyCustomAdapter";

    int type;
    private static final int TYPE_ITEM = 0;
    private static final int TYPE_SEPARATOR = 1;



    private ArrayList<Items>  oddorevenlist ;
    private LayoutInflater mInflater;


    private Context context;

    public MyCustomAdapter(Context context, ArrayList<Items> oddorevenlist) {
        mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.context = context;

        this.oddorevenlist = oddorevenlist;
    }


    @Override
    public int getItemViewType(int position) {
        if (oddorevenlist.get(position).getOddoreven()==0){
            type = TYPE_ITEM;
        } else if (oddorevenlist.get(position).getOddoreven()==1) {
            type = TYPE_SEPARATOR;
        }
        return type;

    }

    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public int getCount() {
        return oddorevenlist.size();
    }


    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        int type = getItemViewType(position);
        Log.d(TAG, "getView " + position + " " + convertView + " type = " + type);
        if (convertView == null) {
            holder = new ViewHolder();
            switch (type) {
                case TYPE_ITEM:
                    //inflate the new layout
                    convertView = mInflater.inflate(R.layout.row_odd, parent, false);
                    holder.tv_time_from = (TextView) convertView.findViewById(R.id.tv_time_from);
                    holder.tv_time_to = (TextView) convertView.findViewById(R.id.tv_time_to);
                    holder.tv_current_location_odd = (TextView) convertView.findViewById(R.id.tv_current_location_odd);

                    holder.tv_time_from.setText(oddorevenlist.get(position).getTime_start());
                    holder.tv_time_to.setText(oddorevenlist.get(position).getTime_end());
                    holder.tv_current_location_odd.setText(oddorevenlist.get(position).getLocation());
                    break;
                case TYPE_SEPARATOR:
                    //inflate the new layout
                    convertView = mInflater.inflate(R.layout.row_even, parent, false);
                    holder.tv_current_location_even = (TextView) convertView.findViewById(R.id.tv_current_location_even);
                    holder.img_transport = (ImageView) convertView.findViewById(R.id.img_transport);
                    //fill the layout with values
                    holder.tv_current_location_even.setText(oddorevenlist.get(position).getLocationeven());
                    holder.img_transport.setImageResource(R.drawable.ic_launcher);
                    break;
                default:
                    break;
            }
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        return convertView;
    }

    private static class ViewHolder {
        public TextView tv_time_from;
        public TextView tv_time_to;
        public TextView tv_current_location_odd;
        public TextView tv_current_location_even;
        public ImageView img_transport;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }


}