RecyclerView詳解
廢話步多說,代碼中見理論,人生三階段,看别人代碼,改别人代碼,謝屬于自己的代碼
- 關聯庫
2.在布局檔案寫定義RecyclerView
<?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"
tools :context=".HelloRecyclerView">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width= "match_parent"
android:layout_height= "match_parent"
/>
</RelativeLayout >
3.在代碼中執行個體化RecyclerView并且初始化資料
/**
* 資料集合
*/
private ArrayList<String> datas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
initData();
}
/**
* 初始化資料
*/
private void initData() {
datas = new ArrayList<>();
for (int i = ; i < ; i++) {
datas.add("我愛北京天安門" + i);
}
}
4.設定擴充卡(難)
定義擴充卡
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private final Context context;
private final ArrayList<String> datas;
public MyAdapter(Context context,ArrayList<String> datas){
this.context = context;
this.datas = datas;
}
/**
* 相當于 ListView擴充卡中的getView的建立holder 布局
*
* @param parent
* @param viewType
* @return
*/
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = View.inflate( context, R.layout.item_hello, null);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tv_text.setText(datas.get(position));
holder.iv_icon.setBackgroundResource(R.mipmap. ic_launcher);
}
@Override
public int getItemCount() {
return datas .size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
private TextView tv_text;
private ImageView iv_icon;
public MyViewHolder(View itemView) {
super(itemView);
tv_text = (TextView) itemView.findViewById(R.id. tv_text);
iv_icon = (ImageView) itemView.findViewById(R.id. iv_icon);
}
}
}
5.設定布局檔案
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#33000000"
android:padding="2dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="3dp"
android:src="@drawable/video_default" />
<TextView
android:id="@+id/tv_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:padding="3dp"
android:text="内容"
android:textColor="#000000"
android:textSize="15sp" />
</LinearLayout>
</RelativeLayout>
6.設定擴充卡-水準方向- 豎直方向 -網格-瀑布流
myAdapter = new MyAdapter(this, datas);
recyclerview.setAdapter( myAdapter);
/**
* 設定布局:
* 第一個參數:上下文
* 第二參數:方向
* 第三個參數:排序低到高還是高到低顯示, false是低到高顯示
*
*/
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL , false);
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, ,GridLayoutManager.VERTICAL, false);
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(,StaggeredGridLayoutManager. HORIZONTAL);
recyclerview.setLayoutManager(linearLayoutManager);
7.設定分割線
代碼是借鑒網上的
//設定分割線-分割線需要自定義&還可以自定義分割線的樣式
//沒有提供預設的分割線
recyclerview.addItemDecoration(new DividerListItemDecoration(this, DividerListItemDecoration.VERTICAL_LIST ));
public class DividerListItemDecoration extends RecyclerView.ItemDecoration {
private static final int [] ATTRS = new int[]{
android.R.attr.listDivider
};
public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL ;
public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL ;
private Drawable mDivider;
private int mOrientation;
public DividerListItemDecoration(Context context, int orientation) {
final TypedArray a = context.obtainStyledAttributes( ATTRS);
mDivider = a.getDrawable();
a.recycle();
setOrientation(orientation);
}
public void setOrientation(int orientation) {
if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST ) {
throw new IllegalArgumentException( "invalid orientation");
}
mOrientation = orientation;
}
@Override
public void onDraw(Canvas c, RecyclerView parent) {
// Log.e("recyclerview - itemdecoration", "onDraw()");
if (mOrientation == VERTICAL_LIST) {
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
}
}
public void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
for (int i = ; i < childCount; i++) {
final View child = parent.getChildAt(i);
android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int top = child.getBottom() + params. bottomMargin;
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
public void drawHorizontal(Canvas c, RecyclerView parent) {
final int top = parent.getPaddingTop();
final int bottom = parent.getHeight() - parent.getPaddingBottom();
final int childCount = parent.getChildCount();
for (int i = ; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int left = child.getRight() + params. rightMargin;
final int right = left + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
@Override
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
if (mOrientation == VERTICAL_LIST) {
outRect.set(, , , mDivider.getIntrinsicHeight());
} else {
outRect.set(, , mDivider.getIntrinsicWidth(), );
}
}
}
9,自定義設定item的點選事件或者item中某個控件的點選事件
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private final Context context;
private final ArrayList<String> datas;
//設定點選某個item的監聽
public interface OnItemClickListener{
void onItemClick(View view,int position,String content);
}
private OnItemClickListener onItemClickListener;
/**
* 設定某條的監聽
* @param onItemClickListener
*/
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
//設定點選圖檔
//設定點選某個item的監聽
public interface OnImageViewClickListener{
void onImageViewClick(View view,int position);
}
private OnImageViewClickListener onImageViewClickListener;
/**
* 設定監聽圖檔
* @param onImageViewClickListener
*/
public void setOnImageViewClickListener(OnImageViewClickListener onImageViewClickListener) {
this.onImageViewClickListener = onImageViewClickListener;
}
...................................
class MyViewHolder extends RecyclerView.ViewHolder {
private TextView tv_text;
private ImageView iv_icon;
public MyViewHolder(View itemView) {
super(itemView);
tv_text = (TextView) itemView.findViewById(R.id.tv_text);
iv_icon = (ImageView) itemView.findViewById(R.id.iv_icon);
//設定點選事件
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(onItemClickListener != null){
onItemClickListener.onItemClick(v,getLayoutPosition(),datas.get(getLayoutPosition()));
}
}
});
//設定監聽
iv_icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(onImageViewClickListener != null){
onImageViewClickListener.onImageViewClick(v,getLayoutPosition());
}
}
});
}
}
}
- 在Activity中使用自定義的點選事件
myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position, String content) {
Toast.makeText(RecyclerViewActivity. this, "content==" +content+",--position=="+position, Toast.LENGTH_SHORT ).show();
}
});
11.删除和增加資料
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
........................
/**
* 添加資料
* @param position
* @param content
*/
public void addData(int position,String content){
datas.add(position,content);
notifyItemInserted(position);
}
/**
* 移除資料
* @param position
*/
public void removeData(int position){
datas.remove(position);
notifyItemRemoved(position);
}
}
12設定删除某條和增加某條的動畫
recyclerview.setItemAnimator(new DefaultItemAnimator());