Open rainit2006 opened 8 years ago
RecycleView RecyclerView是谷歌V7包下新增的控件,用来替代ListView和GridView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视图缓.
先来说说RecyclerView的优点: RecyclerView架构提供了一种插拔式的体验,所以实现了代码的高度解耦,使用起来也异常的灵活。 我们可以通过设置它的LayoutManager控制其显示的方式,通过ItemDecoration控制Item间的间隔,通过ItemAnimator控制Item的增删动画
为了使用RecyclerView控件,我们需要创建一个Adapter和一个LayoutManager -- Adapter:继承自RecyclerView.Adapetr类,主要用来将数据和布局item进行绑定。 -- LayoutManager:布局管理器,设置每一项view在RecyclerView中的位置布局以及控件item view的显示或者隐藏。 当View重用或者回收的时候,LayoutManger都会向Adapter来请求新的数据来进行替换原来数据的内容。这种回收重用的机制可以提供性能,避免创建很多的view或者是频繁的调用findViewById方法。这种机制和ListView还是很相似的。
RecyclerView提供了三种内置的LayoutManager -- LinearLayoutManager:线性布局,横向或者纵向滑动列表 -- GridLayoutManager:表格布局 -- StaggeredGridLayoutManager:流式布局,例如瀑布流效果 当然除了上面的三种内部布局之外,我们还可以继承RecyclerView.LayoutManager来实现一个自定义的LayoutManager。
动画效果: RecyclerView对于Item的添加和删除是默认开启动画的。 我们当然也可以通过RecyclerView.ItemAnimator类定制动画,然后通过RecyclerView.setItemAnimator()方法来进行使用。
1,新建布局,引入RecyclerView控件
public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MyViewHolder>
Here onCreateViewHolder() method inflates movie_list_row.xml. In onBindViewHolder() method the appropriate movie data (title, genre and year) set to each row.onCreateViewHolder() method: item显示类型
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.movie_list_row, parent, false);
return new MyViewHolder(itemView);
}
onBindViewHolder() method: 数据的绑定显示
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Movie movie = moviesList.get(position);
holder.title.setText(movie.getTitle());
holder.genre.setText(movie.getGenre());
holder.year.setText(movie.getYear());
}
其它:
@Override
public int getItemCount() {
return moviesList.size();
}
3, MainActivity.java and do the below changes. Here prepareMovieData() method adds sample data to list view.
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mAdapter = new MoviesAdapter(movieList);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
prepareMovieData();
4, Adding RecyclerView Divider / Separator you need to extend a class from ItemDecoration and use addItemDecoration() method to display the divider. Then, open MainActivity.java and set the item decoration using addItemDecoration() method before setting the adapter.
Adding RecyclerView Item Click Listener You need to write your own class extending RecyclerView.OnItemTouchListener._
RecyclerView数据添加删除处理 对于RecyclerView控件来讲,给我们提供更加高级的使用方法: notifyItemInserted(position)和notifyItemRemoved(position)
试试GridLayoutManager 只需要改变LayoutManager和ItemDecoration就行了:
grid_recycler.setLayoutManager(new GridLayoutManager(this,2));
grid_recycler.addItemDecoration(new DividerGridItemDecoration(this));
DividerGridItemDecoration代码:
public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[] { android.R.attr.listDivider };
private Drawable mDivider;
public DividerGridItemDecoration(Context context)
{
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = a.getDrawable(0);
a.recycle();
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)
{
drawHorizontal(c, parent);
drawVertical(c, parent);
}
。。。。。。。。
要实现不同的功能效果,大部分都还是在于RecyclerView的Adapter写法
Android应用UI架构 http://toughcoder.net/blog/2014/10/22/effective-android-ui-architecture/
1.fragment是android3.0新增的 2.fragment可以重用 3.fragment必须嵌套在activity中使用,它的生命周期受activity的影响
最重要的区别Activity是一个Context是打通系统交互的一个壳,Fragment是一个实现ComponentCallbacks和 OnCreateContextMenuListener的Object。。必须attach到一个Activity上。
Fragment和FragmentActivity的区别
原文链接:http://www.jianshu.com/p/e91634ac574d Fragment 常用的API Fragment常用的三个类:
主要的操作都是FragmentTransaction的方法
Fragment栈管理 通过FragmentTransaction.addToBackStack()可以将事务添加进回退栈中(back stack),这样在事务提交之后,可以从栈中再将这个事务中取出(即退按后退键可以回到原来的状态) FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); mFragment2 = new MainActivityFragment2(); fragmentTransaction.replace(R.id.fragment, mFragment2); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); 注意Fragment被remove之后View会被销毁,不管是否有添加到栈中,所以比如在Fragment中有输入一些数据,销毁后再回退回去,双重新createView则原来Fragment中的输入的数据将会丢失,这种场景下,可以使用transaction.hide()然后再transaction.add() 新的Fragment,这样才回退的时候,才能完整恢复原来的Fragment。
Fragment与Activity通信 因为Fragment是依附于Activity的,所以通信起来并不复杂。 使用Fragment的引用(通过实例化new 出来,或者通过FragmentManager.findFragmentByTag() 和 findFragmentById()获取),可以通过引用直接访问所有的Fragment的public方法 Fragment中可以通过getActivity()得到当前绑定的Activity的实例,然后进行操作访问Activity的所有public方法。 Fragment需要Context,可以通过调用getActivity(),如果该Context需要在Activity被销毁后还存在,则使用getActivity().getApplicationContext()广播,EventBus等方法进行通信
https://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity アクティビティと通信する Fragment が Activity から独立したフラグメントとして実行されていて、複数のアクティビティ内で使用可能であっても、フラグメントの特定のインスタンスは、それが含まれるアクティビティに直接結び付いています。 具体的には、フラグメントは getActivity() を使用して Activity インスタンスにアクセスでき、アクティビティのレイアウトでビューを見つけるなどのタスクを簡単に実行できます。 View listView = getActivity().findViewById(R.id.list); 同様に、アクティビティが findFragmentById() や findFragmentByTag() を使って FragmentManager から Fragment への参照を取得することで、フラグメント内のメソッドを呼び出すこともできます。次に例を示します。 ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
アクティビティへのイベント コールバックを作成する これを実現するには、フラグメント内でコールバック インターフェースを定義して、ホスト アクティビティがそれを実装するよう要求します。 アクティビティがインターフェースを介してコールバックを受け取ると、必要に応じてレイアウト内の他のフラグメントと情報を共有します。
Fragment使用方法 方法1. 最简单的用法,使用Android studio 新建一个Activity 使用Fragment作为内容。这样layout xaml文件里就会自动生成标签,像View一样的使用,其中android:name设置为我们的Fragment类所在路径。
方法2,通过在Activity 实例化Fragment,然后使用fragmentTransaction.add添加到containerView里。
mFragment = new MyFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.containerViewId, mFragment);
fragmentTransaction.commit();
多个fragment 动态选择显示在Activity里面: 在方法 二的基础上,只要使用以下代码进行Fragment的切换 replace这个方法,可清除所有已经添加到容器View里面的Fragment,然后再添加我们传入的Fragment。
FragmentLayout FrameLayoutは本来、1つのウィジェットを配置する目的で設計されています。複数のウィジェットを配置した場合、後から配置したウィジェットが前面に描画される形になります。 また、配置するウィジェットの位置は設定できず、常に左上に配置されます。
Fragment と FragmentActivityの違い AndroidでFragmentがサポートされたのは、Android 3.0(APIレベル11)以降です。APIレベル11以前のActivityクラスでは、Fragmentを操作するメソッドを使用することができません。 それをカバーするために、Android Support Libraryというパッケージによって提供されているのがFragmentActivityです。Activityの代わりにFragmentActivityを用いることで、APIレベル11以前を対象にしたコードでも、Fragmentを操作するAPIを使用することができます
http://stackoverflow.com/questions/10609268/difference-between-fragment-and-fragmentactivity A Fragment must always be embedded in an Activity. Fragments are not part of the API prior to HoneyComb (3.0). If you want to use Fragments in an app targeting a platform version prior to HoneyComb, you need to add the Support Package to your project and use the FragmentActivity to hold your Fragments. The FragmentActivity class has an API for dealing with Fragments, whereas the Activity class, prior to HoneyComb, doesn't. If your project is targeting HoneyComb or newer only, you should use Activity and not FragmentActivity to hold your Fragments.
Some details: Use android.app.Fragment with Activity. Use android.support.v4.app.Fragment with FragmentActivity. Don't add the support package Fragment to an Activity as it will cause an Exception to be thrown.
A thing to be careful with: FragmentManager and LoaderManager have separate support versions for FragmentActivity:
FragmentとActivityの違い まず、アクティビティとFragmentとの一番の違いはFragmentは親子関係を持てるという点です。Fragmentは、Fragmentの中に更にFragmentを持つことができます。また、ActivityとFragment別々なものなので、Fragmentは複数の画面で使い回すことができます。 次に、カスタムビューとの違いは、よりActivityにそったライフサイクルイベントを持っているという点です。ビューもライフサイクルを持っていますが、ActivityやFragmentのように細かなイベントは持っていません http://qiita.com/Reyurnible/items/dffd70144da213e1208b
複数Fragment管理 各 には一意の識別子が必要
識別子をつける方法は次の3つ
・ android:id で一意のIDをつける
・ android:tag で一意の文字列をつける
・ 両方指定しない場合、システムは container view の ID を使う
findFragmentById(int id) : 戻り値は見つかった fragment もしくは null findFragmentByTag(String tag) : 戻り値は見つかった fragment もしくは null