ListView实现不同的Item布局

来源:互联网 发布:电脑屏幕竖屏 程序员 编辑:程序博客网 时间:2024/05/16 08:21

点击免费下载源码
点击github下载
ListView是很多应用少不了的,有些应用的要求较为复杂,不是ListView嵌套GridView就是ListVIew嵌套ListVIew。更有甚者是两者都含有,而且还有其他不同形式的布局。
本人写了一个以前公司要求实现的布局如下图所示
这里写图片描述
左边其实是一个时间轴的效果,由于时间轴线的颜色太淡没有显示出来。为了实现这个功能当初是下了很多的功夫,也上网搜了一些demo但是都没有与此类似的,于是就自己实现。
想要实现这个布局其实并不是很难,只是当时一时不知道如何实现,走了不少弯路,浪费了不少时间。为了让更多的开发者少走弯路,本人就在此献丑了。这个布局真正的功能比这还要复杂一些,但是里面牵涉到公司的一些内容,就简化了一部分。
先说一下我的大致思路。
由于布局显示的item是不同的就要用到getItemViewType和getViewTypeCount()。继承BaseAdapter类,实现getItemViewType(int position)和getViewTypeCount() 方法,根据这两个方法,为item设置不同的标记,也就是不同的type,在getView方法中,利用getItemViewType(position)方法获取当前的type类型,然后根据不同的type类型,加载不同的item布局文件。

@Override    public int getItemViewType(int position) {        return mTypeList.get(position).type;    }    @Override    public int getViewTypeCount() {        return mTypeList.size();    }

这个只是实现外面的一些布局。具体里面的就更简单了。里面就是一些布局的嵌套。用到了ListView嵌套GridView和ListView嵌套ListView。同时也解决了点击GridView更item的背景色。以及标记点击当前item的位置,下次进来仍要显示之前点击的item而不是默认的item,这个简单。

if (position == clickTemp) { // 执行判断            // 设置背景            holder.tv_appoint_doc_name                    .setBackgroundResource(R.drawable.btn_gem_green);            holder.tv_appoint_doc_name                    .setTextColor(Color.parseColor("#ffffff"));        } else {            holder.tv_appoint_doc_name                    .setBackgroundResource(R.drawable.btn_border_green);            holder.tv_appoint_doc_name                    .setTextColor(Color.parseColor("#000000"));        }        if (clickTemp == position) {            holder.tv_appoint_doc_name                    .setTextColor(Color.parseColor("#ffffff"));        } else {            holder.tv_appoint_doc_name                    .setTextColor(Color.parseColor("#000000"));        }

以上代码是如果没有item的点击事件是默认的为第一个按钮位选中状态,当有点击事件时就要改变选中按钮的状态。
由于时间有限,里面的很多代码不是很规范,如果您有时间的话还请您能够修改并更新到本人的github上面。先在此谢过了.

package com.liuyongxiang.listview.adapter;import java.util.List;import android.annotation.SuppressLint;import android.content.Context;import android.content.Intent;import android.net.Uri;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.Gallery;import android.widget.LinearLayout;import android.widget.TextView;import com.liuyongxiang.listview.R;import com.liuyongxiang.listview.bean.TypeBean;import com.liuyongxiang.listview.custom.CustomGridView;import com.liuyongxiang.listview.custom.CustomListView;public class ProcessListAdp extends BaseAdapter {    private Context context;    private List<TypeBean> mTypeList;    private LayoutInflater inflater;    List<String> leaderList;    List<String> timeList;    List<String> contentList;    List<String> eastTimeList;    List<String> eastContentList;    List<String> bankList;    List<String> docList;    List<String> cashList;    List<String> medicalList;    List<String> flightList;    List<String> taskList;    public static final int APPOINT_DOC = 0;    public static final int INFORM_CLIENT = 1;    public static final int REQUEST_EXPERT = 2;    public static final int INFORM_AVIATION = 3;    public static final int APPLY_LEADER = 4;    public static final int PREPARE_TAKE_OFF = 5;    public static final int ORDER_FINISH = 6;    boolean isPay;    class ViewHolder1 {        TextView tv_start_doc_time, tv_title;        CustomGridView gv_start_doc_name;        boolean flag_start_doc;        boolean flag_start_time;        boolean flag_start_doc_appoint;        boolean flag_doc_isProcessed;        boolean flag_doc_isFinished;        boolean flag_doc_appoint;        Button btn_start_sure;        LinearLayout ll_start_appoint_doc, ll_start_appoint_content;        ViewHolder1(View view) {            tv_start_doc_time = (TextView) view                    .findViewById(R.id.tv_start_doc_time);            tv_title = (TextView) view.findViewById(R.id.tv_title);            gv_start_doc_name = (CustomGridView) view                    .findViewById(R.id.gv_start_doc_name);            ll_start_appoint_doc = (LinearLayout) view                    .findViewById(R.id.ll_start_appoint_doc);            ll_start_appoint_content = (LinearLayout) view                    .findViewById(R.id.ll_start_appoint_content);            btn_start_sure = (Button) view.findViewById(R.id.btn_start_sure);        }    }    class ViewHolder2 {        TextView tv_bank_card_id, tv_bank, tv_first_aid, tv_title,                tv_start_cash_time;        LinearLayout ll_start_inform_client, ll_inform_client_pay;        CustomGridView gv_cash_appoint;        Button btn_cash_appoint, btn_client_upload;        CustomListView lv_east;        boolean flag_inform_client;        boolean flag_inform_do_pro;        boolean flag_inform_do_pro_appoint;        boolean flag_cash_isProcessed;        boolean flag_cash_isFinished;        boolean flag_client_insure;        boolean flag_affirm_gathering;        boolean flag_cash_appoint;        ViewHolder2(View view) {            btn_cash_appoint = (Button) view                    .findViewById(R.id.btn_cash_appoint);            btn_client_upload = (Button) view                    .findViewById(R.id.btn_client_upload);            gv_cash_appoint = (CustomGridView) view                    .findViewById(R.id.gv_cash_appoint);            tv_bank_card_id = (TextView) view                    .findViewById(R.id.tv_bank_card_id);            tv_first_aid = (TextView) view.findViewById(R.id.tv_first_aid);            tv_start_cash_time = (TextView) view                    .findViewById(R.id.tv_start_cash_time);            tv_bank = (TextView) view.findViewById(R.id.tv_bank);            tv_title = (TextView) view.findViewById(R.id.tv_title);            ll_start_inform_client = (LinearLayout) view                    .findViewById(R.id.ll_start_inform_client);            ll_inform_client_pay = (LinearLayout) view                    .findViewById(R.id.ll_inform_client_pay);            lv_east = (CustomListView) view.findViewById(R.id.lv_east);        }    }    class ViewHolder3 {        TextView tv_start_expert_time, tv_title;        LinearLayout ll_start_request_expert, ll_start_request_expert_content;        boolean flag_request_expert;        boolean flag_request_expert_appoint;        boolean flag_expert_isProcessed;        boolean flag_expert_isFinished;        Button btn_expert_appoint;        CustomGridView gv_start_request_name;        boolean flag_expert_appoint;        ViewHolder3(View view) {            ll_start_request_expert = (LinearLayout) view                    .findViewById(R.id.ll_start_request_expert);            btn_expert_appoint = (Button) view                    .findViewById(R.id.btn_expert_appoint);            tv_title = (TextView) view.findViewById(R.id.tv_title);            tv_start_expert_time = (TextView) view                    .findViewById(R.id.tv_start_expert_time);            ll_start_request_expert_content = (LinearLayout) view                    .findViewById(R.id.ll_start_request_expert_content);            gv_start_request_name = (CustomGridView) view                    .findViewById(R.id.gv_start_request_name);        }    }    class ViewHolder4 {        LinearLayout ll_start_inform_aviation,                ll_start_inform_aviation_content;        boolean flag_inform_aviation;        boolean flag_inform_aviation_appoint;        boolean flag_aviation_isProcessed;        boolean flag_aviation_isFinished;        Button btn_aviation_appoint;        CustomListView lv_start_aoc;        TextView tv_title, tv_start_aviation_time;        boolean flag_aviation_appoint;        ViewHolder4(View view) {            ll_start_inform_aviation = (LinearLayout) view                    .findViewById(R.id.ll_start_inform_aviation);            btn_aviation_appoint = (Button) view                    .findViewById(R.id.btn_aviation_appoint);            ll_start_inform_aviation_content = (LinearLayout) view                    .findViewById(R.id.ll_start_inform_aviation_content);            lv_start_aoc = (CustomListView) view                    .findViewById(R.id.lv_start_aoc);            tv_title = (TextView) view.findViewById(R.id.tv_title);            tv_start_aviation_time = (TextView) view                    .findViewById(R.id.tv_start_aviation_time);        }    }    class ViewHolder5 {        TextView tv_apply_note, tv_apply_phone, tv_start_apply_leader_time;        LinearLayout ll_start_apply_leader, ll_apply_leader_content;        boolean flag_apply_leader;        ViewHolder5(View view) {            ll_start_apply_leader = (LinearLayout) view                    .findViewById(R.id.ll_start_apply_leader);            ll_apply_leader_content = (LinearLayout) view                    .findViewById(R.id.ll_apply_leader_content);            tv_apply_note = (TextView) view.findViewById(R.id.tv_apply_note);            tv_apply_phone = (TextView) view.findViewById(R.id.tv_apply_phone);            tv_start_apply_leader_time = (TextView) view                    .findViewById(R.id.tv_start_apply_leader_time);        }    }    class ViewHolder6 {        TextView tv_start_doc_time, tv_sure_take_off, tv_sure_take_off_time;        LinearLayout ll_sure_take_off;        boolean flag_take_off;        ViewHolder6(View view) {            tv_sure_take_off_time = (TextView) view                    .findViewById(R.id.tv_sure_take_off_time);            tv_sure_take_off = (TextView) view                    .findViewById(R.id.tv_sure_take_off);            ll_sure_take_off = (LinearLayout) view                    .findViewById(R.id.ll_sure_take_off);        }    }    class ViewHolder7 {        TextView tv_order_finish;        ViewHolder7(View view) {            tv_order_finish = (TextView) view                    .findViewById(R.id.tv_order_finish);        }    }    // 返回 代表某一个样式 的 数值    public ProcessListAdp(Context context, List<TypeBean> mTypeList,            List<String> leaderList, List<String> bankList,            List<String> docList, List<String> cashList,            List<String> medicalList, List<String> flightList,            List<String> taskList, List<String> timeList,            List<String> contentList, List<String> eastTimeList,            List<String> eastContentList) {        super();        this.context = context;        this.mTypeList = mTypeList;        inflater = LayoutInflater.from(context);        this.leaderList = leaderList;        this.bankList = bankList;        this.docList = docList;        this.cashList = cashList;        this.medicalList = medicalList;        this.flightList = flightList;        this.taskList = taskList;        this.timeList = timeList;        this.contentList = contentList;        this.eastTimeList = eastTimeList;        this.eastContentList = eastContentList;    }    @Override    public int getCount() {        return mTypeList.size();    }    @Override    public Object getItem(int arg0) {        return null;    }    @Override    public long getItemId(int arg0) {        return 0;    }    @Override    public int getItemViewType(int position) {        return mTypeList.get(position).type;    }    @Override    public int getViewTypeCount() {        return mTypeList.size();    }    @SuppressLint("InflateParams")    @Override    public View getView(int position, View convertView, ViewGroup parent) {        int type = getItemViewType(position);        final ViewHolder1 holder1;        final ViewHolder2 holder2;        final ViewHolder3 holder3;        final ViewHolder4 holder4;        final ViewHolder5 holder5;        final ViewHolder6 holder6;        final ViewHolder7 holder7;        if (convertView == null) {            // 选择某一个样式。。            switch (type) {            case APPOINT_DOC:                convertView = inflater.inflate(R.layout.item_start_appoint_doc,                        null);                holder1 = new ViewHolder1(convertView);                holder1.flag_start_doc = true;                holder1.flag_start_time = true;                holder1.flag_start_doc_appoint = true;                holder1.flag_doc_appoint = true;                holder1.ll_start_appoint_doc                        .setBackgroundResource(R.drawable.right_blue);                holder1.ll_start_appoint_doc                        .setOnClickListener(new OnClickListener() {                            @Override                            public void onClick(View view) {                                if (holder1.flag_start_doc) {                                    holder1.flag_start_doc = false;                                    holder1.ll_start_appoint_content                                            .setVisibility(View.VISIBLE);                                    holder1.ll_start_appoint_doc                                            .setBackgroundResource(R.drawable.down_blue);                                } else {                                    holder1.flag_start_doc = true;                                    holder1.ll_start_appoint_content                                            .setVisibility(View.GONE);                                    holder1.ll_start_appoint_doc                                            .setBackgroundResource(R.drawable.right_blue);                                }                            }                        });                final TestAdp testAdp = new TestAdp(                        context, docList);                holder1.gv_start_doc_name.setAdapter(testAdp);                holder1.gv_start_doc_name                        .setOnItemClickListener(new Gallery.OnItemClickListener() {                            @SuppressLint("ResourceAsColor")                            @Override                            public void onItemClick(AdapterView<?> parent,                                    View view, int position, long arg3) {                                holder1.flag_doc_appoint = false;                                for (int i = 0; i < parent.getCount(); i++) {                                    View v = parent.getChildAt(i);                                    if (position == i) {// 当前选中的Item改变背景颜色                                        view.setBackgroundResource(R.drawable.btn_gem_green);                                        testAdp                                                .setSeclection(position);                                        testAdp.notifyDataSetChanged();                                    } else {                                        v.setBackgroundResource(R.drawable.btn_border_green);                                    }                                }                            }                        });                holder1.btn_start_sure                        .setOnClickListener(new OnClickListener() {                            @Override                            public void onClick(View arg0) {                            }                        });                convertView.setTag(holder1);                break;            case INFORM_CLIENT:                convertView = inflater.inflate(                        R.layout.item_start_inform_client, null);                holder2 = new ViewHolder2(convertView);                holder2.flag_inform_client = true;                holder2.flag_inform_do_pro = true;                holder2.flag_cash_appoint = true;                holder2.flag_inform_do_pro_appoint = true;                isPay = false;                final ProcessAdp eastAdp = new ProcessAdp(context, eastTimeList,                        eastContentList);                holder2.lv_east.setAdapter(eastAdp);                eastAdp.notifyDataSetChanged();                holder2.ll_start_inform_client                        .setBackgroundResource(R.drawable.right_blue);                holder2.ll_start_inform_client                        .setOnClickListener(new OnClickListener() {                            @Override                            public void onClick(View arg0) {                                if (holder2.flag_inform_client) {                                    holder2.flag_inform_client = false;                                    holder2.ll_inform_client_pay                                            .setVisibility(View.VISIBLE);                                    holder2.ll_start_inform_client                                            .setBackgroundResource(R.drawable.down_blue);                                } else {                                    holder2.flag_inform_client = true;                                    holder2.ll_inform_client_pay                                            .setVisibility(View.GONE);                                    holder2.ll_start_inform_client                                            .setBackgroundResource(R.drawable.right_blue);                                }                            }                        });                final TestAdp cashAdp = new TestAdp(context,                        cashList);                holder2.gv_cash_appoint.setAdapter(cashAdp);                holder2.btn_client_upload                        .setOnClickListener(new OnClickListener() {                            @Override                            public void onClick(View arg0) {                            }                        });                holder2.gv_cash_appoint                        .setOnItemClickListener(new Gallery.OnItemClickListener() {                            @SuppressLint("ResourceAsColor")                            @Override                            public void onItemClick(AdapterView<?> parent,                                    View view, int position, long arg3) {                                holder2.flag_cash_appoint = false;                                for (int i = 0; i < parent.getCount(); i++) {                                    View v = parent.getChildAt(i);                                    if (position == i) {// 当前选中的Item改变背景颜色                                        view.setBackgroundResource(R.drawable.btn_gem_green);                                        cashAdp                                                .setSeclection(position);                                        cashAdp.notifyDataSetChanged();                                    } else {                                        v.setBackgroundResource(R.drawable.btn_border_green);                                    }                                }                            }                        });                holder2.btn_cash_appoint                        .setOnClickListener(new OnClickListener() {                            @Override                            public void onClick(View view) {                            }                        });                holder2.flag_client_insure = true;                holder2.flag_affirm_gathering = true;                convertView.setTag(holder2);                break;            case REQUEST_EXPERT:                convertView = inflater.inflate(                        R.layout.item_start_request_expert, null);                holder3 = new ViewHolder3(convertView);                holder3.flag_request_expert = true;                holder3.flag_request_expert_appoint = true;                holder3.flag_expert_appoint = true;                holder3.ll_start_request_expert                        .setBackgroundResource(R.drawable.right_blue);                holder3.ll_start_request_expert                        .setOnClickListener(new OnClickListener() {                            @Override                            public void onClick(View arg0) {                                if (holder3.flag_request_expert) {                                    holder3.flag_request_expert = false;                                    holder3.ll_start_request_expert_content                                            .setVisibility(View.VISIBLE);                                    holder3.ll_start_request_expert                                            .setBackgroundResource(R.drawable.down_blue);                                } else {                                    holder3.flag_request_expert = true;                                    holder3.ll_start_request_expert_content                                            .setVisibility(View.GONE);                                    holder3.ll_start_request_expert                                            .setBackgroundResource(R.drawable.right_blue);                                }                            }                        });                final TestAdp expertAdp = new TestAdp(                        context, medicalList);                holder3.gv_start_request_name.setAdapter(expertAdp);                holder3.gv_start_request_name                        .setOnItemClickListener(new Gallery.OnItemClickListener() {                            @SuppressLint("ResourceAsColor")                            @Override                            public void onItemClick(AdapterView<?> parent,                                    View view, int position, long arg3) {                                holder3.flag_expert_appoint = false;                                for (int i = 0; i < parent.getCount(); i++) {                                    View v = parent.getChildAt(i);                                    if (position == i) {// 当前选中的Item改变背景颜色                                        view.setBackgroundResource(R.drawable.btn_gem_green);                                        expertAdp                                                .setSeclection(position);                                        expertAdp.notifyDataSetChanged();                                    } else {                                        v.setBackgroundResource(R.drawable.btn_border_green);                                    }                                }                            }                        });                holder3.btn_expert_appoint                        .setOnClickListener(new OnClickListener() {                            @Override                            public void onClick(View view) {                                holder3.ll_start_request_expert                                        .setBackgroundResource(R.drawable.btn_red);                            }                        });                convertView.setTag(holder3);                break;            case INFORM_AVIATION:                convertView = inflater.inflate(                        R.layout.item_start_inform_aviation, null);                holder4 = new ViewHolder4(convertView);                holder4.flag_inform_aviation = true;                holder4.flag_inform_aviation_appoint = true;                holder4.flag_aviation_appoint = true;                final ProcessAdp adp = new ProcessAdp(context, timeList,                        contentList);                holder4.lv_start_aoc.setAdapter(adp);                adp.notifyDataSetChanged();                holder4.ll_start_inform_aviation                        .setBackgroundResource(R.drawable.right_blue);                holder4.ll_start_inform_aviation                        .setOnClickListener(new OnClickListener() {                            @Override                            public void onClick(View arg0) {                                if (holder4.flag_inform_aviation) {                                    holder4.flag_inform_aviation = false;                                    holder4.ll_start_inform_aviation_content                                            .setVisibility(View.VISIBLE);                                    holder4.ll_start_inform_aviation                                            .setBackgroundResource(R.drawable.down_blue);                                } else {                                    holder4.flag_inform_aviation = true;                                    holder4.ll_start_inform_aviation_content                                            .setVisibility(View.GONE);                                    holder4.ll_start_inform_aviation                                            .setBackgroundResource(R.drawable.right_blue);                                }                            }                        });                holder4.btn_aviation_appoint                        .setOnClickListener(new OnClickListener() {                            @Override                            public void onClick(View view) {                            }                        });                convertView.setTag(holder4);                break;            case APPLY_LEADER:                convertView = inflater.inflate(                        R.layout.item_start_apply_leader, null);                holder5 = new ViewHolder5(convertView);                holder5.flag_apply_leader = true;                holder5.ll_start_apply_leader                        .setBackgroundResource(R.drawable.right_purplre);                final String leaderPhone = leaderList.get(0);                holder5.ll_start_apply_leader                        .setOnClickListener(new OnClickListener() {                            @Override                            public void onClick(View arg0) {                                if (holder5.flag_apply_leader) {                                    holder5.flag_apply_leader = false;                                    holder5.ll_apply_leader_content                                            .setVisibility(View.VISIBLE);                                    holder5.ll_start_apply_leader                                            .setBackgroundResource(R.drawable.down_purplre);                                } else {                                    holder5.flag_apply_leader = true;                                    holder5.ll_apply_leader_content                                            .setVisibility(View.GONE);                                    holder5.ll_start_apply_leader                                            .setBackgroundResource(R.drawable.right_purplre);                                }                            }                        });                holder5.tv_apply_note.setOnClickListener(new OnClickListener() {                    @Override                    public void onClick(View arg0) {                        Intent intent = new Intent();                        // 系统默认的action,用来打开默认的短信界面                        intent.setAction(Intent.ACTION_SENDTO);                        // 需要发短息的号码                        intent.setData(Uri.parse("smsto:" + leaderPhone));                        context.startActivity(intent);                    }                });                holder5.tv_apply_phone                        .setOnClickListener(new OnClickListener() {                            @Override                            public void onClick(View arg0) {                            }                        });                convertView.setTag(holder5);                break;            case PREPARE_TAKE_OFF:                convertView = inflater.inflate(                        R.layout.item_start_prepare_take_off, null);                holder6 = new ViewHolder6(convertView);                    holder6.tv_sure_take_off                            .setBackgroundResource(R.color.bg_red);                convertView.setTag(holder6);                break;            case ORDER_FINISH:                convertView = inflater.inflate(                        R.layout.item_start_order_finish, null);                holder7 = new ViewHolder7(convertView);                    holder7.tv_order_finish                            .setBackgroundResource(R.color.bg_gem_green);                convertView.setTag(holder7);                break;            }        } else {            switch (type) {            case APPOINT_DOC:                holder1 = (ViewHolder1) convertView.getTag();                break;            case INFORM_CLIENT:                holder2 = (ViewHolder2) convertView.getTag();                break;            case REQUEST_EXPERT:                holder3 = (ViewHolder3) convertView.getTag();                break;            case INFORM_AVIATION:                holder4 = (ViewHolder4) convertView.getTag();                break;            case APPLY_LEADER:                holder5 = (ViewHolder5) convertView.getTag();                break;            case PREPARE_TAKE_OFF:                holder6 = (ViewHolder6) convertView.getTag();                break;            case ORDER_FINISH:                holder7 = (ViewHolder7) convertView.getTag();                break;            }        }        return convertView;    }}

点击此处免费下载源码
点击github下载
如果您对本人的劳动成果感到认可还请给予好评,如有疑问请加Android交流群 470707794或留言,本人定当竭力为您提供帮助,如果您有好的建议或能修改更好还请您不吝赐教更新到github上面来帮助更多的人。

3 1
原创粉丝点击