listview的多佈局實現

實現代碼

Adapter的代碼

其中:ViewHolder分別是三個不同的佈局,也就是ListView中每一項的佈局

TYPE_1...是三種類型.

在使用不同佈局的時候,getItemViewType和getViewTypeCount不能少,一般的同一種item的列表是不用這兩個函數的重載的,但是如果需要不同種類的item,就必須重載這兩個

class RunRankAdapter extends BaseAdapter {  
    ArrayList<HashMap<String, Object>> ls;  
    Context mContext;  
    LinearLayout linearLayout = null;  
    LayoutInflater inflater;  
    TextView tex;  
    final int VIEW_TYPE = 3;  
    final int TYPE_1 = 0;  
    final int TYPE_2 = 1;  
    final int TYPE_3 = 2;  
  
    public RunRankAdapter(Context context,  
            ArrayList<HashMap<String, Object>> list) {  
        ls = list;  
        mContext = context;  
    }  
  
    @Override  
    public int getCount() {  
        return ls.size();  
    }  
  
    @Override  
    public Object getItem(int position) {  
        return ls.get(position);  
    }  
  
    @Override  
    public long getItemId(int position) {  
        return 0;  
    }  
  
    // 每個convert view都會調用此方法,獲得當前所需要的view樣式  
    @Override  
    public int getItemViewType(int position) {  
        int p = position;  
        if (p == 0)  
            return TYPE_1;  
        else if (p == 1)  
            return TYPE_2;  
        else  
            return TYPE_3;  
    }  
  
    @Override  
    public int getViewTypeCount() {  
        return 3;  
    }  
  
    @Override  
    public View getView(int position, View convertView, ViewGroup parent) {  
        ViewHolder1 holder1 = null;  
        ViewHolder2 holder2 = null;  
        ViewHolder3 holder3 = null;  
        int type = getItemViewType(position);  
        if (convertView == null) {  
            inflater = LayoutInflater.from(mContext);  
            // 按當前所需的樣式,確定new的佈局  
            switch (type) {  
            case TYPE_1:  
  
                convertView = inflater.inflate(R.layout.item_runrank1,  
                        parent, false);  
                holder1 = new ViewHolder1();  
                holder1.rank1 = (TextView) convertView  
                        .findViewById(R.id.tv_list1_rank);  
                holder1.time1 = (TextView) convertView  
                        .findViewById(R.id.tv_list1_time);  
                convertView.setTag(holder1);  
                break;  
            case TYPE_2:  
                convertView = inflater.inflate(R.layout.item_runrank2,  
                        parent, false);  
                holder2 = new ViewHolder2();  
                holder2.rank2 = (TextView) convertView  
                        .findViewById(R.id.tv_list2_rank);  
                holder2.time2 = (TextView) convertView  
                        .findViewById(R.id.tv_list2_time);  
                convertView.setTag(holder2);  
                break;  
            case TYPE_3:  
                convertView = inflater.inflate(R.layout.item_runrank3,  
                        parent, false);  
                holder3 = new ViewHolder3();  
                holder3.rank3 = (TextView) convertView  
                        .findViewById(R.id.tv_list3_rank);  
                holder3.time3 = (TextView) convertView  
                        .findViewById(R.id.tv_list3_time);  
                convertView.setTag(holder3);  
                break;  
            default:  
                break;  
            }  
  
        } else {  
            switch (type) {  
            case TYPE_1:  
                holder1 = (ViewHolder1) convertView.getTag();  
                break;  
            case TYPE_2:  
                holder2 = (ViewHolder2) convertView.getTag();  
                break;  
            case TYPE_3:  
                holder3 = (ViewHolder3) convertView.getTag();  
                break;  
            }  
        }  
        // 設置資源  
        switch (type) {  
        case TYPE_1:  
            holder1.rank1.setText("" + (position + 1));  
            holder1.time1.setText(ls.get(position).get("time").toString());  
            break;  
        case TYPE_2:  
            holder2.rank2.setText("" + (position + 1));  
            holder2.time2.setText(ls.get(position).get("time").toString());  
            holder2.totaldistance2.setText(ls.get(position)  
            break;  
        case TYPE_3:  
            holder3.rank3.setText("" + (position + 1));  
            holder3.time3.setText(ls.get(position).get("time").toString());  
            break;  
        }  
  
        return convertView;  
    }  
  
    public class ViewHolder1 {  
        TextView rank1;  
        TextView time1;  
    }  
  
    public class ViewHolder2 {  
        TextView rank2;  
        TextView time2;  
    }  
  
    public class ViewHolder3 {  
        TextView rank3;  
        TextView time3;  
    }  
}  

使用方式:

聲明並定義自己的Adapter,在ListView中設置他的Adapter

private RunRankAdapter runRankAdapter;    
ArrayList<HashMap<String, Object>> runRank;    
ListView lv_runRank;  
runRank = new ArrayList<HashMap<String, Object>>();    
runRankAdapter = new RunRankAdapter(this, runRank);    
lv_runRank = (ListView) findViewById(R.id.lv_runRank);    
lv_runRank.setAdapter(runRankAdapter);  

 

還有一種方法:

在主佈局文件中包含一個LinearLayout. 並且設置android:orientation="vertical"
定義兩種不同的佈局文件,然後代碼中,根據不同條件調用.addview向LinearLayout加載就可以了

需要注意的地方:adapter中的getViewTypeCount()方法一定要重載,返回值應該是不同佈局的種類數

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章