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