高级控件ListView以及自定义适配器

一 ListView
列表控件
使用的时候高度和宽度最好是设置为match_parent

二 自定义适配器
1.BaseAdapter:是所有适配器类的父类,可以对列表项进行最大限度的定制
2.写一个类继承自BaseAdapter,实现四个方法:

getCount :返回当前ListView或者Spinner等控件要显示多少条数据

getView (int postion,View convertView,ViewGroup parent): 返回的是ListView或Spinner每一个选项的布局,这个方法的主要作用是把每一行的视图文件(Layout布局文件)解析成一个View对象

// LayoutInflater 布局解析器,用于把Layout布局文件解析成一个View对象(不可以直接new ,需要使用系统服务获取)
    inflater= (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)~~  

getItem(int i):返回当前那一行的对象,即ListView.getSelectedItem()方法得到的值

getItemId(int i):获取当前那一行的对象ID,返回的是ListView.getSelectedItemId()方法得到的值

注:getCount,getView方法必须实现 getItem ,getItemId可以不实现

三 ,ListView的优化
1 使用ConvertView 重用组件
即拖动时被遮住、看不见的控件,重用它,而非每次创建一个新的对象

2 使用内部类
每次给布局文件中的控件设置值的时候,都需要调用findViewById(id)方法,重复查找浪费时间,所以把控件的地址保存到一个对象中,再把对象保存到ConvertView中,下次对控件设值时,直接通过修改对象即可

ViewHolder(视图的持有者)+ConvertView.setTag()保存控件,而不用每次查找 ViewHolder

3 使用分页查询(PullToRefresh)
2.3.2 使用AsyncTask(异步任务)加载数据,最少要重写以下这两个方法
doInBackground
后台执行
onPostExecute
在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置
关键代码:
myListViewAdapter.notifyDataSetChanged();// 通知适配器数据已改变
ptrlv_main_1.onRefreshComplete();// 通知控件数据已经加载完毕

ListView前两次增强代码如下(第三次明天更新)

 package com.example.hyt;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.List;

public class MainActivity extends AppCompatActivity {
  private List<Book> data;//数据源
  private MyBaseAdapter adapter; //适配器
 private ListView lv_main_booklist; //LisrView控件


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    lv_main_booklist=findViewById(R.id.lv_main_booklist);

    data=new BookDao().list();
    adapter=new MyBaseAdapter((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE));
    lv_main_booklist.setAdapter(adapter);
}


public class MyBaseAdapter extends BaseAdapter{//适配器

    public class ViewHolder{//专门用来保存控件
        ImageView iv_listviewitem_image;
        TextView tv_listviewitem_title;
        TextView tv_listviewitem_author;
        TextView tv_listviewitem_price;
        TextView tv_listviewitem_publishing;
        TextView tv_listviewitem_remark;

    }

    private LayoutInflater inflater;//解析器

    public MyBaseAdapter(LayoutInflater inflater) {
        this.inflater = inflater;
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int i) {
        return data.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup parent) {
        //被遮挡住的视图  View view
       //1,将项资源解析成可见的视图
        View v=view;
        if(v==null){//增强一 减少视图的创建
            Log.i("test","position:"+i);
            v=inflater.inflate(R.layout.listview_item,null);
            
            ViewHolder vh=new ViewHolder();//增强二 减少查找控件的时间
            
           vh.iv_listviewitem_image=v.findViewById(R.id.iv_listviewitem_image);
            vh.tv_listviewitem_title=v.findViewById(R.id.tv_listviewitme_title);
            vh.tv_listviewitem_author=v.findViewById(R.id.tv_listviewitme_author);
            vh.tv_listviewitem_price=v.findViewById(R.id.tv_listviewitme_price);
            vh.tv_listviewitem_publishing=v.findViewById(R.id.tv_listviewitme_publish);
            vh.tv_listviewitem_remark=v.findViewById(R.id.tv_listviewitme_remark);


             v.setTag(vh);//保存
        }
        //2,从视图中获取控件(控件无值)  //增强二  减少查找控件的时间(将控件放进ViewHolder类,专门保存控件)
           ViewHolder viewHolder=(ViewHolder)v.getTag();
        // 3,获取当前需要的数据,将值封装进控件中
       Book book=data.get(i);
        viewHolder.iv_listviewitem_image.setImageResource(book.getImage());
        viewHolder.tv_listviewitem_title.setText(book.getTitle());
        viewHolder.tv_listviewitem_author.setText(book.getAuthor());
        viewHolder.tv_listviewitem_price.setText(book.getPrice()+"");
        viewHolder.tv_listviewitem_publishing.setText(book.getPublish());
        viewHolder.tv_listviewitem_remark.setText(book.getRemark());
        //将视图返回
        return v;
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值