ListView的优化以及RecyclerView的基本使用

ListView在开发的过程中,算是常客了。

ListView用于向用户展现滚动数据,以及Item的点击操作。使用ListView,基本上包括:数据,Adapter,Item布局三个点。

adapter:

  •  ArrayAdapter:简单易用的Adapter,通常用于数组或list集合的数据源。
  •  simpleAdapter:有很好的扩充性,可以自定义出各种效果。
  •  simpleCursorAdapter:主要用于从数据库获取数据,。
  • BaseAdapter:抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性。

优化一:convertView是否为null的判断,优化布局。

View view;
if(convertView == null){
view = LayoutInfalter.from(getContext()).inflate(resourceID,null)
}
else{
view = convertView
}

当convertview不为空时,加载Listview缓存的布局。

优化二:ViewHolder :不难发现的是,当布局加载完成后,每次都会重现加载item布局控件,因此创建一个ViewHolder内部类,并将控件实例保存在该内部类中。第一次加载时,调用view的setTag方法,将ViewHodler对象存储在view中。再次加载时,调用view的getTag方法,取出ViewHolder对象。

//getView核心代码
ViewHolder viewHolder;
if(convertView == null){
viewHolder = new ViewHolder();
viewHolder.fruitImage = (ImageView) view.findViewByID(R.id.fruit_image);
view.setTage(viewHolder);//讲ViewHolder存储在View中

}else{
view = convertView;
viewHolder = ViewHolder view.getTag();//重获取viewHolder
}
viewHolder.fruitImage.setImageResource(fruit.getIMageID);

//内部类
class ViewHolder{
ImageView fruitImage;
}

通过上面的优化,ListView在运行过程中效果会有很大的提升。

其实,ListView用到了RecycleBin机制:

  • listview的许多view呈现在Ui上,这样的View对我们来说是可见的,可以称为OnScreen的view(也为ActionView)。
  • view被上滚移除屏幕,这样的view称为offScreenView(也称为ScrapView)。
  • 然后ScrapView会被listview删除,而RecycleView会将这部分保存。
  • 而listview底部需要显示的view会从RecycleBin里面取出一个ScrapView。

RecycleBin用于存储从屏幕滑出去的item,当该item需要进入屏幕时,listview就会从recycleBin里取出。

下面通过一个聊天界面介绍RecyclerView的基本使用。

1> 导入RecyclerView库

在build.gradle中添加“compile ‘com.android.support:recyclerview-v7:25.2.0‘”

2> 创建主界面xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.test.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="Hello World!" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <EditText
            android:id="@+id/edit_text"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:hint="Edit something here"
            android:layout_weight="1"/>
        <Button
            android:id="@+id/button_send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Send"/>
    </LinearLayout>
</LinearLayout>

3> 创建msg_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFF"
    android:orientation="vertical"
    tools:context="com.example.test.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="Hello World!" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <EditText
            android:id="@+id/edit_text"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:hint="Edit something here"
            android:layout_weight="1"/>
        <Button
            android:id="@+id/button_send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Send"/>
    </LinearLayout>
</LinearLayout>

4> 消息类

public class Msg {
    public static final int TYPE_SENT = 1;
    public static final int TYPE_REVICE = 0;
    public String content;
    public int type;

    public Msg(int type ,String content) {
        this.content = content;
        this.type = type;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getContent() {
        return content;
    }

    public int getType() {
        return type;
    }
}

5> adapter

public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder>{
    public List<Msg> mMsgList;

    public MsgAdapter(List<Msg> msglist){
        this.mMsgList = msglist;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_item ,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Msg msg = mMsgList.get(position);
        if (msg.getType() == Msg.TYPE_REVICE){
            holder.leftlayout.setVisibility(View.VISIBLE);
            holder.rightlayout.setVisibility(View.GONE);
            holder.lefttext.setText(msg.getContent());
        }else if (msg.getType() == Msg.TYPE_SENT){
            holder.leftlayout.setVisibility(View.GONE);
            holder.rightlayout.setVisibility(View.VISIBLE);
            holder.righttext.setText(msg.getContent());
        }
    }

    @Override
    public int getItemCount() {
        return mMsgList.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        LinearLayout leftlayout;
        LinearLayout rightlayout;
        TextView lefttext;
        TextView righttext;

        public ViewHolder(View itemView) {
            super(itemView);
            leftlayout = (LinearLayout) itemView.findViewById(R.id.left_layout);
            rightlayout = (LinearLayout) itemView.findViewById(R.id.right_layout);
            lefttext = (TextView) itemView.findViewById(R.id.left_msg);
            righttext = (TextView) itemView.findViewById(R.id.right_msg);
        }
    }

}

6> MainActivity

public class MainActivity extends AppCompatActivity {
    public List<Msg> msglist = new ArrayList<>();
    private EditText mEditText;
    private Button Send;
    private RecyclerView mRecyclerView;
    private MsgAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);
        adapter = new MsgAdapter(msglist);
        Log.d("azheng",adapter.mMsgList.get(0).getContent());
        mRecyclerView.setAdapter(adapter);
    }

    private void init() {
        mEditText = (EditText) findViewById(R.id.edit_text);
        Send = (Button) findViewById(R.id.button_send);
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);

        Msg msg1 = new Msg(0, "hello");
        msglist.add(msg1);
        Msg msg2 = new Msg(1, "hi");
        msglist.add(msg2);
        Msg msg3 = new Msg(0, "Nice to meet you!");
        msglist.add(msg3);
    }
}

由于界面太丑,就不贴图了。

时间: 2024-10-05 09:07:50

ListView的优化以及RecyclerView的基本使用的相关文章

ListView常用优化技巧(Android群英传)

内容是博主照着书敲出来的,博主码字挺辛苦的,转载请注明出处,后序内容陆续会码出. 前言:ListView--列表,它作为一个非常重要的显示方式,不管是在Web中还是移动平台中,都是一个非常好的.不开或缺的展示信息的工具.在Android中,ListView控件接管了这一重担,在大量的场合下,我们都需要使用这个控件.虽然在Android 5.X时代,RecyclerView在很多地方都在逐渐取代ListView,但ListView的使用范围依然非常的广泛,它这万年老大哥的地位也不是轻易就能撼动的.

Android开发:ListView、AdapterView、RecyclerView全面解析

目录 AdapterView简介 AdapterView本身是一个抽象类,AdapterView及其子类的继承关系如下图: 特征: AdapterView继承自ViewGroup,本质是个容器 AdapterView可以包含多个"列表项",并将这多个列表项以合适的形式展示 AdapterView显示的列表项内容由Adapter提供 它派生的子类在用法上也基本相似,只是在显示上有一定区别,因此把他们也归为一类. 由AdapterView直接派生的三个类: AbsListView.AbsS

Android ListView性能优化实战方案

前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListView进行性能优化,不仅是面试中常常会被问到的(我前段时间面试了几家公司,全部都问到了这个问题了),而且在实际项目中更是非常重要的一环,它甚至在某种程度上决定了用户是否喜欢接受你的APP.(如果你的列表滑起来很卡,我敢说很多人会直接卸载) 网上关于如何对ListView进行性能优化,提出了很多方案.但

ListView 性能优化------使用ViewHolder,修改layout_weight属性为“match_parent”

转载自:http://blog.csdn.net/pkxiuluo01/article/details/7380860 Adapter是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View.如果列表中有很多的项时会占用极大的系统资源,所以我们需要优化Adapter 1.convertView的使用 [java] view plaincopy Java代码 public View getView(int position, 

Android ListView使用BaseAdapter与ListView的优化 (转至 http://www.open-open.com/lib/view/open1339485728006.html)

在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖.这时候最方便的方法就是使用灵活的适配器BaseAdapter了. ▲图4-35 BaseAdapter中的方法 使用BaseAdapter必须写一

Android ListView使用BaseAdapter与ListView的优化

在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖.这时候最方便的方法就是使用灵活的适配器BaseAdapter了. ▲图4-35 BaseAdapter中的方法 使用BaseAdapter必须写一

ListView 的优化和优化原理

列表的显示需要三个元素: ListVeiw:  用来展示列表的View. 适配器 : 用来把数据映射到ListView上 数据:    具体的将被映射的字符串,图片,或者基本组件.             根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter,这三种适配器的使用大家可学习下官网上面的使用或者自行百度谷歌,一堆DEMO!!!其中以ArrayAdapter最为简单,只能展示一行字.SimpleAdapter有

Android ListView 的优化

一.复用convertView,降低findViewById的次数 1.优化一:复用convertView Android系统本身为我们考虑了ListView的优化问题.在复写的Adapter的类中,比較重要的两个方法是getCount()和getView().界面上有多少个条显示.就会调用多少次的getView()方法:因此假设在每次调用的时候,假设不进行优化.每次都会使用View.inflate(-.)的方法,都要将xml文件解析,并显示到界面上,这是很消耗资源的:由于有新的内容产生就会有旧

Android Listview 性能优化

首先我一般使用的适配器是BaseAdapter,其中有两个方法最主要,分别是: getCount,getView, 在对Listview 进行优化的时候,首先使用 convertview 和viewHolder 配合进行优化,使用convertview的母的是 控件复用,从而加到减少内存的使用,使用viewHolder 的是减少findbyid 的次数. 但是在进行控件以后,在进行图片加载的时候,会出现图片错位的问题,这是因为控件里面有上次残留的图片在里面,所以我们在初始化的时候需要设置一张默认