LayoutInflater布局填充器,是一个系统内置的布局填充服务,作用是可以使用xml文件生成View对象
public int getCount 得到数据总数
public Object getItem(int i) 外面给定索引值可以获取索引值的元素
public long getItemId(int i) 条目id
public View getView(int i, View view, ViewGroup viewGroup) 是取得条目的界面。 i表示当前这个条目要绑定的数据在集合中的索引
package com.example.mylistview;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.example.Service.Person;
import java.util.List;
public class MyAdapter extends BaseAdapter {
//要绑定的数据
private List<Person> data;
//xml文件
private int resouce;
private Context context;
//布局填充器,是一个系统内置的布局填充服务
//作用是可以使用xml文件生成View对象
private LayoutInflater inflater;
MyAdapter(Context context,List<Person> data,int resouce){
this.data=data;
this.context=context;
//布局
this.resouce=resouce;
//取得系统内置的布局填充服务 LAYOUT_INFLATER_SERVICE
inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
//得到数据总数
public int getCount() {
return data.size();
}
@Override
//外面给定索引值可以获取索引值的元素
public Object getItem(int i) {
return data.get(i);
}
@Override
//条目id
public long getItemId(int i) {
return i;
}
@Override
//i表示当前这个条目要绑定的数据在集合中的索引值
//getView是取得条目的界面
/*public View getView(int i, View view, ViewGroup viewGroup) {
//如果等于null代表目前显示的是第一页,不为null就代表之前已经生成好的view对象
if (view==null) {
//通过布局填充服务inflater生成View对象,也就是生成条目界面对象
view = inflater.inflate(resouce, null);//resouce文件xml
}
//现在view已经不等于空了
//设置内容
TextView nameView=view.findViewById(R.id.name);
TextView phoneView=view.findViewById(R.id.phone);
TextView amountView=view.findViewById(R.id.amount);
//得到数据的对象
Person person=data.get(i);
//为条目控件设置数据
nameView.setText(person.getName());
phoneView.setText(person.getPhone());
amountView.setText(person.getAmount().toString());
Log.e("leo", "getView: " +i);
return view;
}*/
//优化了getView代码性能
@Override
//i表示当前这个条目要绑定的数据在集合中的索引值
//getView是取得条目的界面
public View getView(int i, View view, ViewGroup viewGroup) {
TextView nameView;
TextView phoneView;
TextView amountView;
//优化了代码性能
if (view==null) {
//通过布局填充服务inflater生成View对象,也就是生成条目界面对象
view = inflater.inflate(resouce, null);//resouce文件xml
nameView=view.findViewById(R.id.name);
phoneView=view.findViewById(R.id.phone);
amountView=view.findViewById(R.id.amount);
//添加进缓存对象
ViewCache cache=new ViewCache();
cache.amountView=amountView;
cache.nameView=nameView;
cache.phoneView=phoneView;
//添加进标志里面可以缓存
view.setTag(cache);
Log.e("leo", "getView: " +i);
}else {//如果对象存在view!=null
//得到缓存对象
ViewCache cache=(ViewCache) view.getTag();
nameView= cache.nameView;
phoneView= cache.phoneView;
amountView= cache.amountView;
}
//得到数据的对象
Person person=data.get(i);
//为条目控件设置数据
nameView.setText(person.getName());
phoneView.setText(person.getPhone());
amountView.setText(person.getAmount().toString());
return view;
}
//用来缓存查找的内容
private final class ViewCache{
public TextView nameView;
public TextView phoneView;
public TextView amountView;
}
}
调用
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l)
参数:
- 表示当前被点击的条目所在的ListView,其实就是上面的listView控件
- 表示当前被点击的条目view对象
- 表示当前被点击的条目在集合中的索引值
- 表示在listView里面的排列id
package com.example.mylistview;
import androidx.appcompat.app.AppCompatActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
import com.example.Service.DBOpenHelper;
import com.example.Service.Person;
import com.example.Service.personService;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private List<Bean> data=new ArrayList<>();
private ListView listView;
private personService service;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=this.findViewById(R.id.listView);
//条目监听事件
listView.setOnItemClickListener(new ItemClickListener());
//数据库
DBOpenHelper dbOpenHelper=new DBOpenHelper(this);
dbOpenHelper.getReadableDatabase();
service=new personService(this,dbOpenHelper);
//往数据库添加数据
/* for (int i=1;i<20;i++) {
Person person=new Person();
person.setId(i);
person.setName("a"+i);
person.setPhone("12345"+i);
person.setAmount(i);
service.save(person);
}*/
show3();
}
//监听点击事件
private final class ItemClickListener implements AdapterView.OnItemClickListener{
@Override
//1表示当前被点击的条目所在的ListView,其实就是上面的listView控件
//2表示当前被点击的条目view对象
//3表示当前被点击的条目在集合中的索引值
//4表示在listView里面的排列id
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
ListView lView=(ListView) adapterView;
//给定数据索引值获取集合中的数据
//实际是条用适配器的getItem方法
Person person=(Person) lView.getItemAtPosition(i);
Toast.makeText(getApplicationContext(),person.getId().toString(),Toast.LENGTH_LONG).show();
// 因为是自定义的上面的数据绑定的是Person,可以强转为Person类型
//看前两章适配器
//SimpleCursorAdapter适配器获取条目的数据
//getItem方法返回的Cursor结果集
/*Cursor cursor=(Cursor) lView.getItemAtPosition(i);
int id=cursor.getInt(0);
Toast.makeText(getApplicationContext(), id+"", Toast.LENGTH_SHORT).show();*/
//SimpleAdapter适配器获取条目的数据
//getItem方法返回的Map<Person>
//ListAdapter item = (ListAdapter) lView.getAdapter().getItem(i);也可以这样
//Map<String, Object> map = (HashMap<String, Object>) listView.getItemAtPosition(i);
//Toast.makeText(getApplicationContext(),map.get("id").toString(),Toast.LENGTH_LONG).show();
}
}
private void show3() {
List<Person> personList=service.getScrolld(0,20);//取得数据库中的数据
MyAdapter adapter=new MyAdapter(this,personList,R.layout.list_item);
listView.setAdapter(adapter);
}
以下是数据库的操作:
package com.example.Service;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class personService {
//数据库对象
private DBOpenHelper dbOpenHelper;
private Context context;
// public personService() {
// }
public personService(Context context, DBOpenHelper dbOpenHelper) {
this.context=context;
this.dbOpenHelper=dbOpenHelper;
}
/*
* 增
* */
public void save(Person p){
//获取数据库的操作
SQLiteDatabase db=dbOpenHelper.getWritableDatabase();
db.execSQL("insert into person(personid,name,phone,amount) values(?,?,?,?)",
//对问号负责
//需要转义的数据
new Object[]{p.getId(),p.getName(),p.getPhone(),p.getAmount()});
Toast.makeText(context, "成功", Toast.LENGTH_SHORT).show();
}
/*
* 查询记录
*
* */
public Person find(Integer id){
//获取数据库的操作
SQLiteDatabase db=dbOpenHelper.getReadableDatabase();
Cursor cursor=db.rawQuery("select * from person where personid=?", new String[]{id.toString()});
//moveToFirst如果没有数据指针则移动不成功返回false。移动成功返回ture,证明有数据
if(cursor.moveToFirst()){
int personid=cursor.getInt(0);
String personName=cursor.getString(1);
String personPhone=cursor.getString(2);
//添加进对象返回
return new Person(personid,personName,personPhone);
}
Toast.makeText(context, "成功", Toast.LENGTH_SHORT).show();
cursor.close();
return null;
}
/*
* 删
* @person id 记录id
* */
public void delete(Integer id){
SQLiteDatabase db=dbOpenHelper.getWritableDatabase();
//用ID查询然后删除
db.execSQL("delete from person where personid=?",new Object[]{id});
Toast.makeText(context, "删除成功", Toast.LENGTH_SHORT).show();
}
/*
* 更新记录
* @person p
* */
public void update(Person p){
dbOpenHelper.getWritableDatabase().execSQL(
"update person set name=?,phone=? where personid=?",
new Object[]{p.getName(),p.getPhone(),p.getId()});
Toast.makeText(context, "更新成功", Toast.LENGTH_SHORT).show();
}
/*分页获取记录
* offset 跳过多少条记录
* maxResult 获取多少条记录
* */
public List<Person> getScrolld(int offset, int maxResult){
List<Person> persons=new ArrayList<Person>();
SQLiteDatabase db=dbOpenHelper.getReadableDatabase();
Cursor cursor=db.rawQuery("select * from person order by personid asc limit ?,?",
new String[]{String.valueOf(offset),String.valueOf(maxResult)});
while (cursor.moveToNext()){//移动指针到下一条记录
int personid=cursor.getInt(0);
String personName=cursor.getString(1);
String personPhone=cursor.getString(2);
int amount=cursor.getInt(3);
persons.add(new Person(personid,personName,personPhone,amount));
}
cursor.close();
return persons;
}
//SimpleCursorAdapter是以Cursor游标方式传入数据
public Cursor getCursorScrolld(int offset, int maxResult){
List<Person> persons=new ArrayList<Person>();
SQLiteDatabase db=dbOpenHelper.getReadableDatabase();
//personid as _id
Cursor cursor=db.rawQuery("select personid as _id,name,phone,amount from person order by personid asc limit ?,?",
new String[]{String.valueOf(offset),String.valueOf(maxResult)});
return cursor;
}
//获取记录总数
public int getCount(){
SQLiteDatabase db=dbOpenHelper.getReadableDatabase();
Cursor cursor=db.rawQuery("select count(*) from person",null);
cursor.moveToFirst();
int result=cursor.getInt(0);
cursor.close();
return result;
}
}
package com.example.Service;
public class Person {
private Integer id;
private String name;
private String phone;
private Integer amount;
public Person() {
}
public Person(int personid) {
super();
}
public Person(String name, String phone) {
this.name = name;
this.phone = phone;
}
public Person(Integer id, String name, String phone) {
this.id=id;
this.name=name;
this.phone=phone;
}
public Person(Integer id, String name, String phone, Integer amount) {
this.id=id;
this.name=name;
this.phone=phone;
this.amount = amount;
}
public Integer getAmount() {
return amount;
}
public void setAmount(Integer amount) {
this.amount = amount;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
package com.example.Service;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(@Nullable Context context) {
super(context, "name", null, 1);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table person(personid integer primary key autoincrement,name varchar(20),phone varchar(20),amount integer)");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}