1. 导入依赖包
同样,在build.grade(app)文件的dependencies导入包 implementation 'com.android.support:recyclerview-v7:28.0.0'
2. 在布局文件中使用RecyclerView并在activity里初始化RecyclerView
导入依赖包之后就可以使用recycleView了,在layout中使用,并在activity里实例化
3. 获取展示的数据(sqlite数据库)
利用sqlite数据库的查找操作获取数据,把数据存入相应的lsit集合里
private List<Events> getTaskList() {
//获取展示的数据
ArrayList<Events> allTaskList=new ArrayList<Events>();
EventDao eventDao = new EventDao(getActivity());
Cursor result = eventDao.querAll();
if (result.getCount()==0){
finnishToDate.setVisibility(View.VISIBLE);
}
while (result.moveToNext()) {
Events events1 = new Events();
events1.setTitle( result.getString(result.getColumnIndex("title")));
events1.set_id( result.getInt(result.getColumnIndex("_id")));
Log.d(ATG,"eventId=====---- 是"+events1.get_id());
events1.setDescription( result.getString(result.getColumnIndex("description")));
events1.setTime_start( result.getString(result.getColumnIndex("time_start")));
events1.setTime_end( result.getString(result.getColumnIndex("time_end")));
events1.setFinnishcase( result.getString(result.getColumnIndex("finnishcase")));
allTaskList.add(events1);
}
return allTaskList;
}
4. 获取每条数据的layout布局
这个布局是recycleView展示数据的每一条条目的样式 我这里只用了几个textView和button
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/itemOnclickRecycle"
android:layout_width="match_parent"
android:padding="15dp"
android:layout_height="wrap_content">
<TextView
android:id="@+id/taskDate"
android:layout_marginTop="10dp"
android:text="任务完成的截止日期"
android:layout_alignParentLeft="true"
android:textSize="14sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
<TextView
android:id="@+id/taskTime"
android:layout_below="@+id/taskTitleLine"
android:text="截止时间"
android:layout_alignParentLeft="true"
android:textColor="@color/grey1"
android:textSize="14sp"
android:layout_marginLeft="45dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
<Button
android:id="@+id/finnishCase"
android:background="@drawable/notfinish"
android:layout_alignParentRight="true"
android:layout_width="55dp"
android:layout_height="55dp">
</Button>
<LinearLayout
android:id="@+id/taskTitleLine"
android:layout_width="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginLeft="5dp"
android:orientation="horizontal"
android:layout_below="@+id/taskDate"
android:layout_height="wrap_content">
<Button
android:id="@+id/finishPoint"
android:layout_width="40dp"
android:layout_gravity="center"
android:background="@drawable/notpiont"
android:layout_height="40dp">
</Button>
<TextView
android:id="@+id/taskTitle"
android:textColor="@color/grey1"
android:text="任务标题"
android:layout_gravity="center"
android:textSize="18sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
</LinearLayout>
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_below="@+id/taskTime"
android:background="@color/grey"
android:layout_height="0.5dp"></View>
</LinearLayout>
5. 创建适配器
这里是recycleView的核心的地方了,创建一个adapter类继承RecycleView.Adapter<>括号里写一个内部类,除了那些必须要实先的方法,还需暴露一个点击事件的方法,接口回调来实现点击事件,记住条目的点击事件要放到内部类去。
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.InnerHodles> {
private List<Events> mData;
private OnItemClick mOnItemClick;
public RecyclerViewAdapter(List<Events> data) {
this.mData = data;
}
//新建innerHodles 把item 的View传给innerhodles
@NonNull
@Override
public InnerHodles onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//获取item的界面
View view = View.inflate(parent.getContext(), R.layout.item_list_view, null);
return new InnerHodles(view);
}
//绑定innerholder get控件设置数据
@Override
public void onBindViewHolder(@NonNull InnerHodles holder, int position) {
holder.setData(mData.get(position),position);
}
//获取数据的条数
@Override
public int getItemCount() {
if (mData != null) {
return mData.size();
}
return 0;
}
//实现点击事件的方法
public void setOnItemClick(OnItemClick onItemClick) {
//利用内部类的接口回回调实现从外部获取点击事件给子控件的点击方法
this.mOnItemClick=onItemClick;
}
public class InnerHodles extends RecyclerView.ViewHolder {
private TextView taskDate;
private TextView taskTitle;
private TextView taskTime;
private Button finishPoint;
private Button finnishCase;
private String TAG="InnerHodles";
private RelativeLayout itemOnclickRecycle;
private int position;
private Events events;
public InnerHodles(@NonNull View itemView) {
super(itemView);
// 实例化控件
initView(itemView);
// 设置点击事件
onItemClick();
}
private void onItemClick() {
//接口回调获取点击事件
itemOnclickRecycle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClick.itemClick(position,events);
}
});
}
private void initView(View itemView) {
taskDate=itemView.findViewById(R.id.taskDate);
taskTime=itemView.findViewById(R.id.taskTime);
taskTitle=itemView.findViewById(R.id.taskTitle);
finishPoint=itemView.findViewById(R.id.finishPoint);
finnishCase=itemView.findViewById(R.id.finnishCase);
itemOnclickRecycle=itemView.findViewById(R.id.itemOnclickRecycle);
}
public void setData(Events events, int position) {
//获取list的下标
this.position = position;
//获取Events
this.events = events;
//把时间日期分割开
String[] end = events.getTime_end().toString().trim().split("-");
String[] start = events.getTime_start().toString().trim().split("-");
Log.d(TAG,"开始日期"+ start[0]);
Log.d(TAG,"结束日期"+ end[0]);
//美化展示 年月日
String[] dateStart = start[0].split("/");
String[] dateEnd = end[0].split("/");
if (start.length==2&&end.length==2){
taskDate.setText(dateStart[0]+"年"+dateStart[1]+"月"+dateStart[2]+"日~"+dateEnd[0]+"年"+dateEnd[1]+"月"+dateEnd[2]+"日");
taskTime.setText(start[1]+"~"+end[1]);
}
taskTitle.setText(events.getTitle());
if (events.getFinnishcase().equals("not")) {
Log.d(TAG, "事件:" + events.toString());
finishPoint.setBackgroundResource(R.drawable.notpiont);
finnishCase.setBackgroundResource(R.drawable.notfinish);
}else if(events.getFinnishcase().equals("yes")){
Log.d(TAG, "任务状态" + events.getFinnishcase());
finishPoint.setBackgroundResource(R.drawable.finishpoint);
finnishCase.setBackgroundResource(R.drawable.finish);
}
}
}
// 实现点击事件的内部类接口 从外部实现点击事件 传回给子控件的点击方法
public interface OnItemClick {
public void itemClick(int position,Events events);
}
}
6. 在activity里使用
和listview的使用方法差不多,但是要记住RecycleView要设置一个布局管理器layoutManager。
LinearLayoutManager layoutManager=new LinearLayoutManager(getActivity());
//给recycleView 设置布局管理器
allTaskRecycle.setLayoutManager(layoutManager);
//设置垂直反向
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//isReverse是true则为反向
layoutManager.setReverseLayout(true);
//设置适配器
mAdapter=new RecyclerViewAdapter(task);
allTaskRecycle.setAdapter(mAdapter);