RecycleView套用demo

來自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4232560.html

 

RecyclerView是一個比ListView更靈活的一個控件,以後可以直接拋棄ListView了。具體好在哪些地方,往下看就知道了。

首先我們來使用RecyclerView來實現ListView的效果,一個滾動列表,先看下效果圖(除了有動畫之外,沒什麼特別--):

 

每個item的佈局如下:

複製代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/recycler_view_test_item_person_view"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:padding="15dp"
              android:background="#aabbcc"
        >
    <TextView
            android:id="@+id/recycler_view_test_item_person_name_tv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            android:background="#ccbbaa"
            />
    <TextView
            android:id="@+id/recycler_view_test_item_person_age_tv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="5dp"
            android:background="#aaccbb"
            android:textSize="15sp"
            />
</LinearLayout>
複製代碼

item的佈局很簡單,只有兩個TextView,一個用來顯示名字,一個用來顯示年齡。

Person的實體類就不貼代碼了,兩個屬性:名字和年齡。

然後需要使用到RecyclerView,所以需要把support v7添加到class path,並在佈局中添加該控件:

複製代碼
<android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view_test_rv"
                android:scrollbars="vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="#bbccaa"
                />
複製代碼

然後在onCreate中:

複製代碼
1         recyclerView.setHasFixedSize(true);
2 
3         RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(context);
4         recyclerView.setLayoutManager(layoutManager);
5 
6         initData();
7         adapter = new PersonAdapter(personList);
8         adapter.setOnRecyclerViewListener(this);
9         recyclerView.setAdapter(adapter);    
複製代碼

 

如上述代碼:

Line1: 使RecyclerView保持固定的大小,這樣會提高RecyclerView的性能。

Line3: LinearLayoutManager,如果你需要顯示的是橫向滾動的列表或者豎直滾動的列表,則使用這個LayoutManager。顯然,我們要實現的是ListView的效果,所以需要使用它。生成這個LinearLayoutManager之後可以設置他滾動的方向,默認豎直滾動,所以這裏沒有顯式地設置。

Line6: 初始化數據源。

Line7~9: 跟ListView一樣,需要設置RecyclerView的Adapter,但是這裏的Adapter跟ListView使用的Adapter不一樣,這裏的Adapter需要繼承RecyclerView.Adapter,需要實現3個方法:

  - onCreateViewHolder()

  - onBindViewHolder()

  - getItemCount()

直接看代碼:

複製代碼
 1 package com.wangjie.helloandroid.sample.recycler.person;
 2 
 3 import android.support.v7.widget.RecyclerView;
 4 import android.view.LayoutInflater;
 5 import android.view.View;
 6 import android.view.ViewGroup;
 7 import android.widget.LinearLayout;
 8 import android.widget.TextView;
 9 import com.wangjie.androidbucket.log.Logger;
10 import com.wangjie.helloandroid.R;
11 
12 import java.util.List;
13 
14 /**
15  * Author: wangjie
16  * Email: [email protected]
17  * Date: 1/17/15.
18  */
19 public class PersonAdapter extends RecyclerView.Adapter {
20     public static interface OnRecyclerViewListener {
21         void onItemClick(int position);
22         boolean onItemLongClick(int position);
23     }
24 
25     private OnRecyclerViewListener onRecyclerViewListener;
26 
27     public void setOnRecyclerViewListener(OnRecyclerViewListener onRecyclerViewListener) {
28         this.onRecyclerViewListener = onRecyclerViewListener;
29     }
30 
31     private static final String TAG = PersonAdapter.class.getSimpleName();
32     private List<Person> list;
33 
34     public PersonAdapter(List<Person> list) {
35         this.list = list;
36     }
37 
38     @Override
39     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
40         Logger.d(TAG, "onCreateViewHolder, i: " + i);
41         View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycler_view_test_item_person, null);
42         LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
43         view.setLayoutParams(lp);
44         return new PersonViewHolder(view);
45     }
46 
47     @Override
48     public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
49         Logger.d(TAG, "onBindViewHolder, i: " + i + ", viewHolder: " + viewHolder);
50         PersonViewHolder holder = (PersonViewHolder) viewHolder;
51         holder.position = i;
52         Person person = list.get(i);
53         holder.nameTv.setText(person.getName());
54         holder.ageTv.setText(person.getAge() + "歲");
55     }
56 
57     @Override
58     public int getItemCount() {
59         return list.size();
60     }
61 
62     class PersonViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener
63     {
64         public View rootView;
65         public TextView nameTv;
66         public TextView ageTv;
67         public int position;
68 
69         public PersonViewHolder(View itemView) {
70             super(itemView);
71             nameTv = (TextView) itemView.findViewById(R.id.recycler_view_test_item_person_name_tv);
72             ageTv = (TextView) itemView.findViewById(R.id.recycler_view_test_item_person_age_tv);
73             rootView = itemView.findViewById(R.id.recycler_view_test_item_person_view);
74             rootView.setOnClickListener(this);
75             rootView.setOnLongClickListener(this);
76         }
77 
78         @Override
79         public void onClick(View v) {
80             if (null != onRecyclerViewListener) {
81                 onRecyclerViewListener.onItemClick(position);
82             }
83         }
84 
85         @Override
86         public boolean onLongClick(View v) {
87             if(null != onRecyclerViewListener){
88                 return onRecyclerViewListener.onItemLongClick(position);
89             }
90             return false;
91         }
92     }
93 
94 }
複製代碼

如上代碼所示:

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)

這個方法主要生成爲每個Item inflater出一個View,但是該方法返回的是一個ViewHolder。方法是把View直接封裝在ViewHolder中,然後我們面向的是ViewHolder這個實例,當然這個ViewHolder需要我們自己去編寫。直接省去了當初的convertView.setTag(holder)和convertView.getTag()這些繁瑣的步驟。

 

public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i)

這個方法主要用於適配渲染數據到View中。方法提供給你了一個viewHolder,而不是原來的convertView。

對比下以前的寫法就一目瞭然了:

複製代碼
 1 @Override
 2     public View getView(int position, View convertView, ViewGroup parent) {
 3         ViewHolder holder;
 4         if(null == convertView){
 5             holder = new ViewHolder();
 6             LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 7             convertView = mInflater.inflate(R.layout.item, null);
 8             holder.btn = (Button) convertView.findViewById(R.id.btn);
 9             holder.tv = (TextView) convertView.findViewById(R.id.tv);
10             holder.iv = (TextView) convertView.findViewById(R.id.iv);
11 
12             convertView.setTag(holder);
13         }else{
14             holder = (ViewHolder) convertView.getTag();
15         }
16         final HashMap<String, Object> map = list.get(position);
17 
18         holder.iv.setImageResource(Integer.valueOf(map.get("iv").toString()));
19         holder.tv.setText(map.get("tv").toString());
20 
21         holder.btn.setOnClickListener(new View.OnClickListener() {
22             @Override
23             public void onClick(View v) {
24                 Toast.makeText(context, map.get("btn").toString(), Toast.LENGTH_SHORT).show();
25             }
26         });
27 
28         return convertView;
29     }
30 
31     class ViewHolder{
32         Button btn;
33         ImageView iv;
34         TextView tv;
35 
36     }
複製代碼

對比後可以發現:

舊的寫法中Line5~Line12+Line28部分的代碼其實起到的作用相當於新的寫法的onCreateViewHolder();

舊的寫法中Line14~Line26部分的代碼其實起到的作用相當於新的寫法的onBindViewHolder();

既然是這樣,那我們就把原來相應的代碼搬到對應的onCreateViewHolder()和onBindViewHolder()這兩個方法中就可以了。

因爲RecyclerView幫我們封裝了Holder,所以我們自己寫的ViewHolder就需要繼承RecyclerView.ViewHolder,只有這樣,RecyclerView才能幫你去管理這個ViewHolder類。

既然getView方法的渲染數據部分的代碼相當於onBindViewHolder(),所以如果調用adapter.notifyDataSetChanged()方法,應該也會重新調用onBindViewHolder()方法纔對吧?實驗後,果然如此!

除了adapter.notifyDataSetChanged()這個方法之外,新的Adapter還提供了其他的方法,如下:

複製代碼
        public final void notifyDataSetChanged()
        public final void notifyItemChanged(int position)
        public final void notifyItemRangeChanged(int positionStart, int itemCount)
        public final void notifyItemInserted(int position) 
        public final void notifyItemMoved(int fromPosition, int toPosition)
        public final void notifyItemRangeInserted(int positionStart, int itemCount)
        public final void notifyItemRemoved(int position)
        public final void notifyItemRangeRemoved(int positionStart, int itemCount) 
複製代碼

基本上看到方法的名字就知道這個方法是幹嘛的了,

第一個方法沒什麼好講的,跟以前一樣。

notifyItemChanged(int position),position數據發生了改變,那調用這個方法,就會回調對應position的onBindViewHolder()方法了,當然,因爲ViewHolder是複用的,所以如果position在當前屏幕以外,也就不會回調了,因爲沒有意義,下次position滾動會當前屏幕以內的時候同樣會調用onBindViewHolder()方法刷新數據了。其他的方法也是同樣的道理。

public final void notifyItemRangeChanged(int positionStart, int itemCount),顧名思義,可以刷新從positionStart開始itemCount數量的item了(這裏的刷新指回調onBindViewHolder()方法)。

public final void notifyItemInserted(int position),這個方法是在第position位置被插入了一條數據的時候可以使用這個方法刷新,注意這個方法調用後會有插入的動畫,這個動畫可以使用默認的,也可以自己定義。

public final void notifyItemMoved(int fromPosition, int toPosition),這個方法是從fromPosition移動到toPosition爲止的時候可以使用這個方法刷新

public final void notifyItemRangeInserted(int positionStart, int itemCount),顯然是批量添加。

public final void notifyItemRemoved(int position),第position個被刪除的時候刷新,同樣會有動畫。

public final void notifyItemRangeRemoved(int positionStart, int itemCount),批量刪除。

 

這些方法分析完之後,我們來實現一個點擊一個按鈕,新增一條數據,長按一個item,刪除一條數據的場景。

以下是新增一條數據的代碼:

1 Person person = new Person(i, "WangJie_" + i, 10 + i);
2 adapter.notifyItemInserted(2);
3 personList.add(2, person);
4 adapter.notifyItemRangeChanged(2, adapter.getItemCount());

如上代碼:

Line2:表示在position爲2的位置,插入一條數據,這個時候動畫開始執行。

Line3: 表示在數據源中position爲2的位置新增一條數據(其實這個纔是真正的新增數據啦)。

Line4: 爲什麼要刷新position爲2以後的數據呢?因爲,在position爲2的位置插入了一條數據後,新數據的position變成了2,那原來的position爲2的應該變成了3,3的應該變成了4,所以2以後的所有數據的position都發生了改變,所以需要把position2以後的數據都要刷新。理論上是這樣,但是實際上刷新的數量只有在屏幕上顯示的position爲2以後的數據而已。如果這裏使用notifyDataSetChanged()來刷新屏幕上顯示的所有item可以嗎?結果不會出錯,但是會有一個問題,前面調用了notifyItemInserted()方法後會在執行動畫,如果你調用notifyDataSetChanged()刷新屏幕上顯示的所有item的話,必然也會刷新當前正在執行動畫的那個item,這樣導致的結果是,前面的動畫還沒執行完,它馬上又被刷新了,動畫就看不見了。所以只要刷新2以後的item就可以了。

 

看了RecyclerView的api,發現沒有setOnItemClickListener--,所以還是自己把onItemClick從Adapter中回調出來吧。這個很簡單,就像上面PersonAdaper中寫的OnRecyclerViewListener那樣。

 

長按刪除的代碼如下:

1 adapter.notifyItemRemoved(position);
2 personList.remove(position);
3 adapter.notifyItemRangeChanged(position, adapter.getItemCount());

代碼跟之前插入的代碼基本一致。先通知執行動畫,然後刪除數據源中的數據,然後通知position之後的數據刷新就可以了。

這樣ListView的效果就實現了。



步驟

1、build.gradle(app)中寫入引用

2、準備兩個xml:a.包含RecyclerView的.xml;b.RecycleView中的item的.xml

3、準備adapter

4、在.java中調用,findviewbyId、設置佈局管理器、適配器(其他選配)

compile 'com.android.support:recyclerview-v7:22.2.0'
compile 'com.android.support:cardview-v7:22.2.0' //經常搭配,跟RecycleView沒關係

Sync項目是必須的,然而有時候還要clean,有過Sync後引用還無效的情況


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



mRecyclerView = findView(R.id.id_recyclerview);
//設置佈局管理器
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity().getApplicationContext()));
//設置adapter
mRecyclerView.setAdapter(adapter)
//設置Item增加、移除動畫
mRecyclerView.setItemAnimator(new DefaultItemAnimator());/
//添加分割線
mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.HORIZONTAL_LIST));

recyclerView 的顯示方向可以設置 佈局管理器

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); //設置方向

Adapter的填寫

/**
 * Created by laisixiang on 2015/12/11.
 */
public class RecordBorrowRecycleViewAdapter extends RecyclerView.Adapter<RecordBorrowRecycleViewAdapter.ViewHolder> {

    private Context context;
    private ArrayList<BorrowRecord> borrowRecords;
    private ViewHolder holder;

    /**
     *構造方法,爲了導入數據
     * @param context   上下文
     * @param borrowRecords     獲取、解析得到的數據
     */
    public RecordBorrowRecycleViewAdapter(Context context, ArrayList<BorrowRecord> borrowRecords){
        this.context = context;
        this.borrowRecords = borrowRecords;
    }

    /**
     * 產生一個ViewHolder,一般改R.layout.cardview_borrow
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public RecordBorrowRecycleViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_borrow, parent, false);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    /**
     * 把構造方法得到的數據填到每一個item     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(RecordBorrowRecycleViewAdapter.ViewHolder holder, int position) {
        holder.tv_name.setText(borrowRecords.get(position).getBackToWho());
        holder.tv_count.setText(borrowRecords.get(position).getBackTime().toString());
    }

    /**
     * 返回item條數
     * @return
     */
    @Override
    public int getItemCount() {
        return borrowRecords.size();
    }

    /**
     * 1onCreateViewHolder()方法中得到的v
     * 2v中所有要填寫數據的view
     */
    public static class ViewHolder extends RecyclerView.ViewHolder {
        View v;//在例子中爲cardView
        TextView tv_name;
        TextView tv_count;

        public ViewHolder(View v) {
            super(v);
            this.v = v;
            this.tv_name = (TextView) v.findViewById(R.id.tv_name);
            this.tv_count = (TextView) v.findViewById(R.id.tv_count);
        }

    }
}

===================================================

http://blog.csdn.net/ipip2005/article/details/38581427

官方樣例:

xml:
[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <!-- A RecyclerView with some commonly used attributes -->  
  2. <android.support.v7.widget.RecyclerView  
  3.     android:id="@+id/my_recycler_view"  
  4.     android:scrollbars="vertical"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="match_parent"/>  

main code:
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. public class MyActivity extends Activity {  
  2.     private RecyclerView mRecyclerView;  
  3.     private RecyclerView.Adapter mAdapter;  
  4.     private RecyclerView.LayoutManager mLayoutManager;  
  5.   
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.my_activity);  
  10.         mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);  
  11.   
  12.         // improve performance if you know that changes in content  
  13.         // do not change the size of the RecyclerView  
  14.         mRecyclerView.setHasFixedSize(true);  
  15.   
  16.         // use a linear layout manager  
  17.         mLayoutManager = new LinearLayoutManager(this);  
  18.         mRecyclerView.setLayoutManager(mLayoutManager);  
  19.   
  20.         // specify an adapter (see also next example)  
  21.         mAdapter = new MyAdapter(myDataset);  
  22.         mRecyclerView.setAdapter(mAdapter);  
  23.     }  
  24.     ...  
  25. }  
adapter code:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {  
  2.     private String[] mDataset;  
  3.   
  4.     // Provide a reference to the type of views that you are using  
  5.     // (custom viewholder)  
  6.     public static class ViewHolder extends RecyclerView.ViewHolder {  
  7.         public TextView mTextView;  
  8.         public ViewHolder(TextView v) {  
  9.             super(v);  
  10.             mTextView = v;  
  11.         }  
  12.     }  
  13.   
  14.     // Provide a suitable constructor (depends on the kind of dataset)  
  15.     public MyAdapter(String[] myDataset) {  
  16.         mDataset = myDataset;  
  17.     }  
  18.   
  19.     // Create new views (invoked by the layout manager)  
  20.     @Override  
  21.     public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,  
  22.                                                    int viewType) {  
  23.         // create a new view  
  24.         View v = LayoutInflater.from(parent.getContext())  
  25.                                .inflate(R.layout.my_text_view, parent, false);  
  26.         // set the view's size, margins, paddings and layout parameters  
  27.         ...  
  28.         ViewHolder vh = new ViewHolder(v);  
  29.         return vh;  
  30.     }  
  31.   
  32.     // Replace the contents of a view (invoked by the layout manager)  
  33.     @Override  
  34.     public void onBindViewHolder(ViewHolder holder, int position) {  
  35.         // - get element from your dataset at this position  
  36.         // - replace the contents of the view with that element  
  37.         holder.mTextView.setText(mDataset[position]);  
  38.   
  39.     }  
  40.   
  41.     // Return the size of your dataset (invoked by the layout manager)  
  42.     @Override  
  43.     public int getItemCount() {  
  44.         return mDataset.length;  
  45.     }  
  46. }  


=================================================

package cn.edu.scau.hometown.adapter;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.List;

import cn.edu.scau.hometown.R;
import cn.edu.scau.hometown.bean.AllComment;

/**
 * Created by laisixiang on 2015/10/4.
 */
public class NewInitCommentsViewAdapter extends RecyclerView.Adapter{
    private AllComment mAllComments;
    private List<AllComment.CommentEntity> commentList;

    public NewInitCommentsViewAdapter(AllComment mAllComments){
        this.mAllComments = mAllComments;
        this.commentList = mAllComments.getComment();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_item_comment,null);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        view.setLayoutParams(lp);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ViewHolder viewHolder = (ViewHolder) holder;
        AllComment.CommentEntity comment=mAllComments.getComment().get(position);
        viewHolder.position =  position; //在此得到位置,創建的時候做個標示
        viewHolder.tv_comment_class_user.setText("點評人    :"+comment.getClass_User());
        viewHolder.tv_comment_class_check.setText("點名情況:"+comment.getClass_Check());
        viewHolder.tv_comment_class_homework.setText("平時作業:"+comment.getClass_Homework());
        viewHolder.tv_comment_class_exam.setText("考試形式:"+comment.getClass_Exam());
        viewHolder.tv_comment_class_score.setText("期末成績:"+comment.getClass_Score());
        viewHolder.tv_comment_time.setText("點評時間:"+comment.getClass_Comment_Time());
        viewHolder.tv_comment_class_select.setText("選修學期:"+comment.getClass_Select());
        viewHolder.tv_comment_class_ex.setText("其他說明:"+comment.getClass_Ex());
    }

    @Override
    public int getItemCount() {
        return (commentList==null)?0:commentList.size();
    }



    /**
     * ViewHolder
     */
    class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        TextView tv_comment_class_check;
        TextView tv_comment_class_homework;
        TextView tv_comment_class_exam;
        TextView tv_comment_class_score;
        TextView tv_comment_class_user;
        TextView tv_comment_time;
        TextView tv_comment_class_select;
        TextView tv_comment_class_ex;
        public View rootView;
        public int position;

        public ViewHolder(View itemView) {
            super(itemView);
            tv_comment_class_check=(TextView) itemView.findViewById(R.id.tv_comment_class_check_new);
            tv_comment_class_homework=(TextView) itemView.findViewById(R.id.tv_comment_class_homework_new);
            tv_comment_class_exam=(TextView) itemView.findViewById(R.id.tv_comment_class_exam_new);
            tv_comment_class_score=(TextView) itemView.findViewById(R.id.tv_comment_class_score_new);
            tv_comment_class_user=(TextView) itemView.findViewById(R.id.tv_comment_class_user_new);
            tv_comment_time=(TextView) itemView.findViewById(R.id.tv_comment_class_time_new);
            tv_comment_class_select=(TextView) itemView.findViewById(R.id.tv_comment_class_select_new);
            tv_comment_class_ex=(TextView) itemView.findViewById(R.id.tv_comment_class_ex_new);
            rootView =  itemView.findViewById(R.id.cardview_item_comment);
            rootView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (null != onRecyclerViewListener) {
                onRecyclerViewListener.onItemClick(position);
            }
        }
    }


    /**
     * 以下三個方法爲完善這個recycleViewAdapter,實現監聽
     */
    public static interface OnRecyclerViewListener {
        void onItemClick(int position);
        boolean onItemLongClick(int position);
    }

    private OnRecyclerViewListener onRecyclerViewListener;

    public void setOnRecyclerViewListener(OnRecyclerViewListener onRecyclerViewListener) {
        this.onRecyclerViewListener = onRecyclerViewListener;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章