主要思路
【服务器维护中,暂时无法上传图片】
一个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;
}
}