Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 【Android】Listview返回頂部,快速返回頂部的功能實現,詳解代碼。

【Android】Listview返回頂部,快速返回頂部的功能實現,詳解代碼。

編輯:關於Android編程

首先給大家看一下我們今天這個最終實現的效果圖:
這裡寫圖片描述
我這裡只是單純的實現了ListView返回頂部的功能。具體效果大家可以適當地美化
在實際項目中可以換圖標,去掉右側滾動條等。具體ui美化不做解釋。
好了,首先我們是當不在頂部的時候,返回頂部按鈕就會出現,而到頂部之後就會隱藏此按鈕,所以我們這裡就要算Listview的滑動偏移量,當然,有這個返回頂部按鈕,而且一直顯示在底部,所以當然用相對布局了。先給大家看一下xml布局源碼比較簡單:


    

然後我們需要一個獲取屏幕的一個工具類,這裡我封裝好了,:

package davidtotoplistview.qq986945193.davidtotoplistview.davidtotoplistview;

import android.content.Context;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;

/**
 * @author :程序員小冰
 * @新浪微博 :http://weibo.com/mcxiaobing
 * @GitHub: https://github.com/QQ986945193
 * @CSDN博客: http://blog.csdn.net/qq_21376985
 * @碼雲OsChina :http://git.oschina.net/MCXIAOBING
 */
public class ScreenUtil {

    /**
     * 獲取屏幕的寬度
     * 
     * @param context
     * @return
     */
    public static int getScreenWidth(Context context) {
        WindowManager manager = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        Display display = manager.getDefaultDisplay();

        return display.getWidth();
    }

    /**
     * 獲取屏幕的高度
     * 
     * @param context
     * @return
     */
    public static int getScreenHeight(Context context) {
        WindowManager manager = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        Display display = manager.getDefaultDisplay();
        return display.getHeight();
    }

    /**
     * 獲取屏幕中控件頂部位置的高度--即控件頂部的Y點
     * 
     * @return
     */
    public static int getScreenViewTopHeight(View view) {
        return view.getTop();
    }

    /**
     * 獲取屏幕中控件底部位置的高度--即控件底部的Y點
     * 
     * @return
     */
    public static int getScreenViewBottomHeight(View view) {
        return view.getBottom();
    }

    /**
     * 獲取屏幕中控件左側的位置--即控件左側的X點
     * 
     * @return
     */
    public static int getScreenViewLeftHeight(View view) {
        return view.getLeft();
    }

    /**
     * 獲取屏幕中控件右側的位置--即控件右側的X點
     * 
     * @return
     */
    public static int getScreenViewRightHeight(View view) {
        return view.getRight();
    }

}

好了,然後我們需要一個adapter,就是現實列表的一個簡單的textview

package davidtotoplistview.qq986945193.davidtotoplistview.davidtotoplistview;

import java.util.List;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

/**
 * @author :程序員小冰
 * @新浪微博 :http://weibo.com/mcxiaobing
 * @GitHub: https://github.com/QQ986945193
 * @CSDN博客: http://blog.csdn.net/qq_21376985
 * @碼雲OsChina :http://git.oschina.net/MCXIAOBING
 *
 * listview所需要的adapter
 */
public class MyAdapter extends BaseAdapter {

    private List mTitleArray;// 標題數組
    private LayoutInflater inflater;

    /**
     * 構造方法
     *
     * @param context    // 上下文對象
     * @param titleArray // 標題數組
     */
    public MyAdapter(Context context, List titleArray) {
        this.mTitleArray = titleArray;
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    /**
     * 獲取Item總數
     */
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        if (mTitleArray != null) {
            return mTitleArray.size();
        } else {
            return 0;
        }
    }

    /**
     * 獲取一個Item對象
     */
    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        if (mTitleArray != null) {
            return mTitleArray.get(position);
        } else {
            return null;
        }
    }

    /**
     * 獲取指定item的ID
     */
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder holder = null;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.item_layout, null);
            holder.mTitleTv = (TextView) convertView
                    .findViewById(R.id.title_tv);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.mTitleTv.setText(mTitleArray.get(position));
        return convertView;
    }

    private class ViewHolder {
        private TextView mTitleTv;
    }

}

ok,現在基本上工具都做好了,開始實現我們的重要的部分,實現返回頂部:

package davidtotoplistview.qq986945193.davidtotoplistview.davidtotoplistview;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

/**
 * @author :程序員小冰
 * @新浪微博 :http://weibo.com/mcxiaobing
 * @GitHub: https://github.com/QQ986945193
 * @CSDN博客: http://blog.csdn.net/qq_21376985
 * @碼雲OsChina :http://git.oschina.net/MCXIAOBING
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private ListView myListView;
    private Button topBtn;

    private MyAdapter adapter;
    private boolean scrollFlag = false;// 標記是否滑動
    private int lastVisibleItemPosition = 0;// 標記上次滑動位置

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myListView = (ListView) findViewById(R.id.my_listView);
        topBtn = (Button) findViewById(R.id.top_btn);

        adapter = new MyAdapter(this, getTitleDatas());
        myListView.setAdapter(adapter);

        topBtn.setOnClickListener(this);
        myListView.setOnScrollListener(new AbsListView.OnScrollListener() {

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                // TODO Auto-generated method stub
                switch (scrollState) {
                    // 當不滾動時
                    case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:// 是當屏幕停止滾動時
                        scrollFlag = false;
                        // 判斷滾動到底部
                        if (myListView.getLastVisiblePosition() == (myListView
                                .getCount() - 1)) {
                            topBtn.setVisibility(View.VISIBLE);
                        }
                        // 判斷滾動到頂部
                        if (myListView.getFirstVisiblePosition() == 0) {
                            topBtn.setVisibility(View.GONE);
                        }

                        break;
                    case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:// 滾動時
                        scrollFlag = true;
                        break;
                    case AbsListView.OnScrollListener.SCROLL_STATE_FLING:// 是當用戶由於之前劃動屏幕並抬起手指,屏幕產生慣性滑動時
                        scrollFlag = false;
                        break;
                }
            }

            /**
             * firstVisibleItem:當前能看見的第一個列表項ID(從0開始)
             * visibleItemCount:當前能看見的列表項個數(小半個也算) totalItemCount:列表項共數
             * CSDN博客: http://blog.csdn.net/qq_21376985
             */
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                                 int visibleItemCount, int totalItemCount) {
                // 當開始滑動且ListView底部的Y軸點超出屏幕最大范圍時,顯示或隱藏頂部按鈕
                if (scrollFlag
                        && ScreenUtil.getScreenViewBottomHeight(myListView) >= ScreenUtil
                        .getScreenHeight(MainActivity.this)) {
                    if (firstVisibleItem > lastVisibleItemPosition) {// 上滑
                        topBtn.setVisibility(View.VISIBLE);
                    } else if (firstVisibleItem < lastVisibleItemPosition) {// 下滑
                        topBtn.setVisibility(View.GONE);
                    } else {
                        return;
                    }
                    lastVisibleItemPosition = firstVisibleItem;
                }
            }
        });
    }

    /**
     * 獲取標題數據列表
     *
     * @return
     */
    private List getTitleDatas() {
        List titleArray = new ArrayList();
        for (int i = 0; i < 30; i++) {
            titleArray.add("程序員小冰" + i + "個item");
        }
        return titleArray;
    }

    /**
     * 滾動ListView到指定位置
     *
     * @param pos
     */
    private void setListViewPos(int pos) {
        if (android.os.Build.VERSION.SDK_INT >= 8) {
            myListView.smoothScrollToPosition(pos);
        } else {
            myListView.setSelection(pos);
        }
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
            case R.id.top_btn:// 點擊按鈕返回到ListView的第一項
                setListViewPos(0);
                break;
        }
    }

}

好了,教程到此結束。如果此文章幫到了你,歡迎點贊。

(AndroidStudio版)github下載地址:
https://github.com/QQ986945193/DavidToTopListView

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved