Android UI基础——ListView控件及Adapter适配器

好久没更主要原因是在这般遇到了点困难,一直没理解,最近理解了一点就来写一下。


ListView

首先了解一下它的继承关系,如下图:
这里写图片描述
可以看到它继承于AdapterView,AdapterView也是一个重要的组件,本身是一个抽象类,又继承于ViewGroup,所以其本质是容器,AdapterView可以包括多个“列表项”,显示的多个“列表项”由Adapter(适配器)提供,其派生的子类即今天重点描述的ListView也有此特征。
ListView是手机应用中使用很广的一个控件,它会以垂直列表的形式显示所有的列表项。首先需要在布局文件中定义,如下:

<ListView
        android:id="@+id/list_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:divider="@color/colorAccent"
        android:dividerHeight="3dp"/>

注:
android:divider属性:设置list列表项的分隔条
android:dividerHeight:设置分隔条的高度

Adapter(适配器)

因为我们定义的数组的数据无法直接传递给ListView,想要显示列表项就要通过Adapter来实现了,Adapter是一个接口,今天要用的只是它的三个实现类,这三个Adapter的实现类都可以为ListView填充数据:
①ArrayAdapter:简单易用的Adapter,可以通过泛型指点要适配的数据类型,通常用到的情况都只是包含文本信息。其实现的代码如下:

public class ArrayActivity extends AppCompatActivity {
    private ListView mListView;
    private ArrayList<String> list ;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_array);
        mListView = (ListView) findViewById(R.id.list_view);
        list = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            String str = "第"+i+"条数据";
            list.add(str);
        }
        //设置ArrayAdapter设配器,传递的三个参数是:①Context:访问应用的接口  ②resource:一个布局的资源ID文件(这边用的是系统自带的布局) ③list:负责为多个列表项提供数据
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line, list);
        mListView.setAdapter(adapter);
    }
}

效果图如下:
这里写图片描述
②SimpleAdapter:比ArrayAdapter复杂,但是功能强大,可将List的多个对象包装成列表项,具体在代码中理解:

public class SimpleActivity extends AppCompatActivity{
    private ListView mListView;
    private List<Map<String,Object>>mapList;//List集合的元素是Map
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
        mListView = (ListView) findViewById(R.id.list_base);
        mapList = new ArrayList<Map<String,Object>>();
        for (int i = 0; i < 30; i++) {
            Map<String,Object> map = new HashMap<String, Object>();
            map.put("icon",R.mipmap.heard_3);
            map.put("text1","用户"+i);
            map.put("text2","第"+i+"条内容");
            mapList.add(map);
        }
        //设置SimpleAdapter,需要传五个参数
        //①Context:访问应用的接口
        //②List集合对象生成一个列表项
        //③指定一个布局的ID(此处为自己创建的布局,根据自己列表项中的内容布局)
        //④String[]类型的参数,提取Map元素中的key值
        //⑤int[]类型的参数,决定填充哪些组件
        SimpleAdapter adapter = new SimpleAdapter(this,mapList,R.layout.custom,
                new String[]{"icon","text1","text2"},new int[]{R.id.image_custom,R.id.text_custom,R.id.text_custom});
        mListView.setAdapter(adapter);
    }
}

效果图如下:
这里写图片描述
③BaseAdapter:通常用于被拓展,也就是自定义的Adapter,灵活性最强,也最常用。需要重写四个方法:getCount()、getItem()、getItemId()和getView()。
int getCount():返回填充的数据项的个数,必须返回真实值
Object getItem(int position):根据position返回某一项数据
long getItemId(int position):根据position返回某一项的行ID
View getView(int position, View convertView, ViewGroup parent):根据position返回某一项的界面View,显示给用户
代码如下:
先写一个MyAdapter类继承于BaseAdapter:

public class MyAdapter extends BaseAdapter{
    private Context mContext;
    private ArrayList<String> list;
    private ArrayList<String> list1;

    public MyAdapter(ArrayList<String> list, Context mContext,ArrayList<String> list1) {
        this.list = list;
        this.mContext = mContext;
        this.list1 = list1;
    }

    //    private LayoutInflater mLayoutInflater;//加载自定义布局
    @Override
    public int getCount() {
        return list.size();
    }

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //使用布局填充器进行布局
        convertView = LayoutInflater.from((Context) mContext).inflate(R.layout.custom,null);
        //获得布局中的子控件
        ImageView image = (ImageView) convertView.findViewById(R.id.image_custom);
        image.setImageResource(R.mipmap.header_1);

        TextView textView = (TextView) convertView.findViewById(R.id.text_custom);
        //给textView 中传内容
        textView.setText(list.get(position));

        TextView textView1 = (TextView) convertView.findViewById(R.id.text_custom1);
        textView1.setText(list1.get(position));
        return convertView;
    }
}

然后实现适配Adapter显示列表项:

public class BaseActivity extends AppCompatActivity {
    private ListView mListView;
    private ArrayList<String> list;
    private ArrayList<String> list1;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
        mListView = (ListView) findViewById(R.id.list_base);
        //数据初始化
        list = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            String str = "第"+i+"条数据";
            list.add(str);
        }
        list1 = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            String str = i+"条内容";
            list1.add(str);
        }

        MyAdapter myAdapter = new MyAdapter(list, this,list1);
        mListView.setAdapter(myAdapter);
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值