[置顶] Android编程权威指南之使用RecyclerView显示列表
2017-04-08 16:58
441 查看
RecyclerView 是 ViewGroup 的子类,每一个列表项都是作为一个 View 子对象显示的。这些View 子对象既可以是复杂的 View 对象,也可以是简单的 View 对象,这取决于我们对列表显示复杂度的需要。 RecyclerView 所做的就是回收再利用,循环往复。ViewHolder 和 AdapterRecyclerView 的任务仅限于回收和定位屏幕上的 TextView 。 TextView 能够显示数据还离不开另外两个类的支持: Adapter 子类和 ViewHolder 子类。 ViewHolder 要做的事很少,我们首先讨论它。顾名思义, ViewHolder 只做一件事:容纳 View 视图(如图9-5所示)。adapter图9-6进行了简化,实际上隐藏了一些信息。 RecyclerView 自己不创建 ViewHolder 。这个任务实际是由adapter来完成的。adapter是个控制器对象,从模型层获取数据,然后提供给RecyclerView 显示,起到了沟通的桥梁作用。adapter负责: 创建必要的 ViewHolder ; 绑定 ViewHolder 至模型层数据。要创建adapter,首先要定义 RecyclerView.Adapter 子类。然后由它封装从 DataLab 获取的weather。RecyclerView 需要显示视图对象时,就会去找它的adapter。图9-7展示了一个 RecyclerView可能发起的会话。首先,通过调用adapter的 getItemCount() 方法, RecyclerView 询问数组列表中包含多少个对象。接 着 , RecyclerView 调 用 adapter 的 createViewHolder(ViewGroup, int) 方 法 创 建ViewHolder 以及 ViewHolder 要显示的视图。最后, RecyclerView 会传入 ViewHolder 及其位置,调用 onBindViewHolder(ViewHolder,int) 方法。adapter会找到目标位置的数据并绑定到 ViewHolder 的视图上。所谓绑定,就是使用模型数据填充视图。整个过程执行完毕, RecyclerView 就能在屏幕上显示crime列表项了。需要注意的是,相对于 onBindViewHolder(ViewHolder, int) 方法, createViewHolder(ViewGroup, int) 方法的调用并不频繁。一旦创建了够用的 ViewHolder , RecyclerView 就会停止调用 createViewHolder(...) 方法。然后,通过回收利用旧的 ViewHolder 节约时间和内存。应用:RecyclerView 类来自于Google支持库。要使用它,首先要添加 RecyclerView 依赖库。单击File → Project Structure....菜单项切换至项目结构窗口,选择左边的app模块,然后单击Dependencies选项页。单击+按钮弹出依赖库添加窗口。找到并选择recyclerview-v7支持库,单击OK按钮完成依赖库添加。示例代码:
DataListFragment.java:
import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.List; /** * Created by Administrator on 2017/4/8. */ public class DataListFragment extends Fragment { private RecyclerView mWeatherRecyclerView; private WeatherAdapter mAdapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate( R.layout.fragment_data_list, container, false ); mWeatherRecyclerView = (RecyclerView)view.findViewById(R.id.weather_recycler_view); mWeatherRecyclerView.setLayoutManager( new LinearLayoutManager(getActivity()) ); updateUI(); return view; } private void updateUI( ) { DataLab dataLab = DataLab.get(getActivity()); List<Weather> weathers = dataLab.getWeathers(); mAdapter = new WeatherAdapter(weathers); mWeatherRecyclerView.setAdapter(mAdapter); } private class WeatherHolder extends RecyclerView.ViewHolder { public TextView mTitleTextView; public WeatherHolder(View itemView) { super(itemView); mTitleTextView = (TextView)itemView; } } private class WeatherAdapter extends RecyclerView.Adapter<WeatherHolder> { private List<Weather> mWeathers; cc62 public WeatherAdapter( List<Weather> weathers ) { mWeathers = weathers; } @Override public WeatherHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater layoutInflater = LayoutInflater.from(getActivity()); View view = layoutInflater.inflate( android.R.layout.simple_list_item_1, parent, false ); return new WeatherHolder( view ); } @Override public void onBindViewHolder(WeatherHolder holder, int position) { Weather weather = mWeathers.get( position ); holder.mTitleTextView.setText(weather.getTitle()); } @Override public int getItemCount() { return mWeathers.size(); } } }fragment_data_list.xml:
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/weather_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" />Datalab.java:
import android.content.Context; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * Created by Administrator on 2017/4/8. */ public class DataLab { private static DataLab sDataLab; private List<Weather> mWeathers; public static DataLab get( Context context ) { if ( sDataLab == null ) { sDataLab = new DataLab( context ); } return sDataLab; } private DataLab( Context context ) { mWeathers = new ArrayList<>(); for ( int i=0; i<100; i++ ) { Weather weather = new Weather(); weather.setTitle("weather #"+i); weather.setSolve( i%2 == 0 ); mWeathers.add( weather ); } } public List<Weather> getWeathers() { return mWeathers; } public Weather getWeather( UUID id ) { for ( Weather weather : mWeathers ) { if( weather.getId().equals(id) ) { return weather; } } return null; } }
运行:
相关文章推荐
- Android | 使用RecyclerView显示列表
- 演示如何使用QTableView显示列表
- 完成用户列表Demo,使用plist当数据源,在TableView中显示plist的内容
- 用RecyclerView实现新闻列表页,包括头部的图片轮播,两种Item显示方式,下拉刷新和上拉加载以及限制列表的加载条目数
- 优雅的使用RecyclerView(在一个recyclerView里显示有不同子布局的界面,就是混合不同布局)
- LoaderManager管理Loader实现异步动态加载数据,并使用RecyclerView 显示
- 使用RecyclerView实现列表展开动画
- RecyclerView替代Listview,实现滚动列表的显示
- 【Android 仿微信通讯录 导航分组列表-上】使用ItemDecoration为RecyclerView打造带悬停头部的分组列表
- Android使用RecyclerView实现仿微信联系人列表
- [置顶] 使用ItemDecoration 为 RecyclerView设置可 推动的 悬浮导航栏效果
- RecyclerViewPager使用Volley的NetworkImageView翻页时图片有时不显示
- 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)
- [置顶] Android使用RecyclerView和CardView,实现知乎日报精致布局
- SharePoint 2013 中使用JSLink 来改变列表中某个字段或view(视图)的显示方式
- 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)
- Android使用RecyclerView实现自定义列表、点击事件以及下拉刷新
- 使用 recyclerView 布局显示不合理的问题
- 使用RecyclerView实现的分组列表。
- 使用recyclerView,GridView来实现动态显示商品选择规格