編輯:關於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
SEAndroid安全機制框架分析
我們知道,Android系統基於Linux實現。針對傳統Linux系統,NSA開發了一套安全機制SELinux,用來加強安全性。然而,由於Android系統有著獨特的用戶
靈活使用Android中ActionBar和ViewPager切換頁面
本文實例講述了Android使用ActionBar和ViewPager切換頁面,分享給大家供大家參考。具體如下:運行效果截圖如下:項目布局如下:具體代碼如下:MainAc
Android自定義View實現帶數字的進度條實例代碼
第一步、效果展示圖1、藍色的進度條 圖2、紅色的進度條 圖3、多條顏色不同的進度條 圖4、多條顏色不同的進度條第二步、自定義ProgressBar實現帶數字的進度條0、項
四大組件之Service(四)-Service的線程、工作線程、權限及系統Service
第5節 Service的線程和工作線程剛開始使用Service的時候,常常會有一個誤區:認為這個Service運行於應用中一個單獨的線程。其實Service組件和其他組件