android listview的适配器------baseadapter

来源:互联网 发布:js for循环 编辑:程序博客网 时间:2024/06/02 10:51

基础篇:

适配器是一种设计模式,在android 中 比如说listview gridview recyclerview 等  都用到这个概念。就是对于不同的数据源展示到列表或者网格中。需要一个适配器,适配器讲不同的数据源展示到列表当中去。   适配器其实也就是起一个桥梁作用。就像usb 接口一样  ,不管你MP3 PM4,手机,dvd等等 产品 你实现这个接口就行了。就能将数据和view 配合在一起使用了。

1,用到listview baseadapter 简单的布局文件

2,写一个类继承与baseadapter

3,将 适配器和listview 关联起来就行ok了

为了说明适配器的作用待会同一个listview 我会写出来两种适配器然后看不同的效果就  行了。

activity的布局文件


<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent">    <!--既然要将listview 就不写那么多冗余的东西了 -->    <ListView        android:id="@+id/lv"        android:layout_width="match_parent"        android:layout_height="wrap_content"></ListView></LinearLayout>

listview item 的布局文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent">    <!--简单定义了listview 的item-->    <TextView        android:id="@+id/tv"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:textSize="20sp"        android:gravity="center"        /></LinearLayout>

先给出适配器的写法

package com.lefeng.lfvideo.myndk.adapter;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import com.lefeng.lfvideo.myndk.R;import java.util.List;/** * Created by CYL on 2016/3/26. * email:670654904@qq.com */public class MyAdapter1 extends BaseAdapter{    //数据源 建议 包含一个对象  方便操作    private List<String> dataSource;    //初始化 listview 每个item 的布局文件    private LayoutInflater inflater;    /**     * 构造器     * @param dataSource 数据源     * @param context     上下文     */    public MyAdapter1(List<String> dataSource, Context context) {        this.dataSource = dataSource;        this.inflater = LayoutInflater.from(context);    }    /**     * 获取listview 总长度  也就是数据源的长度     * @return     */    @Override    public int getCount() {        return dataSource.size();    }    /**     * 得到数据源上的对象 点击item的时候 可以获取数据然后进行操作     * @param i     * @return     */    @Override    public Object getItem(int i) {        return dataSource.get(i);    }    @Override    public long getItemId(int i) {        return i;    }    /**     * 为了缓存 listview 上的  view 如iamgeview textview button 等view     * 因为 每次findviewbyid 是很浪费资源的     * 对应listview 每个item的view     * 这个到 android L 除了新得的组件recyclerview 已经把这个东西给简化了   有兴趣的可以去看看     */    private final class ViewHolder{        public TextView tv;    }    /**     * 这个方法比较重要  就是每次初始化 listview item 的 view     * @param i           item 的位置 从0 开始     * @param view        item 的view     * @param viewGroup   父容器     * @return     */    @Override    public View getView(int i, View view, ViewGroup viewGroup) {        ViewHolder viewHolder = null;        if(view == null){            viewHolder = new ViewHolder();            view = inflater.inflate(R.layout.mylistview_item1, null);            viewHolder.tv = (TextView) view.findViewById(R.id.tv);            //将viewholder 缓存起来            view.setTag(viewHolder);        }        else {            //可以从holder 得到            viewHolder = (ViewHolder) view.getTag();        }        viewHolder.tv.setText(dataSource.get(i));        return view;    }}
注释差不多了,不在啰嗦了。

activity的代码

package com.lefeng.lfvideo.myndk;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.ListView;import com.lefeng.lfvideo.myndk.adapter.MyAdapter1;import java.util.ArrayList;import java.util.List;/** * Created by CYL on 2016/3/26. * email:670654904@qq.com */public class MyListViewActivity extends AppCompatActivity{    private ListView lv;    private List<String> dataSource;    private MyAdapter1 adapter1;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //设置布局文件        setContentView(R.layout.mylistview_layout);        //实例化listview        lv = (ListView) findViewById(R.id.lv);        //初始化数据源   可以从手机本地获取,可以从网络获取 等        dataSource = new ArrayList<>();        for (int i = 0;i<100;i++){            dataSource.add(getRandWorld());        }        adapter1 = new MyAdapter1(dataSource,this);        lv.setAdapter(adapter1);    }    /**     * 随机产生 5位字符     * @return     */    private String getRandWorld(){        String world = "";        for (int i = 0; i < 5; i++){            int val = (int) (Math.random()*26+1)+'a';            world += (char)val;        }        return  world;    }}


运行结果截图




为了要说明适配器的作用下面 在实现一个适配器上面 activity的代码不变化   直接使用


变化在listview 的item 的布局文件上加了 imageview  对应的adapter 就不给出来  基本就是在获取view 设置view 值 数据源有变化  就是将  各个 item 的图片也存放一份 ,让你可以是id 可以是网络的url 等  看需求了  


给出item 的布局文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="horizontal" android:layout_width="match_parent"    android:layout_height="match_parent">    <!--简单定义了listview 的item-->    <ImageView        android:layout_width="40dp"        android:layout_height="40dp"        android:layout_margin="10dp"        android:src="@drawable/logo"/>    <TextView        android:id="@+id/tv"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textSize="20sp"        android:gravity="center"        android:layout_gravity="center_vertical"        /></LinearLayout>
改变布局后 改变数据源 适配器后看效果

可以看出 通过不同的数据源 可以显示不同的结果。。。。


0 0
原创粉丝点击