RecyclerView使用
來自: http://my.oschina.net/gef/blog/607017
android.support.v7.widget.RecyclerView是v7包里的一個widget,非常強大的一個控件,完全可以代替listview,gridview和瀑布流。
這里主要講三點:
-
為recyclerView設置LayoutManager
-
RecyclerView.Adapter
-
刪除和添加數據的動畫效果展示
1.
RecyclerView中有三種LayoutManager,如下:
| LayoutManager |
Orientation |
| LinearLayoutManager | HORIZONTAL、VERTICAL |
| GridLayoutManager | HORIZONTAL、VERTICAL |
| StaggeredGridLayoutManager | HORIZONTAL、VERTICAL |
例如:
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); //設置layoutmanager recyclerView.setLayoutManager(linearLayoutManager);
2.RecyclerView.Adapter
這個RecyclerView.Adapter可不得了啊,首先可以帶范型,看源碼:
public static abstract class Adapter<VH extends ViewHolder> {。。。} 然后是個抽象類,舉個例子:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = View.inflate(parent.getContext(),R.layout.myview,null);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.content.setText(arrayList.get(position));
}
@Override
public int getItemCount() {
return arrayList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
private TextView content;
public ViewHolder(View itemView) {
super(itemView);
content = (TextView) ((FrameLayout) itemView).getChildAt(0);
}
}
} 這里我自定了一個ViewHolder繼承RecyclerView.ViewHolder,說一下MyAdapter的執行流程:首先執行onCreateViewHolder方法,返回了我們自定義的ViewHolder,然后onBindViewHolder方法。可以看出RecyclerView.Adapter對ViewHolder進行了封裝。
3.刪除和添加數據的動畫效果展示,如果是baseAdapter怎么刷新呢,調用notifyDataSetChanged()方法,那在使用RecyclerView時呢:
notifyItemInserted(int position); notifyItemRemoved(int position);
而且還有動畫效果。
好了來個例子:
R.layout.activity_recycler_view文件:
<?xml version="1.0" encoding="utf-8"?> <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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.sumu.gefdemo.activity.RecyclerViewActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </RelativeLayout>
actiivty中:
package com.sumu.gefdemo.activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.sumu.gefdemo.R;
import java.util.ArrayList;
import java.util.Random;
public class RecyclerViewActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private MyAdapter myAdapter;
private ArrayList<String> arrayList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view);
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
/**
* 三種LayoutManager
*/
//1
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
//2.
GridLayoutManager gridLayoutManager = new GridLayoutManager(this,4);
gridLayoutManager.setOrientation(GridLayoutManager.HORIZONTAL);
//3.
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL);
//設置layoutmanager
recyclerView.setLayoutManager(staggeredGridLayoutManager);
Random random = new Random();
for (int i = 0;i < 100;i++){
random.nextInt();
arrayList.add(i + "gefufeng" + random.nextInt(10000000));
}
myAdapter = new MyAdapter();
recyclerView.setAdapter(myAdapter);
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = View.inflate(parent.getContext(),R.layout.myview,null);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.content.setText(arrayList.get(position));
}
@Override
public int getItemCount() {
return arrayList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
private TextView content;
public ViewHolder(View itemView) {
super(itemView);
content = (TextView) ((FrameLayout) itemView).getChildAt(0);
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0,1,1,"add");
menu.add(Menu.NONE,2,2,"delete");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == 1){
arrayList.add(1,"gefufenggefufenggefufenggefufenggefufeng");
myAdapter.notifyItemInserted(1);
}else{
arrayList.remove(2);
myAdapter.notifyItemRemoved(2);
}
return super.onOptionsItemSelected(item);
}
} R.layout.myview文件:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:padding="10dp" android:background="#3f3" android:gravity="center" android:text="gefufebg" android:layout_margin="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </FrameLayout>
效果圖(其中之一):

本文由用戶 JonFullerto 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!