基础篇:
适配器是一种设计模式,在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>
改变布局后 改变数据源 适配器后看效果
可以看出 通过不同的数据源 可以显示不同的结果。。。。