復雜 Listview 顯示 多個樣式



三種方式
目前為止有三種方法讓 Listview現實多個樣式
  • 最簡單最常用的,通過addHeaderView或addFooterView,但是只能在首尾添加
  • 較麻煩但正規的方式,通過getViewTypeCount[View有多少個樣式]和getItemViewType[這個View是哪個樣式]方法設
  • 較簡單但不正規的方式,通過判斷poison的值加載不同的布局,但這種方式可能有隱患[從代碼中可以看出很不規范]
addHeaderView方式
  • 當listview需要添加headerview時,可以通過調用listview的addHeaderView(headView)addHeaderView(headView, null, false) 方法,后一個可以控制header是否可以被selected
  • addHeaderView方法必須放在listview.setAdapter前面,否則會報錯。原因是調用setAdapter方法時會判斷是否已經添加header,如果已經添加則會生成一個新的tempAdapter,這個新的tempAdapter包含我們設置的adapter所有內容(包含header和footer),所以當我們在給listview添加了header后在程序中調用listview.getAdapter時返回的是tempAdapter而不是我們通過setAdapter傳進去的adapter。如果沒有設置adapter則tempadapter與我們自己的adapter是一樣的。
  • listview.getadapter().getcount()方法返回值會比我們預期的要大,原因是添加了header。
標准方式:
  • getViewTypeCount:返回的是你有幾種類型的樣式(返回不同布局的數目)
  • getItemViewType:返回值代表的是某一個樣式的 Type(是一個需要我們自己定義的,用於區分不同樣式的int類型的值),參數position所決定的的view的id



布局-樣式
    

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#cfc"
    android:orientation="horizontal"
    android:padding="1dp" >
    <ListView
        android:id="@+id/lv1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:descendantFocusability="afterDescendants"
        android:listSelector="@android:color/transparent" />
    <ListView
        android:id="@+id/lv2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_marginLeft="3dp"
        android:layout_weight="1"
        android:descendantFocusability="afterDescendants"
        android:listSelector="@android:color/transparent" />
    <ListView
        android:id="@+id/lv3"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_marginLeft="3dp"
        android:layout_weight="1"
        android:descendantFocusability="afterDescendants"
        android:listSelector="@android:color/transparent" />
</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#80f8"
    android:gravity="clip_vertical" >
    <TextView
        android:id="@+id/holder1_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:padding="5dp"
        android:singleLine="true"
        android:text="大標題"
        android:textColor="#f00"
        android:textSize="15sp" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="30dp"
    android:background="#ffffff"
    android:gravity="center_vertical"
    android:orientation="horizontal" >
    <ImageView
        android:id="@+id/holder2_iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />
    <TextView
        android:id="@+id/holder2_title"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="5dp"
        android:gravity="center_vertical"
        android:text="小標題"
        android:textColor="#00f"
        android:textSize="13sp" />
</LinearLayout>


代碼-Activity
import  java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.AbsListView.LayoutParams;
import android.widget.ListView;
import android.widget.TextView;
import com.example.hjfg.R;
public class MainActivity extends Activity {
    private ListView lv1;
    private ListView lv2;
    private ListView lv3;
    private List<MyBean> mList1;
    private List<ViewItem> mList2;
    private List<MyBean> mList31;
    private List<MyBean> mList32;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv1 = (ListView) findViewById(R.id.lv1);
        lv2 = (ListView) findViewById(R.id.lv2);
        lv3 = (ListView) findViewById(R.id.lv3);
        initData1();
        initData2();
        initData3();
        lv1.setAdapter(new MyAdapter1(thismList1));//addHeaderView要放在setAdapter之前,而addFooterView放在前后都可以
        lv2.setAdapter(new MyAdapter2(thismList2));
        lv3.setAdapter(new MyAdapter3(thismList31mList32));
    }
    private void initData1() {
        mList1 = new ArrayList<MyBean>();
        for (int i = 0; i < 20; i++) {
            mList1.add(new MyBean(("包青天" + i), R.drawable.ic_launcher));
        }
        //給ListView添加頭尾,其中Adapter不需任何改變
        TextView mTextView = new TextView(this);
        mTextView.setText("我是【先】添加的的頭部");
        mTextView.setBackgroundColor(0xff4EEE94);
        ImageView mImageView = new ImageView(this);
        mImageView.setImageResource(R.drawable.ic_launcher);
        lv1.addHeaderView(mTextView);//添加以后,listView 的position = 0 的位置對應的是此mTextView,他和其他item是完全等價的
        lv1.addHeaderView(mImageView);
        lv1.setHeaderDividersEnabled(true);//控制頭部是否顯示分割線。默認為true
        //最后加一個透明的控件,那么最后那條分割線【可能】就出來了
        View footerView = new View(this);
        LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, 50);
        footerView.setBackgroundColor(0x00112233);//透明
        footerView.setLayoutParams(layoutParams);
        lv1.addFooterView(footerView);
    }
    private void initData2() {
        mList2 = new ArrayList<ViewItem>();
        for (int i = 0; i < 30; i++) {
            ViewItem item;
            if (i % 5 == 0 || i == 3) item = new ViewItem(0, "大標題 " + i);
            else item = new ViewItem(1, "內容 " + i, R.drawable.ic_launcher);
            mList2.add(item);
        }
    }
    private void initData3() {
        mList31 = new ArrayList<MyBean>();
        mList32 = new ArrayList<MyBean>();
        for (int i = 0; i < 18; i++) {
            mList31.add(new MyBean(("包青天" + i), R.drawable.ic_launcher));
            if (i < 12) mList32.add(new MyBean(("白乾濤" + i), R.drawable.icon));
        }
    }
}


代碼-Adapter1
import  java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.hjfg.R;
public class MyAdapter1 extends BaseAdapter {
    private Context mContext;
    private List<MyBean> mList;
    private ViewHolder mViewHolder;
    private MyBean mBean;
    public MyAdapter1(Context context, List<MyBean> list) {
        this.mContext = context;
        this.mList = list;
    }
    @Override
    public int getCount() {
        return mList.size();
    }
    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView != null) {
            mViewHolder = (ViewHolder) convertView.getTag();
        } else {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.itemnull);
            mViewHolder = new ViewHolder();
            mViewHolder.iv_head = (ImageView) convertView.findViewById(R.id.holder2_iv);
            mViewHolder.tv_name = (TextView) convertView.findViewById(R.id.holder2_title);
            convertView.setTag(mViewHolder);
        }
        mBean = mList.get(position);
        mViewHolder.iv_head.setImageResource(mBean.getId());
        mViewHolder.tv_name.setText(mBean.getName());
        return convertView;
    }
    public static class ViewHolder {
        public ImageView iv_head;// 頭像
        public TextView tv_name;// 名字
    }
}


代碼-Adapter2
import  java.util.List;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.hjfg.R;
public class MyAdapter2 extends BaseAdapter {
    private Context context;
    private List<ViewItem> mList;
    private Holder1 holder1;
    private Holder2 holder2;
    public MyAdapter2(Context context, List<ViewItem> list) {
        this.context = context;
        mList = list;
    }
    //**********************************************************************************************************
    @Override
    public int getCount() {
        return mList.size();
    }
    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }
    //重寫方法一:返回值代表的是某一個樣式的 Type(是一個需要我們自己定義的,用於區分不同樣式的int類型的值)
    @Override
    public int getItemViewType(int position) {
        return mList.get(position).getType();
    }
    //重寫方法一:返回的是你有幾種類型的樣式
    @Override
    public int getViewTypeCount() {
        return 2;
    }
    @Override
    public long getItemId(int paramInt) {
        return paramInt;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        int type = getItemViewType(position);
        if (convertView == null) {
            //選擇某一個樣式
            switch (type) {
            case ViewItem.ITEM_FIRST:
                convertView = View.inflate(context, R.layout.headnull);
                holder1 = new Holder1();
                holder1.holder1_title = (TextView) convertView.findViewById(R.id.holder1_title);
                holder1.holder1_title.setText(mList.get(position).getTitle());
                convertView.setTag(holder1);
                break;
            case ViewItem.ITEM_SECOND:
                convertView = View.inflate(context, R.layout.itemnull);
                holder2 = new Holder2();
                holder2.holder2_title = (TextView) convertView.findViewById(R.id.holder2_title);
                holder2.holder2_iv = (ImageView) convertView.findViewById(R.id.holder2_iv);
                holder2.holder2_title.setText(mList.get(position).getTitle());
                holder2.holder2_iv.setImageResource(mList.get(position).getId());
                convertView.setTag(holder2);
                break;
            default:
                break;
            }
        } else {
            switch (type) {
            case ViewItem.ITEM_FIRST:
                holder1 = (Holder1) convertView.getTag();
                holder1.holder1_title.setText(mList.get(position).getTitle());
                break;
            case ViewItem.ITEM_SECOND:
                holder2 = (Holder2) convertView.getTag();
                holder2.holder2_title.setText(mList.get(position).getTitle());
                break;
            default:
                break;
            }
        }
        return convertView;
    }
    //***********************************************************************************************************
    //復用convertView
    private class Holder1 {
        TextView holder1_title;
    }
    private class Holder2 {
        TextView holder2_title;
        ImageView holder2_iv;
    }
}


代碼-Adapter3
import  java.util.List;
import com.example.hjfg.R;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class MyAdapter3 extends BaseAdapter {
    private Context mContext;
    private List<MyBean> mList1;
    private List<MyBean> mList2;
    private ViewHolder holder;
    private MyBean mBean;
    public MyAdapter3(Context context, List<MyBean> list1, List<MyBean> list2) {
        mContext = context;
        mList1 = list1;
        mList2 = list2;
    }
    //************************************************************************************************************
    @Override
    public int getCount() {
        return mList1.size() + 1 + mList2.size() + 1;
    }
    @Override
    public Object getItem(int position) {
        return null;
    }
    @Override
    public long getItemId(int position) {
        return 0;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //標題******************************************************************************************************
        if (position == 0) {
            View view = View.inflate(mContext, R.layout.headnull);
            TextView tv = (TextView) view.findViewById(R.id.holder1_title);
            tv.setText("包青天有" + mList1.size() + "個");
            return view;
        else if (position == (mList1.size() + 1)) {
            View view = View.inflate(mContext, R.layout.headnull);
            TextView tv = (TextView) view.findViewById(R.id.holder1_title);
            tv.setText("白乾濤有" + mList2.size() + "個");
            return view;
        }
        //內容******************************************************************************************************
        holder = new ViewHolder();//因為數據結構相同,所以可以共同利用緩存,否則只能單獨利用緩存
        if (position <= mList1.size()) {
            int newposition = position - 1;
            mBean = mList1.get(newposition);
        else if (position > mList1.size() + 1) {
            int newposition = position - 1 - mList1.size() - 1;
            mBean = mList2.get(newposition);
        }
        if (convertView != null && convertView instanceof RelativeLayout) { // 不僅需要檢查是否為空,還要判斷是否是合適的類型
            holder = (ViewHolder) convertView.getTag();
        } else {
            convertView = View.inflate(mContext, R.layout.itemnull);
            holder = new ViewHolder();
            holder.iv_icon = (ImageView) convertView.findViewById(R.id.holder2_iv);
            holder.tv_name = (TextView) convertView.findViewById(R.id.holder2_title);
            convertView.setTag(holder);
        }
        holder.iv_icon.setImageResource(mBean.getId());
        holder.tv_name.setText(mBean.getName());
        return convertView;
    }
    //*********************************************************************************************************
    private static class ViewHolder {
        TextView tv_name;
        ImageView iv_icon;
    }
}


代碼-bean
public   class  MyBean {
    private String name;
    private int id;
    public MyBean(String name, int id) {
        this.name = name;
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public int getId() {
        return id;
    }
}
// 封裝每個條目的數據數據
public class ViewItem {
    public static final int ITEM_FIRST = 0;//第一個樣式
    public static final int ITEM_SECOND = 1;//第二個樣式
    private int type;//記錄是哪種樣式
    private String title;//標題
    private int id;//圖片,僅第二個樣式可以獲取圖片
    public ViewItem(int type, String str) {
        this.type = type;
        title = str;
    }
    public ViewItem(int type, String str, int id) {
        this.type = type;
        title = str;
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public int getId() {
        if (type == ITEM_SECONDreturn id;
        else throw new RuntimeException("哥們是大標題,沒有ID");
    }
    public int getType() {
        return type;
    }
}






附件列表

     


    免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM