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

基础篇:

适配器是一种设计模式,在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:[email protected]
 */
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:[email protected]
 */
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>
改变布局后 改变数据源 适配器后看效果

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


猜你喜欢

转载自blog.csdn.net/tiandiyinghun/article/details/50985305