自定义ListView适配器

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)
参数:

  1. 表示当前被点击的条目所在的ListView,其实就是上面的listView控件
  2. 表示当前被点击的条目view对象
  3. 表示当前被点击的条目在集合中的索引值
  4. 表示在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) {

    }
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,下面我将提供一个示例代码来演示如何自定义一个 ListView 适配器: ```java public class MyListAdapter extends BaseAdapter { Context context; List<Item> itemList; public MyListAdapter(Context context, List<Item> itemList) { this.context = context; this.itemList = itemList; } @Override public int getCount() { return itemList.size(); } @Override public Object getItem(int position) { return itemList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.item_layout, null); } TextView titleTextView = view.findViewById(R.id.title_text_view); TextView descriptionTextView = view.findViewById(R.id.description_text_view); ImageView imageView = view.findViewById(R.id.image_view); Item item = itemList.get(position); titleTextView.setText(item.getTitle()); descriptionTextView.setText(item.getDescription()); imageView.setImageResource(item.getImageResourceId()); return view; } } ``` 这个适配器需要一个上下文(Context)和一个 Item 对象列表。在构造方法将它们传递进来。在 getCount() 方法返回列表的长度;在 getItem() 方法返回指定位置上的 Item 对象;在 getItemId() 方法返回指定位置上的 Item 对象的 ID。在 getView() 方法,我们可以根据需要加载一个新的视图或重用一个已有的视图。最后,我们将 Item 对象的数据设置到相应的视图上,并将其返回。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TL。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值