您的位置:首页 > 移动开发 > Android开发

【Android开发】RecyclerView的基本使用

2017-01-17 23:36 417 查看

主要思路

【服务器维护中,暂时无法上传图片】

一个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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android开发