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。