ListView的优化问题详解


ListView是自己手动优化(优化:将滑出的item调到滑入复用,改变其中数据显示,这样永远只是创建手机屏幕容纳item加一个视图)

ListView
优化的优点:1.提升了列表的加载速度
                                   2.降低系统内存消耗

为什么使用ListView要用自定义适配器?
因为要手动进行列表的优化

列表怎么优化:(在自定义适配器中
1.自定义内部类viewholder
2.复用view视图
MainActivity.java
package com.zhiyuan3g.listview;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;

import com.zhiyuan3g.listview.adapter.MyAdapter;
import com.zhiyuan3g.listview.entity.Student;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private ArrayList<Student> mStudents;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        listView = (ListView) findViewById(R.id.listView);
        mStudents = new ArrayList<>();
        for (int x=0; x<100 ;x++){
            Student student = new Student();
            student.setName("小明"+x+"号");
            student.setCalssroom("至远"+x);
            student.setAge(x+"岁");
            mStudents.add(student);
        }
        listView.setAdapter(new MyAdapter(mStudents,this));
    }
}



Student.java
package com.zhiyuan3g.listview.entity;

public final class Student {
    private String name;
    private String calssroom;
    private String age;

    public String getName() {
        return name;
    }

    public  void setName(String name) {
        this.name = name;
    }

    public String getCalssroom() {
        return calssroom;
    }

    public void setCalssroom(String calssroom) {
        this.calssroom = calssroom;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}


Myadapter.java
package com.zhiyuan3g.mylistview;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.zhiyuan3g.mylistview.entity.Student;

import java.util.List;

public class Myadapter extends BaseAdapter {
    private List<Student> mList;
    private Context mContext;
    private ViewHolder mViewHolder;

    public Myadapter(List list, Context context) {

        mList = list;
        mContext = context;
    }
//获取列表的总长度
    @Override
    public int getCount() {
        return mList.size();
    }
//获取当前item所对应集合的位置的内容,一般是用不到的,只是为了当点击监听时方便调用
    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }
//获取当前item的id
    @Override
    public long getItemId(int position) {
        return position;
    }
/**
 * function:获取视图
 * @param position:位置(即item的下标)
 * @param convertView:默认存放可复用的view对象,一旦某个view对象滑出去(消失在界面上),那么,那个view
 *                   对象就会被存入convertView中,方便我们进行复用
 * @param parent:一个容器
 * @return
 */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView==null){
              System.out.println(position);
    //通过View对象的布局填充器获得填充的上下文,填充的布局,以及viewGroup(一般置为空即可)
    convertView=View.inflate(mContext, R.layout.listview_item, null);
    //实例化一个ViewHolder对象,并抽成成员变量,因为下面也要使用到
    mViewHolder = new ViewHolder();
    //一次进行初始化id,以后就不用每次再去找id,这也是使用ViewHolder的优势
    mViewHolder.name = (TextView) convertView.findViewById(R.id.name_tv);
    mViewHolder.age = (TextView) convertView.findViewById(R.id.age_tv);
    mViewHolder.classroom = (TextView) convertView.findViewById(R.id.class_tv);
    //传入一个标识,使convertView与mViewHolder绑定,方便下面复用时找到convertView,直接调用其控件
    convertView.setTag(mViewHolder);
}else {
    System.out.println(position+"++++");
    //拿到ViewHolder对象
    mViewHolder = (ViewHolder) convertView.getTag();
}
//通过Viewholder调用控件来进行设置
        mViewHolder.age.setText(mList.get(position).getAge());
        mViewHolder.name.setText(mList.get(position).getName());
        mViewHolder.classroom.setText(mList.get(position).getClassroom());
        return convertView;

    }
//存放视图控件的内部类,方便调用
    class ViewHolder{
        TextView name,age,classroom;
    }
}



效果图:




注:经过优化的ListView只会创建铺满屏幕的item个数加一,在我这个APP中就是创建15个item视图,之后都是复用已滑出的item。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值