Android shares a BaseAdapter, getView () multiple loading method, and baseadaptergetview
I. Introduction to BaseAdapter
BaseAdapter is a list of listview, gridview, and other data adapters. It is mainly used to transmit a set of data to UI display components such as ListView, Spinner, Gallery, and GridView, if there are too many data items in the listView list, such as 1000 items, if we put all these 1000 Items in the interface, the software directly overflows the memory. BaseAdapter can help us solve this problem just now, the working principle of BaseAdapter is as follows:
We can see that if we have 1000 data items, only 7 items are actually displayed, and other items are cached in Recycler. Recycler is similar to a message pair column and is used to save data items not displayed on the ui, if the top (or bottom) slides out from the listView interface through scrolling, the Recycler adds the data item to the Message pair column. For example, the first item has slipped out from the interface, when the first item slides in again, android will determine whether the first item has been loaded. If so, re-set the data source of the first item and display it. When a data item is loaded for the first time, slide up, or slide down, the getView () method is called. However, in many cases, the getView () method is called multiple times, multiple calls will refresh the interface multiple times, and the performance will be reduced, for example, the interface will be stuck.
/** @ Params position: the subscript of the data to be displayed. Starting from 0, @ params view displays the View @ ViewGroup View group */public view getView (int position, view View, viewGroup viewGroup)
Ii. Solution
1: Common online methods
<ListView android:id="@+id/lv_messages" android:layout_width="fill_parent" android:layout_height="fill_parent" ></ListView>
The reason why a VIew is executed multiple times on the internet is that, when a view is displayed, the VIew height is measured and the measure method is executed. As a result, the getView is executed multiple times, but the listView is nested in the ScrollView, the getView () method of BaseAdapter is called multiple times.
2: override the onMeasure and onLayout methods of ListView.
I override the onMeasure and onLayout methods of ListView, define a variable boolean isOnMeasure = false, and then determine whether to load the interface for the first time in the getView method of BastAdapter, this method is used to solve this problem.
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { isOnMeasure = true; int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { isOnMeasure = false; super.onLayout(changed, l, t, r, b); }
Iii. complete code
1: override listView
public class ScrollListView extends ListView { private boolean isOnMeasure; public boolean isMeasure() { return isOnMeasure; } public ScrollListView(Context context) { super(context); } public ScrollListView(Context context, AttributeSet attrs) { super(context, attrs); } public ScrollListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { isOnMeasure = true; int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec);// super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { isOnMeasure = false; super.onLayout(changed, l, t, r, b); }}
2: xml of activity
<view.ScrollListView android:id="@+id/orderGoodsList" style="@style/list_normal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@id/line3" android:background="@color/gray_f2" android:divider="@color/gray_f2" android:dividerHeight="1dip" ></view.ScrollListView>
3: adapter code
Protected ViewGroup viewGroup; @ Override public void initData (View view, Object viewHolder, int position) {if (! (BaseGridView) viewGroup). isMeasure () {// The first time loading, processing Interface ui} else {// not the first loading, not processing anything }}
If you have a better method, please share your method. Thank you!