lmw
2023-03-11 4df5bb59e5fe9f9d140e5610f7772dd8a05a28d4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package cn.sinata.xldutils.adapter;
 
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
 
import androidx.viewpager.widget.PagerAdapter;
 
/**
 * A {@link PagerAdapter} which behaves like an {@link android.widget.Adapter} with view types and
 * view recycling.
 */
public abstract class BaseRecyclingPagerAdapter extends PagerAdapter {
  static final int IGNORE_ITEM_VIEW_TYPE = AdapterView.ITEM_VIEW_TYPE_IGNORE;
 
  private final RecycleBin recycleBin;
 
  public BaseRecyclingPagerAdapter() {
    this(new RecycleBin());
  }
 
  BaseRecyclingPagerAdapter(RecycleBin recycleBin) {
    this.recycleBin = recycleBin;
    recycleBin.setViewTypeCount(getViewTypeCount());
  }
 
  @Override public void notifyDataSetChanged() {
    recycleBin.scrapActiveViews();
    super.notifyDataSetChanged();
  }
 
  @Override public final Object instantiateItem(ViewGroup container, int position) {
    int viewType = getItemViewType(position);
    View view = null;
    if (viewType != IGNORE_ITEM_VIEW_TYPE) {
      view = recycleBin.getScrapView(position, viewType);
    }
    view = getView(position, view, container);
    container.addView(view);
    return view;
  }
 
  @Override public final void destroyItem(ViewGroup container, int position, Object object) {
    View view = (View) object;
    container.removeView(view);
    int viewType = getItemViewType(position);
    if (viewType != IGNORE_ITEM_VIEW_TYPE) {
      recycleBin.addScrapView(view, position, viewType);
    }
  }
 
  @Override public final boolean isViewFromObject(View view, Object object) {
    return view == object;
  }
 
  /**
   * <p>
   * Returns the number of types of Views that will be created by
   * {@link #getView}. Each type represents a set of views that can be
   * converted in {@link #getView}. If the adapter always returns the same
   * type of View for all items, this method should return 1.
   * </p>
   * <p>
   * This method will only be called when when the adapter is set on the
   * the {@link AdapterView}.
   * </p>
   *
   * @return The number of types of Views that will be created by this adapter
   */
  public int getViewTypeCount() {
    return 1;
  }
 
  /**
   * Get the type of View that will be created by {@link #getView} for the specified item.
   *
   * @param position The position of the item within the adapter's data set whose view type we
   *        want.
   * @return An integer representing the type of View. Two views should share the same type if one
   *         can be converted to the other in {@link #getView}. Note: Integers must be in the
   *         range 0 to {@link #getViewTypeCount} - 1. {@link #IGNORE_ITEM_VIEW_TYPE} can
   *         also be returned.
   * @see #IGNORE_ITEM_VIEW_TYPE
   */
  public int getItemViewType(int position) {
    return 0;
  }
 
  /**
   * Get a View that displays the data at the specified position in the data set. You can either
   * create a View manually or inflate it from an XML layout file. When the View is inflated, the
   * parent View (GridView, ListView...) will apply default layout parameters unless you use
   * {@link android.view.LayoutInflater#inflate(int, ViewGroup, boolean)}
   * to specify a root view and to prevent attachment to the root.
   *
   * @param position The position of the item within the adapter's data set of the item whose view
   *        we want.
   * @param convertView The old view to reuse, if possible. Note: You should check that this view
   *        is non-null and of an appropriate type before using. If it is not possible to convert
   *        this view to display the correct data, this method can create a new view.
   *        Heterogeneous lists can specify their number of view types, so that this View is
   *        always of the right type (see {@link #getViewTypeCount()} and
   *        {@link #getItemViewType(int)}).
   * @param container The parent that this view will eventually be attached to
   * @return A View corresponding to the data at the specified position.
   */
  public abstract View getView(int position, View convertView, ViewGroup container);
}