Adapter适配器的使用
Adapter适配器概念
Adapter 是一种 Android 开发中常用的设计模式,主要用于将后端数据连接到前端显示,是数据和视图(UI)之间一个重要的桥梁。
Android Studio 之BaseAdapter适配器使用
Adapter 主要完成两个任务:一是提供数据源,为 UI 组件(如 ListView)提供展示所需的数据,这些数据通常来自于数据源(可以是数据库、网络等);二是将数据源对应的数据展示在 UI 组件中,即为每个数据项创建对应的 UI 视图。(如图所示:可以直观的看到Data、Adapter、View三者的关系)
应用案例:如图所示 (共需要三个类对象waitFragment类和waitAdapter类,还有waitBean类)
下面展示waitFragment类
public class waitFragment extends Fragment{
//定义数据库对象
private SQLiteDatabase sqLiteDatabase;
private ImageView add_wait;
//LiveView
private ListView M_listViewID2;
//定义javaBean对象
private List<waitBean> wait_data=new ArrayList<>();
private Myadapter2 myadapter2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.fragment_wait, container, false);
//初始化
initView(view);
initData();
getData();
//列表的初始化
M_listViewID2=view.findViewById(R.id.listview);
myadapter2 = new Myadapter2(wait_data, getContext());
//加载适配
M_listViewID2.setAdapter(myadapter2);
return view;
}
void initView(View view){
}
public void initData(){
//插入数据时注意,一定要传入最新的数据库版本号
MysqlOpenHelper mysqlOpenHelper=new MysqlOpenHelper(getActivity());
sqLiteDatabase=mysqlOpenHelper.getWritableDatabase();
}
//查找数据库内容
public void getData() {
String[] ziduan = {"neirong", "create_time", "type", "id"};
Cursor cursor = sqLiteDatabase.query("wait_table", ziduan, null, null
, null, null, null);
//判断是否有数据
if (cursor.getCount() > 0) {
int value1 = cursor.getColumnIndex("neirong");
int value2 = cursor.getColumnIndex("create_time");
int value3 = cursor.getColumnIndex("type");
int value4 = cursor.getColumnIndex("id");
//遍历保存到变量wait_data
while (cursor.moveToNext()) {
String nr = cursor.getString(value1);
String time = cursor.getString(value2);
int type = cursor.getInt(value3);
String id = cursor.getString(value4);
//日期转型
SimpleDateFormat dateFormat = new SimpleDateFormat("MM月dd日 HH:mm");
String format = dateFormat.format(new Date(time));
waitBean.setId(id);
waitBean.setCreate_time(format);
waitBean.setType(String.valueOf(type));
waitBean.setNeirong(nr);
wait_data.add(waitBean);
}
} else {
Toast.makeText(getActivity(), "wait获取信息失败", Toast.LENGTH_SHORT).show();
}
cursor.close();
}
}
下面展示 waitAdapter
public class Myadapter2 extends BaseAdapter {
private List<waitBean> data;
private Context context;
public Myadapter2(List<waitBean> data, Context context) {
this.data = data;
this.context = context;
}
public Myadapter2() {
}
//用于数据刷新
public void setData(List<waitBean> data) {
this.data = data;
notifyDataSetChanged();
}
@Override
public int getCount() {
//返回数据数量
return data.size();
}
@Override
public Object getItem(int i) {
//返回数据项
return data.get(i);
}
@Override
public long getItemId(int position) {
//返回数据项的位置
return position;
}
//getView() 方法负责根据数据源中的数据创建 UI 视图并绑定数据,然后将 UI 视图返回给 UI 组件进行显示
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
//ViewHolder能实现列表数据与视图的关联和复用,通过setTag(viewHOlder)来绑定列表动态位置。
ViewHolder viewHolder;
if(view==null){
//获取Layout目录下的文件R.layout.simple_item2的视图
view= LayoutInflater.from(context).inflate(R.layout.simple_item2, viewGroup, false);
//绑定item下的控件id
viewHolder = new ViewHolder();
viewHolder.datewait= view.findViewById(R.id.datewait);
viewHolder.waitTitle= view.findViewById(R.id.waitTitle);
viewHolder.type= view.findViewById(R.id.datetype1);
viewHolder.chekbox = view.findViewById(R.id.edit_type);
view.setTag(viewHolder);
}
else {
viewHolder =(ViewHolder) view.getTag();
}
viewHolder.waitTitle.setText(data.get(position).getNeirong());
viewHolder.datewait.setText(data.get(position).getCreate_time());
viewHolder.type.setText("完成");
return view;
}
//ListView需要使用的子控件
private final class ViewHolder{
TextView datewait;
TextView waitTitle;
TextView type;
CheckBox chekbox;
}
}
下面展示 waitBean
。
public class waitBean {
private String id,neirong,create_time,update_time,type;
public waitBean(String id, String neirong, String create_time, String update_time, String type) {
this.id = id;
this.neirong = neirong;
this.create_time = create_time;
this.update_time = update_time;
this.type = type;
}
public waitBean() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getNeirong() {
return neirong;
}
public void setNeirong(String neirong) {
this.neirong = neirong;
}
public String getCreate_time() {
return create_time;
}
public void setCreate_time(String create_time) {
this.create_time = create_time;
}
public String getUpdate_time() {
return update_time;
}
public void setUpdate_time(String update_time) {
this.update_time = update_time;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
return "waitBean{" +
"id='" + id + '\'' +
", neirong='" + neirong + '\'' +
", create_time='" + create_time + '\'' +
", update_time='" + update_time + '\'' +
", type='" + type + '\'' +
'}';
}
}
重要的代码BaseAdapter代码片
。
//获取listView控件ID
M_listViewID2=view.findViewById(R.id.listview);
//通过Myadapter构造方法传输数据
myadapter2 = new Myadapter2(wait_data, getContext());
//加载数据匹配
M_listViewID2.setAdapter(myadapter2);
以上就是通过调取数据库获取数据,并把数据通过BaseAdapter进行和ListView视图连接。
总结
通过本课程的学习,我了解如何处理布局、图像、字符串和其他资源文件,并在项目中正确地使用它们 ,了解了BaseAdapter基础知识,在实践编码时,实现了动态展示数据功能,进一步提高了我的编码实践经验。当然,编写代码并不是一路畅通,也遇到许多一些理解不到位的问题,例如:listViwe出现了重复复用的问题,导致了每个item的位置不唯一了,经过网上学习之后。我才只知道ViewHolper的重要性,它可以通过view.setTag() 方法来绑定,保持位置唯一性。所以我希望每位同学也能保持持续学习的态度,加强对知识巩固,才能更清晰的理解概念和理论。