Commit 2797147cda006b2e3f42b23efe3da34a2e3a40a2

Authored by 朱显松
1 parent cfb6f42e

The DataBinding that adds the RecyclerView Adapter supports and stores ViewState

app/build.gradle
... ... @@ -41,6 +41,6 @@ dependencies {
41 41 testCompile 'junit:junit:4.12'
42 42 // TODO 本地酷使用说明 代码仓库标识
43 43 // compile 'com.cnlive.libs:base:1.0.0@aar'
44   - compile 'com.cnlive:cnlive:0.2.0'
45   -// compile project(':cnlive')
  44 +// compile 'com.cnlive:cnlive:0.2.0'
  45 + compile project(':cnlive')
46 46 }
... ...
app/src/main/java/com/cnlive/libs/demo/MainActivity.java
1 1 package com.cnlive.libs.demo;
2 2  
3   -import android.databinding.DataBindingUtil;
4 3 import android.os.Bundle;
5 4 import android.support.v7.app.AppCompatActivity;
6   -import android.util.Log;
7   -import android.view.View;
8   -import android.widget.TextView;
9   -
10   -import com.cnlive.libs.demo.databinding.ActivityMainBinding;
11 5  
12 6 public class MainActivity extends AppCompatActivity {
13 7  
14   - private MainPageData data = new MainPageData();
15   -
16 8 @Override
17 9 protected void onCreate(Bundle savedInstanceState) {
18 10 super.onCreate(savedInstanceState);
19   -
20   - ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
21   - binding.setData(data);
22   - //Toast 测试
23   - ToastTest.test(this);
24   - Java8Test.test(this);
25 11 }
26 12  
27   - protected void onAddItemClick(View view){
28   - int id = data.getList().size();
29   - data.getList().add(new MainListItemData(""+id));
30   - }
31   -
32   - protected void onMainItemClick(View view) {
33   - TextView itemView = (TextView) view;
34   - Log.e("DemoView", "view ~" + itemView.getText());
35   - }
36 13 }
... ...
app/src/main/java/com/cnlive/libs/demo/MainAdapter.java deleted 100644 → 0
1   -package com.cnlive.libs.demo;
2   -
3   -import com.cnlive.libs.demo.databinding.ListitemMainBinding;
4   -
5   -import java.util.List;
6   -
7   -/**
8   - * Created by xiansong on 2017/8/30.
9   - */
10   -
11   -public class MainAdapter extends DataBindingRecyclerAdapter<MainListItemData, ListitemMainBinding> {
12   -
13   - private List<MainListItemData> list;
14   -
15   - public MainAdapter(List<MainListItemData> list){
16   - this.list = list;
17   - }
18   -
19   - @Override
20   - public int getLayoutId() {
21   - return R.layout.listitem_main;
22   - }
23   -
24   - @Override
25   - public List<MainListItemData> getList() {
26   - return list;
27   - }
28   -}
app/src/main/java/com/cnlive/libs/demo/MainPageData.java deleted 100644 → 0
1   -package com.cnlive.libs.demo;
2   -
3   -import android.databinding.BaseObservable;
4   -import android.databinding.Bindable;
5   -import android.support.v7.widget.LinearLayoutManager;
6   -
7   -import com.cnlive.libs.demo.databinding.ListitemMainBinding;
8   -
9   -import java.util.Arrays;
10   -import java.util.List;
11   -
12   -/**
13   - * Created by xiansong on 2017/8/30.
14   - */
15   -
16   -public class MainPageData extends BaseObservable {
17   -
18   - private List<MainListItemData> list = Arrays.asList(
19   - new MainListItemData("Title 1"),
20   - new MainListItemData("Title 2"),
21   - new MainListItemData("Title 3"),
22   - new MainListItemData("Title 4"),
23   - new MainListItemData("Title 5"));
24   -
25   - private DataBindingRecyclerAdapter adapter = new DataBindingRecyclerAdapter<MainListItemData, ListitemMainBinding>() {
26   - @Override
27   - public int getLayoutId() {
28   - return R.layout.listitem_main;
29   - }
30   -
31   - @Override
32   - public List<MainListItemData> getList() {
33   - return list;
34   - }
35   - };
36   -
37   - private LinearLayoutManager manager = new LinearLayoutManager(null);
38   -
39   - public List<MainListItemData> getList() {
40   - return list;
41   - }
42   -
43   - public void setList(List<MainListItemData> list) {
44   - this.list = list;
45   - }
46   -
47   - @Bindable
48   - public DataBindingRecyclerAdapter getAdapter() {
49   - return adapter;
50   - }
51   -
52   - public void setAdapter(DataBindingRecyclerAdapter adapter) {
53   - this.adapter = adapter;
54   - notifyPropertyChanged(BR.adapter);
55   - }
56   -
57   - @Bindable
58   - public LinearLayoutManager getManager() {
59   - return manager;
60   - }
61   -
62   - public void setManager(LinearLayoutManager manager) {
63   - this.manager = manager;
64   - notifyPropertyChanged(BR.manager);
65   - }
66   -}
app/src/main/java/com/cnlive/libs/demo/ToastTest.java
... ... @@ -23,8 +23,8 @@ public class ToastTest {
23 23 .setView(R.layout.layout_toast_1, R.id.text);
24 24  
25 25  
26   - public static void test(Context context) {
  26 + public static void showMainToast(Context context,String message) {
27 27 //Toast 调用示例
28   - mainToast.build(context).showToast("Start ~~~");
  28 + mainToast.build(context).showToast(message);
29 29 }
30 30 }
... ...
app/src/main/java/com/cnlive/libs/demo/MainListItemData.java renamed to app/src/main/java/com/cnlive/libs/demo/mvptest/model/LaunchListItemData.java
1   -package com.cnlive.libs.demo;
  1 +package com.cnlive.libs.demo.mvptest.model;
2 2  
3 3 import android.databinding.BaseObservable;
4 4 import android.databinding.Bindable;
  5 +import android.os.Parcel;
  6 +import android.os.Parcelable;
  7 +
  8 +import com.cnlive.libs.demo.BR;
5 9  
6 10 /**
7 11 * Created by xiansong on 2017/8/30.
8 12 */
9 13  
10   -public class MainListItemData extends BaseObservable {
  14 +public class LaunchListItemData extends BaseObservable implements Parcelable {
11 15 private String name;
12 16  
13   - public MainListItemData(String name ){
  17 + public LaunchListItemData(String name ){
14 18 this.name = name;
15 19 }
16 20  
  21 + protected LaunchListItemData(Parcel in) {
  22 + name = in.readString();
  23 + }
  24 +
  25 + @Override
  26 + public void writeToParcel(Parcel dest, int flags) {
  27 + dest.writeString(name);
  28 + }
  29 +
  30 + @Override
  31 + public int describeContents() {
  32 + return 0;
  33 + }
  34 +
  35 + public static final Creator<LaunchListItemData> CREATOR = new Creator<LaunchListItemData>() {
  36 + @Override
  37 + public LaunchListItemData createFromParcel(Parcel in) {
  38 + return new LaunchListItemData(in);
  39 + }
  40 +
  41 + @Override
  42 + public LaunchListItemData[] newArray(int size) {
  43 + return new LaunchListItemData[size];
  44 + }
  45 + };
  46 +
17 47 @Bindable
18 48 public String getName() {
19 49 return name;
... ...
app/src/main/java/com/cnlive/libs/demo/mvptest/model/LaunchPage.java
1 1 package com.cnlive.libs.demo.mvptest.model;
2 2  
3   -import android.databinding.BaseObservable;
4 3 import android.databinding.Bindable;
5 4 import android.os.Parcel;
6   -import android.os.Parcelable;
  5 +import android.support.v7.widget.LinearLayoutManager;
  6 +import android.support.v7.widget.RecyclerView;
7 7 import android.view.View;
8 8  
  9 +import com.cnlive.libs.base.frame.model.ViewStateListData;
9 10 import com.cnlive.libs.demo.BR;
  11 +import com.cnlive.libs.demo.R;
  12 +import com.cnlive.libs.demo.databinding.ListitemMainBinding;
10 13  
11   -public class LaunchPage extends BaseObservable implements Parcelable {
  14 +public class LaunchPage extends ViewStateListData<LaunchListItemData,ListitemMainBinding> {
12 15 private long time = -1;
13 16 private int timing = View.GONE;
14 17 private int loading = View.GONE;
15 18  
  19 + @Override
  20 + public int getLayoutId() {
  21 + return R.layout.listitem_main;
  22 + }
  23 +
  24 + @Override
  25 + public RecyclerView.LayoutManager getLayoutManager() {
  26 + return new LinearLayoutManager(null);
  27 + }
  28 +
16 29 @Bindable
17 30 public long getTime() {
18 31 return time;
... ... @@ -45,26 +58,25 @@ public class LaunchPage extends BaseObservable implements Parcelable {
45 58 }
46 59  
47 60 @Override
48   - public int describeContents() {
49   - return 0;
50   - }
51   -
52   - @Override
53 61 public void writeToParcel(Parcel parcel, int i) {
  62 + super.writeToParcel(parcel, i);
54 63 parcel.writeLong(this.time);
55 64 parcel.writeInt(this.timing);
56 65 parcel.writeInt(this.loading);
57 66 }
58 67  
  68 + @Override
  69 + public void createFromParcel(Parcel in) {
  70 + super.createFromParcel(in);
  71 + this.time = in.readLong();
  72 + this.timing = in.readInt();
  73 + this.loading = in.readInt();
  74 + }
59 75  
60   - public static final Creator<LaunchPage> CREATOR = new Creator<LaunchPage>() {
  76 + public static final Creator<LaunchPage> CREATOR = new Creator<LaunchPage>() {
61 77 @Override
62 78 public LaunchPage createFromParcel(Parcel in) {
63   - LaunchPage target = new LaunchPage();
64   - target.time = in.readLong();
65   - target.timing = in.readInt();
66   - target.loading = in.readInt();
67   - return target;
  79 + return ViewStateListData.newInstance(LaunchPage.class,in);
68 80 }
69 81  
70 82 @Override
... ...
app/src/main/java/com/cnlive/libs/demo/mvptest/ui/activity/LaunchActivity.java
... ... @@ -6,7 +6,9 @@ import android.os.Bundle;
6 6 import android.view.View;
7 7  
8 8 import com.cnlive.libs.base.frame.activity.MvpViewStateBindingActivity;
  9 +import com.cnlive.libs.demo.mvptest.model.LaunchListItemData;
9 10 import com.cnlive.libs.demo.R;
  11 +import com.cnlive.libs.demo.ToastTest;
10 12 import com.cnlive.libs.demo.databinding.ActivityLaunchBinding;
11 13 import com.cnlive.libs.demo.mvptest.frame.presenter.LaunchPresenter;
12 14 import com.cnlive.libs.demo.mvptest.frame.view.LaunchView;
... ... @@ -25,6 +27,11 @@ public class LaunchActivity extends MvpViewStateBindingActivity&lt;LaunchView, Laun
25 27 }
26 28  
27 29 @Override
  30 + protected void onPostCreate(Bundle savedInstanceState) {
  31 + super.onPostCreate(savedInstanceState);
  32 + }
  33 +
  34 + @Override
28 35 protected void onNewIntent(Intent intent) {
29 36 super.onNewIntent(intent);
30 37 }
... ... @@ -48,4 +55,14 @@ public class LaunchActivity extends MvpViewStateBindingActivity&lt;LaunchView, Laun
48 55 public void onNewViewStateInstance() {
49 56 getPresenter().initData(this);
50 57 }
  58 +
  59 + private int index = 1;
  60 + public void onAddItemClick(View view){
  61 + getViewData().getAdapter().addItem(new LaunchListItemData(""+index++));
  62 + getViewData().setTime(getViewData().getAdapter().getItemCount());
  63 + }
  64 +
  65 + public void onMainItemClick(View view) {
  66 + ToastTest.showMainToast(this,((LaunchListItemData)view.getTag()).getName());
  67 + }
51 68 }
... ...
app/src/main/res/layout/activity_launch.xml
... ... @@ -16,6 +16,21 @@
16 16 android:background="#FFc2c4f6"
17 17 tools:context=".mvptest.ui.activity.LaunchActivity">
18 18  
  19 + <Button
  20 + android:layout_width="368dp"
  21 + android:layout_height="wrap_content"
  22 + android:layout_marginBottom="8dp"
  23 + android:layout_marginLeft="8dp"
  24 + android:layout_marginRight="8dp"
  25 + android:layout_marginTop="8dp"
  26 + android:onClick="onAddItemClick"
  27 + android:text="Add Item"
  28 + app:layout_constraintBottom_toBottomOf="parent"
  29 + app:layout_constraintHorizontal_bias="0.0"
  30 + app:layout_constraintLeft_toLeftOf="parent"
  31 + app:layout_constraintRight_toRightOf="parent"
  32 + app:layout_constraintVertical_bias="0.013"
  33 + app:layout_constraintTop_toBottomOf="@+id/textView2" />
19 34 <ProgressBar
20 35 android:id="@+id/progressBar"
21 36 android:layout_width="32dp"
... ... @@ -38,7 +53,8 @@
38 53 android:visibility="@{data.timing}"
39 54 app:layout_constraintRight_toRightOf="parent"
40 55 app:layout_constraintTop_toTopOf="parent"
41   - tools:text="0" />
  56 + tools:text="0"
  57 + android:id="@+id/textView2" />
42 58  
43 59 <View
44 60 android:id="@+id/click"
... ... @@ -51,6 +67,27 @@
51 67 app:layout_constraintBottom_toBottomOf="parent"
52 68 app:layout_constraintLeft_toLeftOf="parent"
53 69 app:layout_constraintRight_toRightOf="parent" />
  70 +
  71 + <android.support.v7.widget.RecyclerView
  72 + android:id="@+id/recyclerView"
  73 + android:layout_width="368dp"
  74 + android:layout_height="200dp"
  75 + android:layout_marginBottom="8dp"
  76 + android:layout_marginEnd="8dp"
  77 + android:layout_marginLeft="8dp"
  78 + android:layout_marginRight="8dp"
  79 + android:layout_marginStart="8dp"
  80 + android:layout_marginTop="8dp"
  81 + app:layout_constraintBottom_toBottomOf="parent"
  82 + app:layout_constraintHorizontal_bias="0.0"
  83 + app:layout_constraintLeft_toLeftOf="parent"
  84 + app:layout_constraintRight_toRightOf="parent"
  85 + app:layout_constraintTop_toTopOf="parent"
  86 + app:layout_constraintVertical_bias="1.0"
  87 +
  88 +
  89 + app:adapter="@{data.adapter}"
  90 + app:layoutManager="@{data.manager}"/>
54 91 </android.support.constraint.ConstraintLayout>
55 92  
56 93 </layout>
... ...
app/src/main/res/layout/activity_main.xml
... ... @@ -7,7 +7,7 @@
7 7  
8 8 <variable
9 9 name="data"
10   - type="com.cnlive.libs.demo.MainPageData" />
  10 + type="String" />
11 11 </data>
12 12  
13 13 <android.support.constraint.ConstraintLayout
... ... @@ -41,25 +41,6 @@
41 41 app:layout_constraintRight_toRightOf="parent"
42 42 app:layout_constraintTop_toTopOf="parent" />
43 43  
44   - <android.support.v7.widget.RecyclerView
45   - android:id="@+id/recyclerView"
46   - android:layout_width="368dp"
47   - android:layout_height="200dp"
48   - android:layout_marginBottom="8dp"
49   - android:layout_marginEnd="8dp"
50   - android:layout_marginLeft="8dp"
51   -
52   - android:layout_marginRight="8dp"
53   - android:layout_marginStart="8dp"
54   - android:layout_marginTop="8dp"
55   - app:adapter="@{data.adapter}"
56   - app:layoutManager="@{data.manager}"
57   - app:layout_constraintBottom_toBottomOf="parent"
58   - app:layout_constraintHorizontal_bias="0.0"
59   - app:layout_constraintLeft_toLeftOf="parent"
60   - app:layout_constraintRight_toRightOf="parent"
61   - app:layout_constraintTop_toTopOf="parent"
62   - app:layout_constraintVertical_bias="1.0" />
63 44  
64 45 </android.support.constraint.ConstraintLayout>
65 46  
... ...
app/src/main/res/layout/listitem_main.xml
1 1 <?xml version="1.0" encoding="utf-8"?>
2   -<layout xmlns:android="http://schemas.android.com/apk/res/android">
  2 +<layout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + xmlns:app="http://schemas.android.com/apk/res-auto">
3 4  
4 5 <data>
5 6  
6 7 <variable
7 8 name="data"
8   - type="com.cnlive.libs.demo.MainListItemData" />
  9 + type="com.cnlive.libs.demo.mvptest.model.LaunchListItemData" />
9 10 </data>
10 11  
11 12 <RelativeLayout
... ... @@ -18,7 +19,9 @@
18 19 android:layout_centerVertical="true"
19 20 android:onClick="onMainItemClick"
20 21 android:padding="8dp"
21   - android:text="@{data.name}" />
  22 +
  23 + android:text="@{data.name}"
  24 + app:tag="@{data}" />
22 25  
23 26 </RelativeLayout>
24 27  
... ...
cnlive/build.gradle
... ... @@ -35,6 +35,7 @@ android {
35 35  
36 36 dependencies {
37 37 compile fileTree(include: ['*.jar'], dir: 'libs')
  38 + compile 'com.android.support:recyclerview-v7:26.+'
38 39 //MVP
39 40 compile 'com.hannesdorfmann.mosby3:mvp:3.0.4'
40 41 compile 'com.hannesdorfmann.mosby3:viewstate:3.0.4'
... ...
cnlive/from_installv1.gradle
... ... @@ -41,7 +41,7 @@ install {
41 41 List list = new ArrayList()
42 42 pom.dependencies.findAll {
43 43 dep ->
44   - dep.groupId == rootProject.name
  44 + dep.groupId == rootProject.name || dep.groupId == 'com.android.support'
45 45 }.collect {
46 46 dep ->
47 47 list.add(dep)
... ...
app/src/main/java/com/cnlive/libs/demo/DataBindingRecyclerAdapter.java renamed to cnlive/src/main/java/com/cnlive/libs/base/frame/adapter/DataBindingRecyclerAdapter.java
1   -package com.cnlive.libs.demo;
  1 +package com.cnlive.libs.base.frame.adapter;
  2 +
  3 +/**
  4 + * Created by xiansong on 2017/9/1.
  5 + */
2 6  
3 7 import android.databinding.DataBindingUtil;
4 8 import android.databinding.ViewDataBinding;
... ... @@ -14,6 +18,23 @@ import java.util.List;
14 18  
15 19 public abstract class DataBindingRecyclerAdapter<D, T extends ViewDataBinding> extends RecyclerView.Adapter<DataBindingRecyclerAdapter<D, T>.DataBindingViewHolder> {
16 20  
  21 + class DataBindingViewHolder extends RecyclerView.ViewHolder {
  22 +
  23 + private ViewDataBinding binding;
  24 +
  25 + private DataBindingViewHolder(View itemView) {
  26 + super(itemView);
  27 + }
  28 +
  29 + public void setBinding(ViewDataBinding binding) {
  30 + this.binding = binding;
  31 + }
  32 +
  33 + public ViewDataBinding getBinding() {
  34 + return binding;
  35 + }
  36 + }
  37 +
17 38 public abstract int getLayoutId();
18 39  
19 40 public abstract List<D> getList();
... ... @@ -32,26 +53,51 @@ public abstract class DataBindingRecyclerAdapter&lt;D, T extends ViewDataBinding&gt; e
32 53 holder.binding.executePendingBindings();
33 54 }
34 55  
  56 + public D getItem(int location) {
  57 + return getList().get(location);
  58 + }
  59 +
35 60 @Override
36 61 public int getItemCount() {
37   - return getList().size();
  62 + return getList() == null ? 0 : getList().size();
38 63 }
39 64  
40   - public class DataBindingViewHolder extends RecyclerView.ViewHolder {
  65 + public void addItem(D item) {
  66 + if (item == null) return;
  67 + getList().add(getList().size(), item);
  68 + notifyItemInserted(getList().size());
  69 + }
41 70  
42   - private ViewDataBinding binding;
  71 + public void addItems(List<D> items) {
  72 + if (items == null) return;
  73 + this.getList().addAll(items);
  74 + notifyDataSetChanged();
  75 + }
43 76  
44   - public DataBindingViewHolder(View itemView) {
45   - super(itemView);
46   - }
  77 + public boolean containsAll(List<D> items) {
  78 + return getList().containsAll(items);
  79 + }
47 80  
48   - public void setBinding(ViewDataBinding binding) {
49   - this.binding = binding;
50   - }
  81 + public void updateItem(D tasks, int position) {
  82 + if (tasks == null) return;
  83 + getList().set(position, tasks);
  84 + notifyItemChanged(position);
  85 + }
51 86  
52   - public ViewDataBinding getBinding() {
53   - return binding;
54   - }
  87 + public void updateItems(List<D> items) {
  88 + if (items == null) return;
  89 + this.getList().clear();
  90 + this.getList().addAll(items);
  91 + notifyDataSetChanged();
  92 + }
  93 +
  94 + public void removeItem(int index) {
  95 + getList().remove(index);
  96 + notifyItemRemoved(index);
  97 + }
55 98  
  99 + public void removeAllItems() {
  100 + getList().clear();
  101 + notifyDataSetChanged();
56 102 }
57 103 -}
  104 +}
58 105 \ No newline at end of file
... ...
cnlive/src/main/java/com/cnlive/libs/base/frame/model/ViewStateListData.java 0 → 100644
  1 +package com.cnlive.libs.base.frame.model;
  2 +
  3 +import android.databinding.BaseObservable;
  4 +import android.databinding.Bindable;
  5 +import android.databinding.ViewDataBinding;
  6 +import android.os.Parcel;
  7 +import android.os.Parcelable;
  8 +import android.support.v7.widget.LinearLayoutManager;
  9 +import android.support.v7.widget.RecyclerView;
  10 +
  11 +import com.cnlive.libs.base.frame.adapter.DataBindingRecyclerAdapter;
  12 +import com.cnlive.libs.base.util.LogUtil;
  13 +
  14 +import java.util.ArrayList;
  15 +import java.util.List;
  16 +
  17 +/**
  18 + * Created by xiansong on 2017/9/1.
  19 + */
  20 +
  21 +public abstract class ViewStateListData<ITEM extends BaseObservable, BINDING extends ViewDataBinding> extends BaseObservable implements Parcelable {
  22 +
  23 + private static final String TAG = "PageListData";
  24 +
  25 + public static <T extends ViewStateListData<ITEM, BINDING>, ITEM extends BaseObservable, BINDING extends ViewDataBinding> T newInstance(Class<T> clazz, Parcel in) {
  26 + T data = null;
  27 + try {
  28 + data = clazz.newInstance();
  29 + data.createFromParcel(in);
  30 + } catch (Exception e) {
  31 + LogUtil.e(TAG, "Presenter or data need to implement the default constructor: constructor ()", e);
  32 + }
  33 + return data;
  34 + }
  35 +
  36 + public abstract int getLayoutId();
  37 +
  38 + public abstract RecyclerView.LayoutManager getLayoutManager();
  39 +
  40 + private List<ITEM> list = new ArrayList<>();
  41 +
  42 + private RecyclerView.LayoutManager manager = getLayoutManager();
  43 +
  44 + private DataBindingRecyclerAdapter<ITEM, BINDING> adapter = new DataBindingRecyclerAdapter<ITEM, BINDING>() {
  45 + @Override
  46 + public int getLayoutId() {
  47 + return ViewStateListData.this.getLayoutId();
  48 + }
  49 +
  50 + @Override
  51 + public List<ITEM> getList() {
  52 + return list;
  53 + }
  54 + };
  55 +
  56 + @Bindable
  57 + public DataBindingRecyclerAdapter<ITEM, BINDING> getAdapter() {
  58 + return adapter;
  59 + }
  60 +
  61 + public void setAdapter(DataBindingRecyclerAdapter<ITEM, BINDING> adapter) {
  62 + this.adapter = adapter;
  63 + notifyPropertyChanged(com.cnlive.libs.base.BR.adapter);
  64 + }
  65 +
  66 + @Bindable
  67 + public RecyclerView.LayoutManager getManager() {
  68 + return manager;
  69 + }
  70 +
  71 + public void setManager(LinearLayoutManager manager) {
  72 + this.manager = manager;
  73 + notifyPropertyChanged(com.cnlive.libs.base.BR.manager);
  74 + }
  75 +
  76 + @Override
  77 + public int describeContents() {
  78 + return 0;
  79 + }
  80 +
  81 + @Override
  82 + public void writeToParcel(Parcel parcel, int i) {
  83 + parcel.writeList(this.list);
  84 + }
  85 +
  86 + public void createFromParcel(Parcel in) {
  87 + in.readList(list, getClass().getClassLoader());
  88 + }
  89 +
  90 +}
... ...