美高梅网址注册-澳门mgm4858集团登录网址
做最好的网站
来自 澳门mgm4858集团登录网址 2019-10-03 21:14 的文章
当前位置: 美高梅网址注册 > 澳门mgm4858集团登录网址 > 正文

RecylerView是support-v7包中的新组件,用于数据和V

问题1:如何设置列表项点击事件?

解决思路

使用Java的回调机制

具体解决方法

在Adapter中提供OnItemClickListener接口和设置接口的方法

public interface OnItemClickListener { void onItemClick(View View, int position);}private OnItemClickListener onItemClickListener;public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener;}在onBindViewHolder方法中设置点击监听器并调用接口方法if (onItemClickListener != null) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick { onItemClickListener.onItemClick(holder.itemView, newPosition); } });}

在Activity/Fragment中实现接口方法

@Overridepublic void onNewsItemClick(String newsId) { // do sth.}

RecylerView简单的Demo

我们来看activity代码,跟ListView写法差不多,只是这边多设置了布局管理器。

public class LinearLayoutActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private RecyclerViewAdapter adapter;
    private List<String> datas;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recycler_main);

        initData();

        recyclerView= (RecyclerView) findViewById(R.id.recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));//设置布局管理器
        recyclerView.addItemDecoration(new DividerItemDecoration(this));
        recyclerView.setAdapter(adapter=new RecyclerViewAdapter(this,datas));
    }

    private void initData(){
        datas=new ArrayList<>();
        for(int i=0;i<100;i++){
            datas.add("item:"+i);
        }
    }
}

activity对应的布局文件:recycler_main.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/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

adapter相对ListView来说变化比较大的。把ViewHolder逻辑封装起来了,代码相对简单一些。

  • 需要继承RecyclerView.Adapter,重写三个方法
  • MyViewHolder需要继承RecyclerView.ViewHolder

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder>{
    private List<String> datas;
    private LayoutInflater inflater;
    
    public  RecyclerViewAdapter(Context context,List<String> datas){
        inflater=LayoutInflater.from(context);
        this.datas=datas;
    }
    
    //创建每一行的View 用RecyclerView.ViewHolder包装
    @Override
    public RecyclerViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView=inflater.inflate(R.layout.recycler_item,null);
        return new MyViewHolder(itemView);
    }
    
    //给每一行View填充数据
    @Override
    public void onBindViewHolder(RecyclerViewAdapter.MyViewHolder holder, int position) {
        holder.textview.setText(datas.get(position));
    }
    
    //数据源的数量
    @Override
    public int getItemCount() {
        return datas.size();
    }
    
    class MyViewHolder extends RecyclerView.ViewHolder{
        private TextView textview;
    
        public MyViewHolder(View itemView) {
            super(itemView);
            textview= (TextView) itemView.findViewById(R.id.textview);
        }
    }
    }
    

我们来看看效果图:

图片 1

源码下载

RecyclerView

具体步骤

添加依赖

compile 'com.android.support:recyclerview-v7:21.0.+'

引入RecyclerView

<android.support.v7.widget.RecyclerView android :id= "@+id/recycler_news" android :layout_width= "match_parent" android :layout_height= "match_parent" />

如果Adapter的变化不会影响RecyclerView的大小,也就是说RecyclerView的大小跟里面的列表项的多少和大小无关的话,请设置setHasFixedSize,这样可以提高性能,因为不同去动态计算RecyclerView的大小。

mRecyclerView.setHasFixedSize ;

private RecyclerView.LayoutManager mLayoutManager;// 线性布局,可以设置方向mLayoutManager = new LinearLayoutManager;// or 网格布局,可以设置列数和方向,是否反向显示mLayoutManager = new GridLayoutManager(this,2,LinearLayoutManager.HORIZONTAL,false);// or 瀑布流布局,可以设置列数和方向mLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);mRecyclerView.setLayoutManager(mLayoutManager);

新建Adapter类,继承自RecyclerView.Adapter新建ViewHolder内部类,继承自RecyclerView.ViewHolder并让Adapter的泛型设为该内部类实现Adapter的方法1. 构造方法:一般用于接收数据集2. onCreateViewHolder:用于从列表项布局文件中装载布局并新建一个ViewHolder装入列表项视图3. onBindViewHolder:用于数据和ViewHolder的绑定4. getItemCount:用于指定数据项的多少

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private String[] mDataset; // 提供视图和数据项之间的引用 public static class ViewHolder extends RecyclerView.ViewHolder { // each data item is just a string in this case public TextView mTextView; public ViewHolder(TextView v) { super; mTextView = v; } } // 依赖于数据集的构造方法 public MyAdapter(String[] myDataset) { mDataset = myDataset; } // 创建一个新的View  @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext .inflate(R.layout.my_text_view, parent, false); ... ViewHolder vh = new ViewHolder; return vh; } // 替换View的内容  @Override public void onBindViewHolder(ViewHolder holder, int position) { // - 获取数据集中该position的元素 // - 使用该元素替换View的内容 holder.mTextView.setText(mDataset[position]); } // 返回数据集的大小  @Override public int getItemCount() { return mDataset.length; }}

item点击事件&&增加或删除带动画效果

当我们调用RecyclerView的setOnItemClickListener方法的时候,发现居然没有,用了RecyclerView你要习惯什么东西都自己封装。。。

首先我们从adapter开刀,内部写一个接口,一个实例变量,提供一个公共方法,设置监听。

private RecyclerViewItemClick recyclerViewItemClick;

public void setRecyclerViewItemClick(RecyclerViewItemClick recyclerViewItemClick) {
    this.recyclerViewItemClick = recyclerViewItemClick;
}

public interface RecyclerViewItemClick{
    /**
     * item点击
     * @param realPosition 数据源position
     * @param position view position
     */
    void onItemClick(int realPosition,int position);
}

在onBindViewHolder方法中给item监听点击事件

if(recyclerViewItemClick!=null) {
    myholder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            recyclerViewItemClick.onItemClick(getRealPosition(position),position);
        }
    });
}

在activity的onCreate方法中进行监听,顺便设置item增加删除动画。我用的是sdk自带的默认动画。

adapter.setRecyclerViewItemClick(recyclerViewItemClick);
recyclerView.setItemAnimator(new DefaultItemAnimator());

private RecyclerHeadFootViewAdapter.RecyclerViewItemClick recyclerViewItemClick=new RecyclerHeadFootViewAdapter.RecyclerViewItemClick() {
    @Override
    public void onItemClick(int realPosition, int position) {
        Log.i("ansen","删除数据:"+realPosition+" view位置:"+position);
        Log.i("ansen","当前位置:"+position+" 更新item数量:"+(adapter.getItemCount()-position-1));

        datas.remove(realPosition);//删除数据源
        adapter.notifyItemRemoved(position);//item移除动画
        //更新position至adapter.getItemCount()-1的数据
        adapter.notifyItemRangeChanged(position,adapter.getItemCount()-position-1);
    }
};

RecyclerView增加分隔线

RecyclerView是没有android:divider跟android:dividerHeight属性的,如果我们需要分割线,就只能自己动手去实现了。

  • 需要继承ItemDecoration类,实现onDraw跟getItemOffsets方法。
  • 调用RecyclerView的addItemDecoration方法。

我们先写一个DividerItemDecoration类,继承RecyclerView.ItemDecoration,在getItemOffsets留出item之间的间隔,然后就会调用onDraw方法绘制(onDraw的绘制优先于每一行的绘制)

public class DividerItemDecoration extends RecyclerView.ItemDecoration{
    /*
    * RecyclerView的布局方向,默认先赋值 为纵向布局
    * RecyclerView 布局可横向,也可纵向
    * 横向和纵向对应的分割线画法不一样
    * */
    private int mOrientation = LinearLayoutManager.VERTICAL;

    private int mItemSize = 1;//item之间分割线的size,默认为1

    private Paint mPaint;//绘制item分割线的画笔,和设置其属性

    public DividerItemDecoration(Context context) {
        this(context,LinearLayoutManager.VERTICAL,R.color.colorAccent);
    }

    public DividerItemDecoration(Context context, int orientation) {
        this(context,orientation, R.color.colorAccent);
    }

    public DividerItemDecoration(Context context, int orientation, int dividerColor){
        this(context,orientation,dividerColor,1);
    }

    /**
     * @param context
     * @param orientation 绘制方向
     * @param dividerColor 分割线颜色 颜色资源id
     * @param mItemSize 分割线宽度 传入dp值就行
     */
    public DividerItemDecoration(Context context, int orientation, int dividerColor, int mItemSize){
        this.mOrientation = orientation;
        if(orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL){
            throw new IllegalArgumentException("请传入正确的参数") ;
        }
        //把dp值换算成px
        this.mItemSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,mItemSize,context.getResources().getDisplayMetrics());
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

        mPaint.setColor(context.getResources().getColor(dividerColor));
    }


    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        if(mOrientation == LinearLayoutManager.VERTICAL){
            drawVertical(c,parent) ;
        }else {
            drawHorizontal(c,parent) ;
        }
    }

    /**
     * 绘制纵向 item 分割线
     * @param canvas
     * @param parent
     */
    private void drawVertical(Canvas canvas,RecyclerView parent){
        final int left = parent.getPaddingLeft() ;
        final int right = parent.getMeasuredWidth() - parent.getPaddingRight();
        final int childSize = parent.getChildCount() ;
        for(int i = 0 ; i < childSize ; i ++){
            final View child = parent.getChildAt( i ) ;
            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
            final int top = child.getBottom() + layoutParams.bottomMargin ;
            final int bottom = top + mItemSize ;
            canvas.drawRect(left,top,right,bottom,mPaint);
        }
    }

    /**
     * 绘制横向 item 分割线
     * @param canvas
     * @param parent
     */
    private void drawHorizontal(Canvas canvas,RecyclerView parent){
        final int top = parent.getPaddingTop() ;
        final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom() ;
        final int childSize = parent.getChildCount() ;
        for(int i = 0 ; i < childSize ; i ++){
            final View child = parent.getChildAt( i ) ;
            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
            final int left = child.getRight() + layoutParams.rightMargin ;
            final int right = left + mItemSize ;
            canvas.drawRect(left,top,right,bottom,mPaint);
        }
    }

    /**
     * 设置item分割线的size
     * @param outRect
     * @param view
     * @param parent
     * @param state
     */
    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        if(mOrientation == LinearLayoutManager.VERTICAL){
            outRect.set(0,0,0,mItemSize);//垂直排列 底部偏移
        }else {
            outRect.set(0,0,mItemSize,0);//水平排列 右边偏移
        }
    }
}

不要忘记调用addItemDecoration方法哦

recyclerView.addItemDecoration(new DividerItemDecoration(this));//添加分割线

重新运行,效果图:

图片 2

添加分割线

大家读到这里肯定会有一个疑问,这货比ListView麻烦多了啊,但是google官方为什么要说是ListView的升级版呢?接下来开始放大招。。。

问题4:如何添加Header和Footer?

解决思路

重写Adapter的getItemViewType方法,使得不同索引位置的ItemView定义为不同的类型。要修改onCreateViewHolder、onBindViewHolder、getItemCount方法以及ViewHolder的构造方法。

具体步骤

提供HeaderView的获取和设置方法

public void setHeaderView(View headerView) { mHeaderView = headerView; notifyItemInserted;}public View getHeaderView() { return mHeaderView;}

定义两种列表项类型

public static final int TYPE_HEADER = 0;public static final int TYPE_NORMAL = 1;

重写getItemViewType方法

@Overridepublic int getItemViewType(int position) { if(mHeaderView == null) return TYPE_NORMAL; if(position == 0) return TYPE_HEADER; return TYPE_NORMAL;}

修改onCreateViewHolder、onBindViewHolder、getItemCount方法以及ViewHolder的构造方法

@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if(mHeaderView != null && viewType == TYPE_HEADER) return new Holder(mHeaderView); View layout = LayoutInflater.from(parent.getContext.inflate(R.layout.item, parent, false); return new Holder;}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { if(getItemViewType == TYPE_HEADER) return; final int pos = getRealPosition(viewHolder); final String data = mDatas.get; if(viewHolder instanceof Holder) {  viewHolder).text.setText; }}public int getRealPosition(RecyclerView.ViewHolder holder) { int position = holder.getLayoutPosition(); return mHeaderView == null ? position : position - 1;}@Overridepublic int getItemCount() { return mHeaderView == null ? mDatas.size() : mDatas.size() + 1;}class Holder extends RecyclerView.ViewHolder { TextView text; public Holder(View itemView) { super; if(itemView == mHeaderView) return; text =  itemView.findViewById(R.id.text); }}

StaggeredGridLayoutManager

actviity中修改下布局管理器,大家应该感觉很熟悉了吧~~~

recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));

瀑布流列表一般列的高度是不一致的,为了模拟不同的宽高,数据源我把String类型改成了对象.然后初始化的时候随机了一个高度.

public class ItemData {
    private String content;//item内容
    private int height;//item高度

    public ItemData() {
    }

    public ItemData(String content, int height) {
        this.content = content;
        this.height = height;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }
}

瀑布流列表没有添加分割线,给item布局设置了android:padding属性。recycler_staggered_item.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:padding="5dp"
    android:layout_width="wrap_content"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textview"
        android:background="@color/colorAccent"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="122"
        android:textSize="20sp"/>
</FrameLayout>

最后我们在适配器的onBindViewHolder方法中给itemd中的TextView设置一个高度

@Override
public void onBindViewHolder(StaggeredGridAdapter.MyViewHolder holder, int position) {
    ItemData itemData=datas.get(position);
    holder.textview.setText(itemData.getContent());
    //手动更改高度,不同位置的高度有所不同
    holder.textview.setHeight(itemData.getHeight());
}

是不是感觉so easy,赶紧运行看看效果:

图片 3

注意

新建完项目,需要在app/build.gradle增加RecylerView依赖,不然找不到RecyclerView类

compile 'com.android.support:recyclerview-v7:23.1.0'

解决的思路

  • 使用RecyclerView统一ListView和GridView
  • RecyclerView内部提供Adapter并强制要求提供ViewHolder
  • RecyclerView内部提供LayoutManager并提供线性、网格和瀑布流的实现
  • RecyclerView内部提供ItemAnimator并默认实现列表项删除和添加动画

图片 4RecyclerView设计思路

理念:简化数据的显示操作和处理大数据集

Adapter:提供view来显示数据集中的元素LayoutManager:放置元素到布局中ItemAnimator:设置添加和移除元素的动画

RecyclerView增加分隔线

RecyclerView是没有android:divider跟android:dividerHeight属性的,如果我们需要分割线,就只能自己动手去实现了。

  • 需要继承ItemDecoration类,实现onDraw跟getItemOffsets方法。
  • 调用RecyclerView的addItemDecoration方法。

我们先写一个DividerItemDecoration类,继承RecyclerView.ItemDecoration,在getItemOffsets留出item之间的间隔,然后就会调用onDraw方法绘制(onDraw的绘制优先于每一行的绘制)

public class DividerItemDecoration extends RecyclerView.ItemDecoration{
    /*
    * RecyclerView的布局方向,默认先赋值 为纵向布局
    * RecyclerView 布局可横向,也可纵向
    * 横向和纵向对应的分割线画法不一样
    * */
    private int mOrientation = LinearLayoutManager.VERTICAL;

    private int mItemSize = 1;//item之间分割线的size,默认为1

    private Paint mPaint;//绘制item分割线的画笔,和设置其属性

    public DividerItemDecoration(Context context) {
        this(context,LinearLayoutManager.VERTICAL,R.color.colorAccent);
    }

    public DividerItemDecoration(Context context, int orientation) {
        this(context,orientation, R.color.colorAccent);
    }

    public DividerItemDecoration(Context context, int orientation, int dividerColor){
        this(context,orientation,dividerColor,1);
    }

    /**
     * @param context
     * @param orientation 绘制方向
     * @param dividerColor 分割线颜色 颜色资源id
     * @param mItemSize 分割线宽度 传入dp值就行
     */
    public DividerItemDecoration(Context context, int orientation, int dividerColor, int mItemSize){
        this.mOrientation = orientation;
        if(orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL){
            throw new IllegalArgumentException("请传入正确的参数") ;
        }
        //把dp值换算成px
        this.mItemSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,mItemSize,context.getResources().getDisplayMetrics());
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

        mPaint.setColor(context.getResources().getColor(dividerColor));
    }


    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        if(mOrientation == LinearLayoutManager.VERTICAL){
            drawVertical(c,parent) ;
        }else {
            drawHorizontal(c,parent) ;
        }
    }

    /**
     * 绘制纵向 item 分割线
     * @param canvas
     * @param parent
     */
    private void drawVertical(Canvas canvas,RecyclerView parent){
        final int left = parent.getPaddingLeft() ;
        final int right = parent.getMeasuredWidth() - parent.getPaddingRight();
        final int childSize = parent.getChildCount() ;
        for(int i = 0 ; i < childSize ; i ++){
            final View child = parent.getChildAt( i ) ;
            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
            final int top = child.getBottom() + layoutParams.bottomMargin ;
            final int bottom = top + mItemSize ;
            canvas.drawRect(left,top,right,bottom,mPaint);
        }
    }

    /**
     * 绘制横向 item 分割线
     * @param canvas
     * @param parent
     */
    private void drawHorizontal(Canvas canvas,RecyclerView parent){
        final int top = parent.getPaddingTop() ;
        final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom() ;
        final int childSize = parent.getChildCount() ;
        for(int i = 0 ; i < childSize ; i ++){
            final View child = parent.getChildAt( i ) ;
            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
            final int left = child.getRight() + layoutParams.rightMargin ;
            final int right = left + mItemSize ;
            canvas.drawRect(left,top,right,bottom,mPaint);
        }
    }

    /**
     * 设置item分割线的size
     * @param outRect
     * @param view
     * @param parent
     * @param state
     */
    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        if(mOrientation == LinearLayoutManager.VERTICAL){
            outRect.set(0,0,0,mItemSize);//垂直排列 底部偏移
        }else {
            outRect.set(0,0,mItemSize,0);//水平排列 右边偏移
        }
    }
}

不要忘记调用addItemDecoration方法哦

recyclerView.addItemDecoration(new DividerItemDecoration(this));//添加分割线

重新运行,效果图:

图片 5

大家读到这里肯定会有一个疑问,这货比ListView麻烦多了啊,但是google官方为什么要说是ListView的升级版呢?接下来开始放大招。。。

RecylerView简单的Demo

我们来看activity代码,跟ListView写法差不多,只是这边多设置了布局管理器。

public class LinearLayoutActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private RecyclerViewAdapter adapter;
    private List<String> datas;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recycler_main);

        initData();

        recyclerView= (RecyclerView) findViewById(R.id.recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));//设置布局管理器
        recyclerView.addItemDecoration(new DividerItemDecoration(this));
        recyclerView.setAdapter(adapter=new RecyclerViewAdapter(this,datas));
    }

    private void initData(){
        datas=new ArrayList<>();
        for(int i=0;i<100;i++){
            datas.add("item:"+i);
        }
    }
}

activity对应的布局文件:recycler_main.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/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

adapter相对ListView来说变化比较大的。把ViewHolder逻辑封装起来了,代码相对简单一些。

  • 需要继承RecyclerView.Adapter,重写三个方法
  • MyViewHolder需要继承RecyclerView.ViewHolder
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder>{
    private List<String> datas;
    private LayoutInflater inflater;

    public  RecyclerViewAdapter(Context context,List<String> datas){
        inflater=LayoutInflater.from(context);
        this.datas=datas;
    }

    //创建每一行的View 用RecyclerView.ViewHolder包装
    @Override
    public RecyclerViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView=inflater.inflate(R.layout.recycler_item,null);
        return new MyViewHolder(itemView);
    }

    //给每一行View填充数据
    @Override
    public void onBindViewHolder(RecyclerViewAdapter.MyViewHolder holder, int position) {
        holder.textview.setText(datas.get(position));
    }

    //数据源的数量
    @Override
    public int getItemCount() {
        return datas.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder{
        private TextView textview;

        public MyViewHolder(View itemView) {
            super(itemView);
            textview= (TextView) itemView.findViewById(R.id.textview);
        }
    }
}

我们来看看效果图:

图片 6

RecylerView基本使用

本文由美高梅网址注册发布于澳门mgm4858集团登录网址,转载请注明出处:RecylerView是support-v7包中的新组件,用于数据和V

关键词: