Android ListView的多布局实现

ListView的多布局是通过重写 getItemViewType(int position)和 getViewTypeCount() 来实现的。
getItemViewType(int position):获取position位置数据的类型。
getViewTypeCount():获取共有几种类型的数据。

实现效果:
Android ListView的多布局实现_第1张图片

我这里是通过ImageView和TextView实现了2种简单的布局,对于复杂的或者是更多的布局效果,实现方法也是类似的。

一、Activity的XML代码

  

二、Activity代码

public class RecentStudyActivity extends Activity {
    private List list;
    private RecentStydyAdapter adapter;
    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recent_study);
        init();
        loadData();
    }

    private void init() {
        listView = (ListView) findViewById(R.id.listview_study);
        list = new ArrayList<>();
        adapter = new RecentStydyAdapter(this, list);
        listView.setAdapter(adapter);
    }

    private void loadData() {
        int[] image = {
	        R.mipmap.ic_today_gaokao,
	        R.mipmap.ic_yesterday, 
	        R.mipmap.ic_week, 
	        R.mipmap.ic_earlier
	    };

        list.add(image[0]);
        list.add("Android高级1");
        list.add("Android高级2");
        list.add("Android高级3");
        list.add("Android高级4");

        list.add(image[1]);
        list.add("Android基础2");
        list.add("Android基础3");
        list.add("Android基础4");

        list.add(image[2]);
        list.add("Android基础1");

        list.add(image[3]);
        list.add("Java基础1");
        list.add("Java基础2");
        list.add("Java基础3");
        adapter.notifyDataSetChanged();
    }
}


 
  

三、适配器代码

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 java.util.List;

public class RecentStydyAdapter extends BaseAdapter {
    private Context context;
    private List list;

    public RecentStydyAdapter(Context context, List list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        int ret = 0;
        if (list != null) {
            ret = list.size();
        }
        return ret;
    }

    @Override
    public int getItemViewType(int position) {
        int ret = 0;
        Object object = list.get(position);
        //通过数据类型的不同类来设置item的类型
        if (object instanceof String) {
            ret = 0;
        } else if (object instanceof Integer) {
            ret = 1;
        }
        return ret;
    }

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

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
	    //通过item的类型不同类来设置不同的布局
        if (getItemViewType(position) == 0) {
            convertView = bindTv(position, convertView, parent);
        } else if (getItemViewType(position) == 1) {
            convertView = bindImg(position, convertView, parent);
        }
        return convertView;
    }

    private View bindImg(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.item_recent_img, null);
            holder = new ViewHolder();
            holder.img = (ImageView) convertView.findViewById(R.id.img_recent);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        Object object = list.get(position);
        if (object instanceof Integer) {
            int img = (int) object;
            holder.img.setImageResource(img);
        }
        return convertView;
    }

    private View bindTv(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.item_recent_tv, null);
            holder = new ViewHolder();
            holder.tv = (TextView) convertView.findViewById(R.id.tv_recent);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        Object object = list.get(position);
        if (object instanceof String) {
            String ret = (String) object;
            holder.tv.setText(ret);
        }
        return convertView;
    }

    class ViewHolder {
        TextView tv;
        ImageView img;
    }
}

 
  

                            
                        
                    
                    
                    

你可能感兴趣的:(Android控件的使用)