亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android 安卓自定義listview實現下拉刷新

發布時間:2020-06-20 03:35:02 來源:網絡 閱讀:404 作者:careylwq 欄目:移動開發

【1】、重寫listView

public class MyListView extends ListView implements OnScrollListener {  
  
    private final static int RELEASE_To_REFRESH = 0;// 下拉過程的狀態值  
    private final static int PULL_To_REFRESH = 1; // 從下拉返回到不刷新的狀態值  
    private final static int REFRESHING = 2;// 正在刷新的狀態值  
    private final static int DONE = 3;  
    private final static int LOADING = 4;  
  
    // 實際的padding的距離與界面上偏移距離的比例  
    private final static int RATIO = 3;  
    private LayoutInflater inflater;  
  
    // ListView頭部下拉刷新的布局  
    private LinearLayout headerView;  
    private TextView lvHeaderTipsTv;  
    private TextView lvHeaderLastUpdatedTv;  
    private ImageView lvHeaderArrowIv;  
    private ProgressBar lvHeaderProgressBar;  
  
    // 定義頭部下拉刷新的布局的高度  
    private int headerContentHeight;  
  
    private RotateAnimation animation;  
    private RotateAnimation reverseAnimation;  
  
    private int startY;  
    private int state;  
    private boolean isBack;  
  
    // 用于保證startY的值在一個完整的touch事件中只被記錄一次  
    private boolean isRecored;  
  
    private OnRefreshListener refreshListener;  
  
    private boolean isRefreshable;  
  
    public MyListView(Context context) {  
        super(context);  
        init(context);  
    }  
  
    public MyListView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        init(context);  
    }  
  
    private void init(Context context) {  
        setCacheColorHint(context.getResources().getColor(R.color.transparent));  
        inflater = LayoutInflater.from(context);  
        headerView = (LinearLayout) inflater.inflate(R.layout.lv_header, null);  
        lvHeaderTipsTv = (TextView) headerView  
                .findViewById(R.id.lvHeaderTipsTv);  
        lvHeaderLastUpdatedTv = (TextView) headerView  
                .findViewById(R.id.lvHeaderLastUpdatedTv);  
  
        lvHeaderArrowIv = (ImageView) headerView  
                .findViewById(R.id.lvHeaderArrowIv);  
        // 設置下拉刷新圖標的最小高度和寬度  
        lvHeaderArrowIv.setMinimumWidth(70);  
        lvHeaderArrowIv.setMinimumHeight(50);  
  
        lvHeaderProgressBar = (ProgressBar) headerView  
                .findViewById(R.id.lvHeaderProgressBar);  
        measureView(headerView);  
        headerContentHeight = headerView.getMeasuredHeight();  
        // 設置內邊距,正好距離頂部為一個負的整個布局的高度,正好把頭部隱藏  
        headerView.setPadding(0, -1 * headerContentHeight, 0, 0);  
        // 重繪一下  
        headerView.invalidate();  
        // 將下拉刷新的布局加入ListView的頂部  
        addHeaderView(headerView, null, false);  
        // 設置滾動監聽事件  
        setOnScrollListener(this);  
  
        // 設置旋轉動畫事件  
        animation = new RotateAnimation(0, -180,  
                RotateAnimation.RELATIVE_TO_SELF, 0.5f,  
                RotateAnimation.RELATIVE_TO_SELF, 0.5f);  
        animation.setInterpolator(new LinearInterpolator());  
        animation.setDuration(250);  
        animation.setFillAfter(true);  
  
        reverseAnimation = new RotateAnimation(-180, 0,  
                RotateAnimation.RELATIVE_TO_SELF, 0.5f,  
                RotateAnimation.RELATIVE_TO_SELF, 0.5f);  
        reverseAnimation.setInterpolator(new LinearInterpolator());  
        reverseAnimation.setDuration(200);  
        reverseAnimation.setFillAfter(true);  
  
        // 一開始的狀態就是下拉刷新完的狀態,所以為DONE  
        state = DONE;  
        // 是否正在刷新  
        isRefreshable = false;  
    }  
  
    @Override  
    public void onScrollStateChanged(AbsListView view, int scrollState) {  
  
    }  
  
    @Override  
    public void onScroll(AbsListView view, int firstVisibleItem,  
            int visibleItemCount, int totalItemCount) {  
                if (firstVisibleItem == 0) {  
                    isRefreshable = true;  
                 } else {  
                    isRefreshable = false;  
                 }     
        }  
  
    @Override  
    public boolean onTouchEvent(MotionEvent ev) {  
        if (isRefreshable) {  
            switch (ev.getAction()) {  
            case MotionEvent.ACTION_DOWN:  
                if (!isRecored) {  
                    isRecored = true;  
                    startY = (int) ev.getY();// 手指按下時記錄當前位置  
                }  
                break;  
            case MotionEvent.ACTION_UP:  
                if (state != REFRESHING && state != LOADING) {  
                    if (state == PULL_To_REFRESH) {  
                        state = DONE;  
                        changeHeaderViewByState();  
                    }  
                    if (state == RELEASE_To_REFRESH) {  
                        state = REFRESHING;  
                        changeHeaderViewByState();  
                        onLvRefresh();  
                    }  
                }  
                isRecored = false;  
                isBack = false;  
  
                break;  
  
            case MotionEvent.ACTION_MOVE:  
                int tempY = (int) ev.getY();  
                if (!isRecored) {  
                    isRecored = true;  
                    startY = tempY;  
                }  
                if (state != REFRESHING && isRecored && state != LOADING) {  
                    // 保證在設置padding的過程中,當前的位置一直是在head,否則如果當列表超出屏幕的話,當在上推的時候,列表會同時進行滾動  
                    // 可以松手去刷新了  
                    if (state == RELEASE_To_REFRESH) {  
                        setSelection(0);  
                        // 往上推了,推到了屏幕足夠掩蓋head的程度,但是還沒有推到全部掩蓋的地步  
                        if (((tempY - startY) / RATIO < headerContentHeight)// 由松開刷新狀態轉變到下拉刷新狀態  
                                && (tempY - startY) > 0) {  
                            state = PULL_To_REFRESH;  
                            changeHeaderViewByState();  
                        }  
                        // 一下子推到頂了  
                        else if (tempY - startY <= 0) {// 由松開刷新狀態轉變到done狀態  
                            state = DONE;  
                            changeHeaderViewByState();  
                        }  
                    }  
                    // 還沒有到達顯示松開刷新的時候,DONE或者是PULL_To_REFRESH狀態  
                    if (state == PULL_To_REFRESH) {  
                        setSelection(0);  
                        // 下拉到可以進入RELEASE_TO_REFRESH的狀態  
                        if ((tempY - startY) / RATIO >= headerContentHeight) {// 由done或者下拉刷新狀態轉變到松開刷新  
                            state = RELEASE_To_REFRESH;  
                            isBack = true;  
                            changeHeaderViewByState();  
                        }  
                        // 上推到頂了  
                        else if (tempY - startY <= 0) {// 由DOne或者下拉刷新狀態轉變到done狀態  
                            state = DONE;  
                            changeHeaderViewByState();  
                        }  
                    }  
                    // done狀態下  
                    if (state == DONE) {  
                        if (tempY - startY > 0) {  
                            state = PULL_To_REFRESH;  
                            changeHeaderViewByState();  
                        }  
                    }  
                    // 更新headView的size  
                    if (state == PULL_To_REFRESH) {  
                        headerView.setPadding(0, -1 * headerContentHeight  
                                + (tempY - startY) / RATIO, 0, 0);  
  
                    }  
                    // 更新headView的paddingTop  
                    if (state == RELEASE_To_REFRESH) {  
                        headerView.setPadding(0, (tempY - startY) / RATIO  
                                - headerContentHeight, 0, 0);  
                    }  
  
                }  
                break;  
  
            default:  
                break;  
            }  
        }  
        return super.onTouchEvent(ev);  
    }  
  
    // 當狀態改變時候,調用該方法,以更新界面  
    private void changeHeaderViewByState() {  
        switch (state) {  
        case RELEASE_To_REFRESH:  
            lvHeaderArrowIv.setVisibility(View.VISIBLE);  
            lvHeaderProgressBar.setVisibility(View.GONE);  
            lvHeaderTipsTv.setVisibility(View.VISIBLE);  
            lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE);  
  
            lvHeaderArrowIv.clearAnimation();// 清除動畫  
            lvHeaderArrowIv.startAnimation(animation);// 開始動畫效果  
  
            lvHeaderTipsTv.setText("松開刷新");  
            break;  
        case PULL_To_REFRESH:  
            lvHeaderProgressBar.setVisibility(View.GONE);  
            lvHeaderTipsTv.setVisibility(View.VISIBLE);  
            lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE);  
            lvHeaderArrowIv.clearAnimation();  
            lvHeaderArrowIv.setVisibility(View.VISIBLE);  
            // 是由RELEASE_To_REFRESH狀態轉變來的  
            if (isBack) {  
                isBack = false;  
                lvHeaderArrowIv.clearAnimation();  
                lvHeaderArrowIv.startAnimation(reverseAnimation);  
  
                lvHeaderTipsTv.setText("下拉刷新");  
            } else {  
                lvHeaderTipsTv.setText("下拉刷新");  
            }  
            break;  
  
        case REFRESHING:  
  
            headerView.setPadding(0, 0, 0, 0);  
  
            lvHeaderProgressBar.setVisibility(View.VISIBLE);  
            lvHeaderArrowIv.clearAnimation();  
            lvHeaderArrowIv.setVisibility(View.GONE);  
            lvHeaderTipsTv.setText("正在刷新...");  
            lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE);  
            break;  
        case DONE:  
            headerView.setPadding(0, -1 * headerContentHeight, 0, 0);  
  
            lvHeaderProgressBar.setVisibility(View.GONE);  
            lvHeaderArrowIv.clearAnimation();  
            lvHeaderArrowIv.setImageResource(R.drawable.arrow);  
            lvHeaderTipsTv.setText("下拉刷新");  
            lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE);  
            break;  
        }  
    }  
  
    // 此方法直接照搬自網絡上的一個下拉刷新的demo,此處是“估計”headView的width以及height  
    private void measureView(View child) {  
        ViewGroup.LayoutParams params = child.getLayoutParams();  
        if (params == null) {  
            params = new ViewGroup.LayoutParams(  
                    ViewGroup.LayoutParams.FILL_PARENT,  
                    ViewGroup.LayoutParams.WRAP_CONTENT);  
        }  
        int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0,  
                params.width);  
        int lpHeight = params.height;  
        int childHeightSpec;  
        if (lpHeight > 0) {  
            childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,  
                    MeasureSpec.EXACTLY);  
        } else {  
            childHeightSpec = MeasureSpec.makeMeasureSpec(0,  
                    MeasureSpec.UNSPECIFIED);  
        }  
        child.measure(childWidthSpec, childHeightSpec);  
    }  
  
    public void setonRefreshListener(OnRefreshListener refreshListener) {  
        this.refreshListener = refreshListener;  
        isRefreshable = true;  
    }  
  
    public interface OnRefreshListener {  
        public void onRefresh();  
    }  
  
    public void onRefreshComplete() {  
        state = DONE;  
        lvHeaderLastUpdatedTv.setText("最近更新:" + new Date().toLocaleString());  
        changeHeaderViewByState();  
    }  
  
    private void onLvRefresh() {  
        if (refreshListener != null) {  
            refreshListener.onRefresh();  
        }  
    }  
  
    public void setAdapter(BaseAdapter  adapter) {  
        lvHeaderLastUpdatedTv.setText("最近更新:" + new Date().toLocaleString());  
        super.setAdapter(adapter);  
    }  
  
}

【2】刷新頭部xml文件lv_header.xml

<?xml version="1.0" encoding="utf-8"?>  
<!-- ListView的頭部 -->  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:background="#000000" >  
  
    <!-- 內容 -->  
  
    <RelativeLayout  
        android:id="@+id/head_contentLayout"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:paddingLeft="30dp" >  
  
        <!-- 箭頭圖像、進度條 -->  
  
        <FrameLayout  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_alignParentLeft="true"  
            android:layout_centerVertical="true" >  
  
            <!-- 箭頭 -->  
  
            <ImageView  
                android:id="@+id/lvHeaderArrowIv"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:layout_gravity="center"  
                android:src="@drawable/arrow" />  
  
            <!-- 進度條 -->  
  
            <ProgressBar  
                android:id="@+id/lvHeaderProgressBar"  
                  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:layout_gravity="center"  
                android:visibility="gone" />  
        </FrameLayout>  
  
        <!-- 提示、最近更新 -->  
  
        <LinearLayout  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_centerHorizontal="true"  
            android:gravity="center_horizontal"  
            android:orientation="vertical" >  
  
            <!-- 提示 -->  
  
            <TextView  
                android:id="@+id/lvHeaderTipsTv"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:text="下拉刷新"  
                android:textColor="@color/white"  
                android:textSize="20sp" />  
  
            <!-- 最近更新 -->  
  
            <TextView  
                android:id="@+id/lvHeaderLastUpdatedTv"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:text="上次更新"  
                android:textColor="@color/gold"  
                android:textSize="10sp" />  
        </LinearLayout>  
    </RelativeLayout>  
  
</LinearLayout>

【3】調用方法

 adapter = new LvAdapter(list, this);  
        lv.setAdapter(adapter);  
  
        lv.setonRefreshListener(new OnRefreshListener() {  
  
            @Override  
            public void onRefresh() {  
                new AsyncTask<Void, Void, Void>() {  
                    protected Void doInBackground(Void... params) {  
                        try {  
                            Thread.sleep(1000);  
                        } catch (Exception e) {  
                            e.printStackTrace();  
                        }  
                        list.add("刷新后添加的內容");  
                        return null;  
                    }  
  
                    @Override  
                    protected void onPostExecute(Void result) {  
                        adapter.notifyDataSetChanged();  
                        lv.onRefreshComplete();  
                    }  
                }.execute(null, null, null);  
            }  
        });  
    }



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

拜泉县| 深圳市| 长兴县| 酉阳| 宁远县| 临邑县| 封丘县| 双鸭山市| 维西| 金乡县| 仪征市| 河南省| 奇台县| 新民市| 宜章县| 犍为县| 子洲县| 阿瓦提县| 阿巴嘎旗| 敦化市| 彭泽县| 霞浦县| 朝阳市| 三明市| 吉林省| 浪卡子县| 乌海市| 卓资县| 阆中市| 东宁县| 昭苏县| 惠来县| 博客| 漯河市| 永德县| 肥西县| 定兴县| 汉川市| 山阳县| 东丰县| 固镇县|