欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

高级控件ListView

程序员文章站 2022-03-08 11:38:39
...
  1. BaseAdapter:是所有适配器类的父类,可以对列表项进行最大限度的定制
    1.1 自定义适配器中的方法
    getCount
    getView
    getItem
    getItemId
    1.2 LayoutInflater(布局解析器)
    –LayoutInflater有三种获得方式,资料中有详细介绍
    用来把layout布局文件解析成一个View对象,不可以new,需要使用系统服务获得

    inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    案例一:ListView的使用及优化

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

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

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

2.4 事件监听的优化
假设Item中有三个按钮,要为三个按钮定义事件,如果是下面这样
btn1.setOnclickListener(new View.onClickListener(){
public void onClick(View view){
//…
}
});
btn2.setOnclickListener(new View.onClickListener(){
public void onClick(View view){
//…
}
});
btn3.setOnclickListener(new View.onClickListener(){
public void onClick(View view){
//…
}
});
如果每屏显示10个Item,那一共创建了30个listener对象在内存中。
如果,你是在Adapter创建时,只创建一个Listener,并将其定义成全局属性,
然后通过按钮的ID来进行判断是哪个事件应该触发,
class MyAdapter extends BaseAdapter{
View.onClickListener myListener = new View.onClickListener(){
public void onClick(View view){
if(view.getId() == R.id.btn1){
//…
}else if(view.getId() == R.id.btn2){
//…
}else if(view.getId() == R.id.btn3){
//…
}
}
});
}

    //注册监听器
    btn1.setOnclickListener(myListener);
    btn2.setOnclickListener(myListener);
    btn3.setOnclickListener(myListener);

自定义适配器:

package com.example.a6;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
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 ListView lv_main_show;
private List<Book> data=new BookDao().list();
private MyBaseAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv_main_show=findViewById(R.id.lv_main_show);
        adapter=new MyBaseAdapter((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE));
        lv_main_show.setAdapter(adapter);
    }
    class MyBaseAdapter extends BaseAdapter{
    class ViewHolder{
        ImageView iv_listviewitem_image ;
        TextView tv_listviewitme_title;
        TextView tv_listviewitme_author;
        TextView tv_listviewitme_price;
        TextView tv_listviewitme_publish;
        TextView tv_listviewitme_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 convertView, ViewGroup parent) {
            View v=convertView;
            if (v==null){
                v= inflater.inflate(R.layout.listview_item, null);
                ViewHolder viewHolder=new ViewHolder();
                viewHolder.iv_listviewitem_image=v.findViewById(R.id.iv_listviewitem_image);
                viewHolder.tv_listviewitme_title=v.findViewById(R.id.tv_listviewitme_title);
                viewHolder.tv_listviewitme_author=v.findViewById(R.id.tv_listviewitme_author);
                viewHolder.tv_listviewitme_price=v.findViewById(R.id.tv_listviewitme_price);
                viewHolder.tv_listviewitme_publish=v.findViewById(R.id.tv_listviewitme_publish);
                viewHolder.tv_listviewitme_remark=v.findViewById(R.id.tv_listviewitme_remark);
                v.setTag(viewHolder);
            }
            ViewHolder tag = (ViewHolder) v.getTag();
            Book book = data.get(i);
            tag.iv_listviewitem_image.setImageResource(book.getImage());
            tag.tv_listviewitme_title.setText(book.getTitle());
            tag.tv_listviewitme_author.setText(book.getAuthor());
            tag.tv_listviewitme_price.setText(book.getPrice().toString());
            tag.tv_listviewitme_publish.setText(book.getPublish());
            tag.tv_listviewitme_remark.setText(book.getRemark());
            return v;
        }
    }
}

相关标签: android