listview的多布局实现

实现代码

Adapter的代码

其中:ViewHolder分别是三个不同的布局,也就是ListView中每一项的布局

TYPE_1...是三种类型.

在使用不同布局的时候,getItemViewType和getViewTypeCount不能少,一般的同一种item的列表是不用这两个函数的重载的,但是如果需要不同种类的item,就必须重载这两个

class RunRankAdapter extends BaseAdapter {  
    ArrayList> 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> 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> runRank;    
ListView lv_runRank;  
runRank = new ArrayList>();    
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()方法一定要重载,返回值应该是不同布局的种类数

 

 

你可能感兴趣的:(View)