015AndroidRecyclerView组件和Spinner(下拉列表框)1.RecyclerView
<1>知识点介绍
RecyclerView ⽐ ListView 更⾼级且更具灵活性。它是⼀个⽤于显⽰庞⼤数据集的容器,可通过保持有限数量的视图进⾏⾮常有效的滚动操作。如果您有数据集合,其中的元素将因⽤户操作或⽹络事件⽽在运⾏时发⽣改变,请使⽤ RecyclerView 。
RecyclerView代表的意义是,我只管Recycler View,也就是说RecyclerView只管回收与复⽤View,其他的你可以⾃⼰去设置。可以看出其⾼度的解耦,给予你充分的定制⾃由(所以你才可以轻松的通过这个控件实现ListView,GirdView,瀑布流等效果)
要实现⼀个RecyclerView,会接触到它的⼏个⼩伙伴,其中1、2是必须的。剩下的3、4、5三项,可以让RecyclerView更好看、效果更好。
(1)想要控制其item们的排列⽅式,请使⽤布局管理器LayoutManager
(2)如果要创建⼀个适配器,请使⽤RecyclerView.Adapter
(3)想要控制Item间的间隔,请使⽤RecyclerView.ItemDecoration
(4)想要控制Item增删的动画,请使⽤RecyclerView.ItemAnimator
(5)CardView 扩展 FrameLayout 类并让您能够显⽰卡⽚内的信息,这些信息在整个平台中拥有⼀致的呈现⽅式。CardView ⼩部件可拥有阴影和圆⾓。
2. 实际案例
<1>先将RecyclerView拖⼊界⾯
<2>源码(对应⼯程名为test17)
使⽤RecyclerView需在adle中添加声明
implementation 'com.android.support:design:28.0.0'
(1)XML页⾯布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="/apk/res/android" xmlns:app="/apk/res-auto"
xmlns:tools="/tools"
android:layout_width="match_parent"zlt
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".recyclerview.Recycler2Activity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/button_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="添加"/>
<Button
android:id="@+id/button_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="删除"/>
<Button
android:id="@+id/button_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="list"/>
thatcher
<Button
宁波留学android:id="@+id/button_grid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="grid"/>
<Button
android:id="@+id/button_flow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="flow"/>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_test1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
(2)适配器源码
心疼的英文package lerview;
t.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import st17.R;
import java.util.ArrayList;
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
private final Context content;
private final ArrayList<String> datas;
//构造⽅法
public MyRecyclerViewAdapter(Context content, ArrayList<String> datas) {
this.datas=datas;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View viewItem=View.inflate(content, R.layout.item_recycle,null);
return new MyViewHolder(viewItem);
}
//数据与view绑定
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {
//根据位置得到对应的数据
String (i);
}
//得到总条数
@Override
public int getItemCount() {
return datas.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
ImageView imageView;
TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
imageView=itemView.findViewById(R.id.image1);
textView=itemView.findViewById(st1);
itemView.tOnClickListener(new View.OnClickListener() {
@Override
英语文章翻译
public void onClick(View v) {
Toast.makeText(content,"data=="+(getLayoutPosition()),Toast.LENGTH_SHORT).show(); }
});
}
}
}
(3)分割线源码(直接调⽤即可)
package lerview;
package lerview;
t.Context;
t.res.TypedArray;
aphics.Canvas;
aphics.Paint;
aphics.Rect;
aphics.drawable.Drawable;
import android.t.ContextCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
/**
* @DateTime: 2016-07-21 17:55
* @Author: duke
爱探险的多啦* @Deacription: recyclerview万能分割线
*/
trick or treat
public class RecycleViewDivider extends RecyclerView.ItemDecoration {
private Paint mPaint;//如果需要⽤画笔⼿绘
private Drawable mDrawableDivider;//如果需要绘制给定的drawable
private int mPaintDividerLength = 2;//分割线宽度或⾼度
private DrawType drawType;//⽤画笔绘制颜⾊,还是绘制特定的drawable
/**
* 注意:列表的⽅向
* LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTAL
*/
private int mOrientation;
//系统默认的分割线
private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
/**
* ⾃定义分割线
*
* @param context
* @param orientation 列表⽅向
* @param drawableId 分割线图⽚
*/
public RecycleViewDivider(Context context, int orientation, int drawableId) {
if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) { throw new IllegalArgumentException("请输⼊正确的参数!");
}
mOrientation = orientation;德语学习软件
if (drawableId == -100) {
//获取系统的样式
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDrawableDivider = a.getDrawable(0);
} el {
mDrawableDivider = Drawable(context, drawableId);
}
//表明绘制drawable
drawType = DrawType.USEDRAWABLE;
}
/**
* @param context 上下⽂
* @param orientation 列表⽅向
*/
public RecycleViewDivider(Context context, int orientation) {
this(context, orientation, -100);
}
/**
* ⾃定义分割线
* ⾃定义分割线
* @param orientation 列表⽅向
* @param dividerHeight 分割线⾼度
* @param dividerColor 分割线颜⾊
*/
public RecycleViewDivider(int orientation, int dividerHeight, int dividerColor) {
if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) { throw new IllegalArgumentException("请输⼊正确的参数!");
会计员}
mOrientation = orientation;
if (dividerHeight != -100) {
//分割线⾼度
mPaintDividerLength = dividerHeight;
}
//创建特定画笔
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.tColor(dividerColor);
mPaint.tStyle(Paint.Style.FILL);
//表明绘制⽤paint
drawType = DrawType.USEPAINT;
}
/**
* ⾃定义分割线
*
* @param orientation 列表⽅向
* @param dividerColor 分割线颜⾊
*/
public RecycleViewDivider(int orientation, int dividerColor) {
this(orientation, -100, dividerColor);
}
/**
* 看图说话:get Item Offts,获得item的偏移量。此⽅法⽤来控制item的偏移
* @param outRect
* @param view
* @param parent
* @param state
*/
@Override
public void getItemOffts(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
/**
* 列表的⽅向为横向,画分割线就是纵向的,需要确定的是child的右边偏移值
* 留出空间画分割线
*/
if (this.mOrientation == LinearLayoutManager.HORIZONTAL)
switch (drawType) {position是什么意思
ca USEPAINT:
outRect.t(0, 0, mPaintDividerLength, 0);
break;
ca USEDRAWABLE:
outRect.t(0, 0, IntrinsicWidth(), 0);
break;
}
/**
* 列表的⽅向为纵向,画分割线就是横向的,需要确定的是child的下边偏移值
* 留出空间画分割线
*/
el if (this.mOrientation == LinearLayoutManager.VERTICAL)
switch (drawType) {
ca USEPAINT:
outRect.t(0, 0, 0, mPaintDividerLength);
break;
ca USEDRAWABLE: