Android ListView的多布局实现

本文介绍如何使用ListView实现多布局效果,通过重写getItemViewType和getViewTypeCount方法,并提供具体的Activity与Adapter代码示例。

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

实现效果:
这里写图片描述

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

一、Activity的XML代码

  <ListView
      android:id="@+id/listview"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_marginLeft="18dp"
      /*设置分割线
	    android:divider="#bbb" 分隔线颜色
        android:dividerHeight="1dp" 分隔线高*/
	  
	  /*不设置分割线*/
      android:divider="@null"
      /*点击item没有背景颜色变化*/
      android:listSelector="#0000"
      /*没有滚动条*/
      android:scrollbars="none" />

二、Activity代码

public class RecentStudyActivity extends Activity {
    private List<Object> 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<Object> list;

    public RecentStydyAdapter(Context context, List<Object> 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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值