学习android(RecyclerView)个人笔记二
使用RecyclerView滚动控件(使用其实跟listview相似)
1. 是ListView的增强版,它没集成在SDK中,android团队定义在support库当中。使用RecyclerView控件,首先在项目app/build.gradle文件中添加相关的依赖
2. 在布局中使用
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
注:需要把完整的路径写出来
3. 给一个适配器
public class FruitAdapter
extends RecyclerView.Adapter<FruitAdapter.ViewHolder>{
private List<Fruit>mFruitList;
static class ViewHolder
extendsRecyclerView.ViewHolder {
ImageView iv_icon;
TextView tv_name;
public ViewHolder(ViewitemView) {
super(itemView);
iv_icon =(ImageView) itemView.findViewById(R.id.iv_icon);
tv_name =(TextView) itemView.findViewById(R.id.tv_name);
}
}
public FruitAdapter(List<Fruit> mFruitList) { this.mFruitList = mFruitList; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item, parent, false); ViewHolder holder = new ViewHolder(view); return holder; }
public FruitAdapter(List<Fruit> mFruitList) { this.mFruitList = mFruitList; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item, parent, false); ViewHolder holder = new ViewHolder(view); return holder; }
4. 在活动中显示是要与ListView有一些区别:需要用到布局管理器(LinearLayoutManager)
//适配器 rv_list = (RecyclerView) findViewById(R.id.rv_list); LinearLayoutManager manager = new LinearLayoutManager(this); rv_list.setLayoutManager(manager); FruitAdapter adapter = new FruitAdapter(fruitList);
注RecyclerView可以实现水平滚动。跟垂直滚动有一点区别就是在显示的活动中添加这个属性
1. 显示的子布局要要根据需求改一下
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" 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/rv_list" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
2. 在显示的活动中(Activity)中
LinearLayoutManager manager = new LinearLayoutManager(this); manager.setOrientation(LinearLayoutManager.HORIZONTAL);//重点
注:RecyclerView并没有提供类似于setOnItemClickListener()这样去注册监听方法,而是需要我们自己给子项项目具体的View去注册点击事件相比于ListView来说,实现起来相对复杂一些。
碎片概念:
碎片(Fragment)是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用非常广泛。虽然碎片对你来说应该是一个全新概念,但其实和活动很像,同样都能包好布局,同样都有自己的生命周期(可以理解成一个迷你型的活动)
Fragment的使用法:
1.注册加载
(1)定义布局(普通的布局)
(2)写一个类继承Fragment(最好是继承v4包)
(3) 在使用的布局中(你要实现的布局中)添加fragment布局
注:需要用一个android:name="com.prize.fragmenttest.LeftFragment" 写完整包名。
这样就完成注册加载fragment布局
2.是动态加载fragment布局
(1)定义布局(普通的布局)
(2)写一个类继承Fragment(最好是继承v4包)
完全跟注册加载一样
(3)在使用的布局中(你要实现的布局中)添加fragment布局
注:写一个帧布局给id属性,然后就在代码中去实现动态加载
总结:动态加载碎片的主要分为5步
1. 创建待添加的碎片实例
2. 获取FragmentManager,在活动中可以直接通过调用getSupportFragmentManager()方法得到
3. 开启一个事物,通过调用beginTransaction()方法开启
4. 想容器内添加或替换碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例
5. 提交事物,调用commit()方法来完成
3.在碎片中模拟返回栈
完成以上的操作之后按下Back键程序就会直接退出,如果想模仿类似于返回栈的效果,按下back可以回到上一个碎片,FragmentTransaction中提供了一个addToBackStack()方法。可以用于将一个事物添加到返回栈中。修改以下的代码就能实现
注一般传入null即可
4.碎片和活动之间进行通信
为了方便碎片和活动之间进行通信,FragmentManager提供了一个类似于findViewById()的方法,专门用于从布局文件中获取碎片的实例,代码如下所示:
RightFragmentright = (RightFragment)getFragmentManager().findFragmentById(R.id.right_fragment);
调用FragmentManager的findFragmentById()方法,可以砸活动中得到相应碎片的实例,然后就能轻松地调用碎片里的方法了。
在每个碎片中都可以通过调用getActivity()方法来得到很当前碎片相关联的活动实例。
MainActivityactivity = (MainActivity) getActivity();
有了活动实例之后,在碎片中调用活动里的方法就变得轻而易举,另外当碎片中需要使用Context对象时,也可以使用getActivity()方法,因为获取到的活动本身就是一个Context对象
实现了活动与碎片之间通信,那么碎片与碎片之间的通信怎么实现呢?
它的基本思路就是首先在一个碎片中可以得到与它相关联的活动,然后在通过这个活动去获取另外一个的碎片的实例,这样也就实现了不同碎片之间的通信功能。
5.碎片的生命周期:碎片的生命周期与活动很相类似
(1)运行状态:当一个碎片是可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态。
(2)暂停状态:当一个活动进入暂停状态时(由于另一个未占满屏幕的活动被添加到栈顶),与它相关联的可见碎片就会进入到暂停状态
(3)停止状态:当一个活动进入停止状态时,与它相关联的碎片就会进入到停止状态,或者通过调用FragmengTransaction的remove()、replace()方法将碎片从活动中移除,但如果在事物提交之前调用addToBackStack()方法,这时的碎片也会进入到停止状态,总体来水进入停止状态的碎片对用户来说是完全不可见,有可能或被系统回收
(4)销毁状态:碎片总是依附于活动存在的,因此当活动被销毁时,与它相关联的碎片就会进入到销毁状态。或者通过调用FragmentTransaction的remove()、replace()方法将碎片从活动中移除,但在事务提交之前调并没有调用addToBackStack()方法。这时的碎片也会进入到销毁状态。
注:活动中有的回调方法,碎片中几乎都有,不过碎片还提供了一些附加的回调方法,如:
onAttach(),当碎片和活动建立关联的时候调用
onCreateView()。当碎片创建视图(加载布局)是调用
onActivityCreated()。确保与碎片相关联的活动一定已经创建完毕的时候调用。
onDestroyView()。当与碎片关联的视图被移除的时候调用
onDetach()。当碎片已活动解除关联的时候调用。
碎片完整的生命周期:
注:与活动(activity)一样。在碎片中你也可以通过onSaveInstanceState()方法来保存数据的,因为进入停止状态的碎片有可能在系统内存不足是时候被系统回收。保存下来的数据在onCreate()、onCreateView()和onActivityCreated()这三个方法中都可以重新得到,他们都包好一个Bundle类型的saveInstanceStat参数。
动态加载布局的技巧
虽然动态加载碎片的功能和强大,可以解决很多实际开发中的问题,但是它毕竟只是一个布局文件中进行一些添加和替换操作。如果程序能够根据设备的分辨率或屏幕大小在运行是来决定加载那个布局,那么我们发挥的空间及更多了。
1.使用限定符