Adapter适配器
概述
Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。如下图直观的表达了Data、Adapter、View三者的关系:
关于视图重用
如果正常用listview的话一个数据对应一个控件,那么占用的内存就很大了,这时候就需要视图重用,不用的视图放入视图回收站convertView,如果视图回收站没有视图则创建视图,再更新数据时就不用创建新的视图了,直接用在视图回收站中创建好的视图就可以了。
关于ViewHolder
由于将数据赋值给视图时每次都要执行findViewById,这样也会浪费内存,所以创建一个ViewHolder类来保存你需要保存的控件,这样就不用执行多次find了。
使用步骤
创建主界面ListView和列表item视图
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity1 extends AppCompatActivity {
//定义一个类来存放你需要保存的控件
class ViewHoider{
TextView textView;
}
class Myadapter extends BaseAdapter{
@Override
public int getCount() {
//返回list的大小
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//取数据
String data = list.get(position);
//创建ViewHolder对象
ViewHoider hoider = null;
//当视图回收站中没有视图时
if (convertView == null){
//创建视图
convertView=View.inflate(MainActivity1.this,R.layout.item,null);
TextView textView = convertView.findViewById(R.id.tv_list);
hoider = new ViewHoider();
hoider.textView = textView;
//将viewHolder与视图绑定
convertView.setTag(hoider);
}else {
hoider= (ViewHoider) convertView.getTag();
}
//将数据赋值给视图对象
hoider.textView.setText(data);
return convertView;
}
}
ListView listView;
List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.创建视图,创建并初始化ListView对象
listView = findViewById(R.id.lv_show);
//2.创建数据集合
list = new ArrayList<>();
//向集合中添加数据
for (int i = 0; i <1000 ; i++) {
list.add("数据"+i);
}
//3.创建并设置适配器
Myadapter myadapter = new Myadapter();
listView.setAdapter(myadapter);
}
}
结果
base-adapter-helper库的使用
- 使用原始的adapter适配器,要解决视图重用,还有ViewHolder等问题,引用第三方库base-adapter-helper可以让库自己处理这些问题,可以很大程度上使代码更加简单,便捷。
- base-adapter-helper库的地址https://github.com/JoanZapata/base-adapter-helper.git
1.导入库
2.将库中的java文件复制到项目中
3.编译并解决问题
由于base-adapter-helper库还引用了其他的库,所以会报错,将报错的代码注释即可。
4.使用
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.VideoView;
import com.joanzapata.android.BaseAdapterHelper;
import com.joanzapata.android.QuickAdapter;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
ListView listView;
List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.创建并初始化ListView对象
listView = findViewById(R.id.lv_show);
//2.创建数据集合
list = new ArrayList<>();
//向集合中添加数据
for (int i = 0; i <1000 ; i++) {
list.add("数据"+i);
}
//3.创建并设置适配器
QuickAdapter adapter = new QuickAdapter<String>(this, R.layout.item, list) {
@Override
protected void convert(BaseAdapterHelper helper, String item) { //取数据并将数据赋值给视图
helper.setText(R.id.tv_list, item);
}
};
listView.setAdapter(adapter);
}
}
结果