【Android开发】RecyclerView的基本使用

主要思路

【服务器维护中,暂时无法上传图片】
一个RecyclerView中包含很多个ViewHolder,所有的ViewHolder共由一个Adapter控制,而每个ViewHolder都维护着自己所应显示的内容。
由于ViewHolder与Adapter都不需要在ViewHolder以外的地方使用,故可以定义匿名内部类最方便。
每个ViewHolder显示的可以是预设的布局,也可以是定制列表项。
RecyclerView会把不在屏幕上的ViewHolder回收重新利用以达到节约资源的效果。

具体代码

需要import的主要的包:

  • android.support.v7.widget.RecyclerView(需要设置支持库)

此处以RecyclerView存在于一个Fragment内为例

XXListFragment.java

public class XXListFragment extends Fragment
{
    private RecyclerView mXXRecyclerView;
    private XXAdapter mAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View v = inflater.inflate(R.layout.fragment_xx_list, container, false);

        //将私有成员mXXRecyclerView与布局中的RecyclerView绑定
        mXXRecyclerView = (RecyclerView) v.findViewById(R.id.recycler_view_xx_list);
        //设置布局Manager
        mMemoRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        //除了初始化,还有其他时刻可能会更新内容
        //比如说由列表启动列表项的activity,再返回列表的时候
        //此时列表activity并非重新生成,而是从内存中由挂起状态恢复
        //这时不会进入onCreateView(...)这个方法,但仍需要更新内容
        updateUI();

        return v;
    }

    private void updateUI()
    {
        //初始化单例
        XXLab xxLab = XXLab.get(getActivity());
        List<XX> xxs = xxLab.getMemos();

        //初始化Adapter
        mAdapter = new XXAdapter(xxs);
        //为RecyclerView设置Adapter
        mXXRecyclerView.setAdapter(mAdapter);
    }

    //ViewHolder的匿名内部类
    private class XXHolder extends RecyclerView.ViewHolder
    {
        //存储该ViewHolder所显示内容的对象
        private XX mXX;
        //示例组件
        //此处以每一项只显示标题的RecyclerView为例
        private TextView mTitle;

        public XXHolder(View itemView)
        {
            super(itemView);
            //将组件与布局中的相应组件绑定
            mTitle = (TextView) itemView.findViewById(R.id.xx_list_item_title);
        }

        public void bindXX(XX xx)
        {
            mXX = xx;
            //将组件实际显示的内容修改为传入的对象的相应内容
            mTitle.setText(mXX.getTitle());
        }
    }

    private class XXAdapter extends RecyclerView.Adapter<XXHolder>
    {
        private List<XX> mXXs;

        public XXAdapter(List<XX> xxs)
        {
            mXXs = xxs;
        }

        @Override
        public XXHolder onCreateViewHolder(ViewGroup parent, int viewType)
        {
            LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
            //设置View
            //此处使用的布局是定制的列表项布局
            View view = layoutInflater.inflate(R.layout.list_item_xx, parent, false);
            //创建新的ViewHolder
            return new XXHolder(view);
        }

        @Override
        public void onBindViewHolder(XXHolder holder, int position)
        {
            //该对象为储存要显示的内容的对象
            XX xx = mXXs.get(position);
            //将这个对象传给ViewHolder来绑定
            //RecyclerView是会回收不显示的ViewHolder来显示新内容
            //以达到节省资源的目的的组件
            //所以此处传入同一个ViewHolder的可能是不同的对象
            holder.bindXX(xx);
        }

        //系统会用到的方法
        @Override
        public int getItemCount()
        {
            return mXXs.size();
        }
    }
}

list_item_xx.xml(/res/layout/…)(定制列表项的内容)

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/xx_list_item_title"
        ...
        />

</RelativeLayout>

fragment_xx_list.xml(/res/layout/…)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view_xx_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</LinearLayout>

XX.java(用于储存列表中一项的数据的类)

public class XX
{
    private String mTitle;

    public void setTitle(String title)
    {
        mTitle = title;
    }

    public String getTitle()
    {
        return mTitle;
    }
}

XXLab.java(储存列表内容的单例)

public class MemoLab
{
    //只允许存在一个单例
    private static XXLab sXXLab;
    //单例维护的内容列表
    private List<XX> mXXs;

    private XXLab(Context context)
    {
        ...
    }

    public static XXLab get(Context context)
    {
        //有且仅有一个单例对象
        if (sXXLab == null)
        {
            sXXLab = new XXLab(context);
        }
        return sXXLab;
    }

    //返回单例所维护的内容列表
    public List<XX> getXXs()
    {
        return mXXs;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值