Android学习笔记:超能RecyclerView组件使用(上)

这几天开发中遇到了一些界面滑动问题,主要是界面中滑动控件使用太多,导致滑动冲突。刚好在学习RecyclerView这个控件,所以根据视屏学习情况做个学习笔记 ,当然很多内容都是学习视屏中的,感谢老师的付出。

RecyclerView是android.support.v7包中的新组件,是一个强大的滑动组件,它强大在哪呢?

1,实现ListView效果

2,实现GridView效果

3,实现横向滑动的ListView及横向滑动的GridView效果

4,实现瀑布流效果

5,自定义Item增加与删除动画效果

最重要的是实现上面的这些功能都很easy,只要几行代码即可实现。

那为什么把这个功能强大的组件取名RecyclerView呢?

1,不用关心Item是否显示在正确的位置以及如何显示,我们可以用LayoutManager来掌控

2,不用关心Item间分隔问题,有ItemDecoration来实现

3,不用关注Item的增删动画效果,因为有ItemAnimator

4,最关心的是如何回收与利用我们的View,强制使用ViewHoler。

下面就直接上代码啦:

主界面布局main_activity.lxml

<RelativeLayout 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.support.v7.widget.RecyclerView<!--这就是我们今天的主角-->

android:id="@+id/test_rcv"

android:layout_width="match_parent"

android:layout_height="wrap_content"

>

</android.support.v7.widget.RecyclerView>

</RelativeLayout>

主界面Activity:

public class MainActivity extends ActionBarActivity {

private RecyclerView mRecyclerView;

private List<TestData> mDatas;

private TestAdapter mAdapter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initDatas();

initViews();

}

private void initDatas() {

mDatas=new ArrayList<TestData>();

TestData data=new TestData();

for (int i = ‘A‘; i < ‘z‘; i++) {

data.setTitle("Title"+(char)i);

data.setContent("Content"+(char)i);

mDatas.add(data);

}

}

private void initViews() {

mRecyclerView=(RecyclerView) findViewById(R.id.test_rcv);

mAdapter=new TestAdapter(this, mDatas);

mRecyclerView.setAdapter(mAdapter);

LinearLayoutManager ll=new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true);//这里设置的是HORIZONTAL水平效果的,如果设置成VERTICAL则就是垂直效果的,和我们平时的ListView的效果一样。

mRecyclerView.setLayoutManager(ll);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

int id = item.getItemId();

if (id == R.id.action_settings) { return true; }

return super.onOptionsItemSelected(item);

}

}

item布局lv_item.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:padding="10dp" >

<ImageView

android:id="@+id/item_iv"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/ic_launcher" />

<TextView

android:id="@+id/item_title"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@id/item_iv" />

<TextView

android:id="@+id/item_content"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@id/item_title" />

</RelativeLayout>

最后就是Adapter啦:

/**

* @description:

* 我们通常使用的BaseAdapter在getView方法中去进行创建ViewHoler以及给对应的View进行设置数据,

* 而在RecyclerView.Adapter<>中,将这个过程分为了两部分,由onCreateViewHolder和onBindViewHolder两个方法来处理完成,

* 其实就是使用RecyclerView控件时,必须强制使用ViewHolder模式来优化程序

*/

public class TestAdapter extends Adapter<TestViewHolder> {

private Context mContext;

private List<TestData> mDatas;

public TestAdapter(Context mContext, List<TestData> mDatas) {

this.mContext = mContext;

this.mDatas = mDatas;

}

@Override

public TestViewHolder onCreateViewHolder(ViewGroup paramViewGroup, int paramInt) {

View v = LayoutInflater.from(mContext).inflate(R.layout.lv_item, null);

TestViewHolder holder = new TestViewHolder(v);

return holder;

}

@Override

public void onBindViewHolder(TestViewHolder paramVH, int paramInt) {

paramVH.titleTv.setText(mDatas.get(paramInt).getTitle());

paramVH.contentTv.setText(mDatas.get(paramInt).getContent());

}

@Override

public int getItemCount() {

// TODO Auto-generated method stub

return mDatas.size();

}

}

class TestViewHolder extends ViewHolder {

ImageView iconIv;

TextView titleTv;

TextView contentTv;

public TestViewHolder(View holder) {

super(holder);

iconIv = (ImageView) holder.findViewById(R.id.item_iv);

titleTv = (TextView) holder.findViewById(R.id.item_title);

contentTv = (TextView) holder.findViewById(R.id.item_content);

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-02 01:53:58

Android学习笔记:超能RecyclerView组件使用(上)的相关文章

Android学习笔记二十三.Service组件入门(一).什么是Service?

什么是Service? 一.Service 1.Service简介 Service为Android四大组件之一,Service与Activity组件相似,都代表可执行的程序且有自己的生命周期,唯一的区别是Activity组件提供界面方便人机交互而Service只在后台运行且没有交互界面.需要注意的是,Service不是一个单独的进程或为了防止应用出现无反应错误单独的线程,它像其他应用对象一样运行在其托管进程的主线程中.当然,如果我们希望自己的Service能够在后台运行MP3或者网络下载,我们可

Android学习笔记(24):进度条组件ProgressBar及其子类

ProgressBar作为进度条组件使用,它还派生了SeekBar(拖动条)和RatingBar(星级评分条). ProgressBar支持的XML属性: Attribute Name Related Method Description style 设置ProgressBar指定风格 android:indeterminate 设置为true时,进度条不显示运行进度 android:indeterminateBehavior indeterminate模式下.当进度条达到最大值时的动画处理行为

Android学习笔记:使用ViewPager组件实现图片切换

在很多App中,尤其是第一次安装启动后,都会出现几个图片进行一些app的介绍和说明,图片可以随着滑动而切换. 我们这里利用 ViewPager组件来演示如何实现这一点. 1.创建一个app工程,默认创建一个主 Activity 2.设置该Activity的布局文件activity_main.xml内容如下: <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

android学习笔记——利用BaseAdapter生成40个列表项

RT: main.xml ? 1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"               android:orientation="vertical"        

Android学习笔记(四三):文件访问

之前我们学习了通过preference和SQLite数据库进行数据存储,也可以通过文件方式.文件可以是在应用打包时预置,也可以是应用所生成. 文件访问有两种方式:一:静态数据的文件可以防止在res/raw中,这些文件是只读的,只有在应用版本升级的时候进行修改,或者我们先读出这些数据,通过 reference的方式来处理,这样以后可以进行修订,但是这种方式,会有两份数据保存.二:另一种方式是通过URL访问文件,动态数据的读取也可以采用SQLite3的方式. res/raw/下静态文件的读取 在re

Android学习笔记:Home Screen Widgets(2):关于Widget

通过widget定义,我们在widget列表中看到了我们的TestWidget.当我们拖拽widget到主页时,假设在appwidet-provider中定义了android:configure的java类,在widget实例创建后会立即唤起配置activity. 这个activity主要完毕两个任务:1.配置初始化数据:2.将配置数据适配到widget实例中. 利用preference中存贮配置数据 widget数据能够保持在文件.Share preference,或者SQLite3中.wid

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在

android学习笔记——使用QuickContactBadge关联联系人

本文大部分内容来自<疯狂android讲义>. QuickContactBadge继承了ImageView,因此它的本质也是图片,也可以通过android:src属性指定它显示的图片.QuickcontactBadge额外增加的功能是:该图片可以关联到手机中指定联系人,当用户单击该图片时,系统将会打开相应联系人的联系方式界面. 为了让QuickContactBadge与特定联系人关联,可以调用如下方法进行关联. assignContactFromEmail(String emailAddres

Pro Android学习笔记(三):了解Android资源(上)

在Android开发中,资源包括文件或者值,它们和执行应用捆绑,无需在源代码中写死,因此我们可以改变或替换他们,而无需对应用重新编译. 了解资源构成 参考阅读Android学习笔记(三八):资源resource(上).XML解析(XmlPullParser),Android学习笔记(三九):资源resource(下). Strings资源.位于res/values下,可以有一个或多个xml文件.其中最为常见的是strings.xml,对于demo这类小例子,为了方便常全部都放在strings.x