写这些主要是为了加深自己对重要知识点的影响 公开也是为了让大家更好的看到重零开始慢慢学习的路程 so 大家
peace~
RecyclerView学习总结(二)——水平滚动,网格布局
先介绍下RecyclerView
从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活。RecyclerView的官方定义如下:
A flexible view for providing a limited window into a large data set.å
从定义可以看出,flexible(可扩展性)是RecyclerView的特点。
RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字Recyclerview即回收view也可以看出。
RecyclerView的优点
RecyclerView并不会完全替代ListView(这点从ListView没有被标记为@Deprecated可以看出),两者的使用场景不一样。但是RecyclerView的出现会让很多开源项目被废弃,例如横向滚动的ListView, 横向滚动的GridView, 瀑布流控件,因为RecyclerView能够实现所有这些功能。
比如:有一个需求是屏幕竖着的时候的显示形式是ListView,屏幕横着的时候的显示形式是2列的GridView,此时如果用RecyclerView,则通过设置LayoutManager一行代码实现替换。
RecylerView相对于ListView的优点罗列如下:
- RecyclerView封装了viewholder的回收复用,也就是说RecyclerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的逻辑被封装了,写起来更加简单。
直接省去了listview中convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。 - 提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecyclerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。
- 设置布局管理器以控制Item的布局方式,横向、竖向以及瀑布流方式
例如:你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还StaggeredGridLayoutManager等)。也就是说RecyclerView不再拘泥于ListView的线性展示方式,它也可以实现GridView的效果等多种效果。 - 可设置Item的间隔样式(可绘制)
通过继承RecyclerView的ItemDecoration这个类,然后针对自己的业务需求去书写代码。 - 可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecyclerView有其自己默认的实现。
但是关于Item的点击和长按事件,需要用户自己去实现
这一部分截选于简书里面的大佬 那边讲的也比较详细 不要看我的啦 我只是初学者有很多错误的知识!
作者:Rtia
链接:https://www.jianshu.com/p/4f9591291365
來源:简书
首先先上效果图
1.在build.gradle里面引入包
implementation 'com.android.support:design:26.1.0'//design库
design库里面包括了RecuclerView 所以就直接引入这个
先做准备工作
2.新建一个Activity:
RecycleViewActivity 然后会自动生成一个xml文件 然后在在xml文件里面写入这样代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:id="@+id/btn_linear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="列表视图"/>
</LinearLayout>
让他跳转到不同的RecyckerView里面 后续会写表格还有瀑布流等 我现在只写了list 所以先写一个butten
然后在在activity里面写入一下代码
package lee.example.com.test.recycleview;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import lee.example.com.test.R;
public class RecyclerViewActivity extends AppCompatActivity {
private Button mBtnLinear;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view);
mBtnLinear = findViewById(R.id.btn_linear);
mBtnLinear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(RecyclerViewActivity.this,LinearRecyclerViewActivity.class);
startActivity(intent);
}
});
}
}
这其实只是一个跳转而已跳转到LinearRecyclerActivity里面 (这个里面是 用来写list的java代码)
然后在建一个activity用来做
LinearRecyclerActivity 用来放list的java代码 相对应的会生成一个xml文件
在xml文件里面写入一下代码
<?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="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorGrayDark"/>
</RelativeLayout>
其实里面就是一个RecyclerView控件
然后再在Activity里面写入一下代码
package lee.example.com.test.recycleview;
import android.graphics.Rect;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;
import lee.example.com.test.R;
public class LinearRecyclerViewActivity extends AppCompatActivity {
private RecyclerView mRvMain;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_linear_recycler_view);
mRvMain = findViewById(R.id.rv_main);
mRvMain.setLayoutManager(new LinearLayoutManager(LinearRecyclerViewActivity.this));
//可以绘制下划线Item的分割线
mRvMain.addItemDecoration(new MyDecoration());
mRvMain.setAdapter( new LinearAdapter(LinearRecyclerViewActivity.this, new LinearAdapter.OnItemClickListener() {
@Override
public void onClick(int pos) {
Toast.makeText(LinearRecyclerViewActivity.this,"点击第"+pos+"行",Toast.LENGTH_SHORT).show();
}
}));
}
//绘制分割线
class MyDecoration extends RecyclerView.ItemDecoration{
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.set(0,0,0,getResources().getDimensionPixelOffset(R.dimen.dividerHeight));
}
}
}
这个里面的代码有备注 先说下没有备注的吧 现在LayoutManager里面设置LinearLayoutManager 这个就是说要把这个xml做成list的形式
ps 因为这种list没有分割线 说以绘制一条分割线出来 因为没有dimen这个 所以要在values里面新建一个文件叫做dimen.xml
在dimen.xml里面写入大小
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="dividerHeight">1dp</dimen>
</resources>
其实这个就是一个线大小为1dp的线
然后要写一个Adapter
然后新建一个Adaper用来做中间的数据桥梁之类的
新建一个LinearAdaper 继承如下图所示的Adaper
在LinearAdaper写入
package lee.example.com.test.recycleview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
import lee.example.com.test.R;
/***
*Create By Lee On 2019/1/2
**/
public class LinearAdapter extends RecyclerView.Adapter<LinearAdapter.LinearViewHolder> {
private Context mContext;
private OnItemClickListener mListener;
public LinearAdapter(Context context,OnItemClickListener listener) {
this.mContext = context;
this.mListener= listener;
}
@Override
public LinearAdapter.LinearViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new LinearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_linear_ltem,parent,false));
}
@Override
public void onBindViewHolder(LinearAdapter.LinearViewHolder holder, final int position) {
//设置数据!
holder.textView.setText("hello!!!!!!!!");
//设置点击事件方法
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onClick(position);
}
});
}
@Override
public int getItemCount() {
return 30;
}//list数量
//做基础工作。。。
class LinearViewHolder extends RecyclerView.ViewHolder{
private TextView textView;
public LinearViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv_title);
}
}
//设计点击事件接口!
public interface OnItemClickListener{
void onClick(int pos);
}
}
先做好基础工作
class LinearViewHolder extends RecyclerView.ViewHolder{
private TextView textView;
public LinearViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv_title);
}
}
然后在写一个布局layout_linear_item.xml文件
这个呢是每一个list里面的内容
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffff">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:textColor="@color/colorBlack"
android:textSize="20sp"/>
</LinearLayout>
然后这个list就做完了