『壹』 android 的ListView中怎麼判斷其內容已滾動到最頂部或者最底部
可以通過判斷流動條的位置得到;
如果在頂部,第零個item必然可見;
如果在底部,最大個數減1 item必須可見;
,具體見代碼:
java">listview.setOnScrollListener(newAbsListView.OnScrollListener(){@Override
(AbsListViewview,intscrollState){
switch(scrollState){
//當不滾動時
caseAbsListView.OnScrollListener.SCROLL_STATE_IDLE:
//判斷滾動到底部
if(listview.getLastVisiblePosition()==(listview.getCount()-1)){
L.e("滾動到底部");
}
//判斷滾動到頂部
if(listview.getFirstVisiblePosition()==0){
}
break;
}
}
@Override
publicvoidonScroll(AbsListViewview,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount){
}
});
『貳』 android 中dropdownmenu怎麼滾動到指定位置
方法/步驟: 1、依次進入手機「設置」->「無線和網路」->「WLAN管理」界面。 2、按手機上的「菜單」按鍵,從彈出的擴展面板中點擊「高級」按鈕。 3、接著勾選「使用靜態IP」項,並輸入「IP地址」、「網關」和「網路掩碼」。 4、按手機上的「菜單」按鍵,從彈出的擴展面板中點擊「保存」按鈕。
『叄』 Android 如何 ListView 判斷滾動到最頂部或者底部
可以設置ListView的滾動事件
ListView.setOnScrollListener(OnScrollListener listener)
OnScrollListener是滾動事件監聽介面
有兩個需要實現的方法
public void onScrollStateChanged(AbsListView view, int scrollState) ;
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) ;
幾個參數的意義分別為
AbsListView view所監聽的listview對象
int firstVisibleItem能看見的第一個item的位置
int visibleItemCount能看見的item的數量
int totalItemCount所有item的總數
代碼如下,我們在onScroll中進行判斷
lvMatch.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(firstVisibleItem == 0){
//已滾動到最頂部
}
if(firstVisibleItem+visibleItemCount == totalItemCount){
//滾動到底部
}
}
});
『肆』 android linearlayout如何自動滾到底部
方案:
1、需要在LinearLayout外部包裹上ScrollView
2、設置ScrollView滾動到底部
代碼示例:
布局示意:
<ScrollView
android:id="@+id/scroll_view">
<LinearLayout>
</LinearLayout>
</ScrollView>
java中調用
ScrollViewsv=(ScrollView)findViewById(R.id.scroll_view);//獲取scrollView組件
sv.fullScroll(ScrollView.FOCUS_DOWN);//滾動到底部
『伍』 android如何讓ScrollView的滾動條定位到最後一行
單獨定義一個靜態方法,建立一個線程判斷滾動條的內層外層高度變化。
ScrollView
scrollresult=(ScrollView)findViewById(R.id.scrollView);
scroll2Bottom(scrollresult,
txthistroycontent);//txthistroycontent為滾動條關聯的文本框
public
static
void
scroll2Bottom(final
ScrollView
scroll,
final
View
inner)
{
Handler
handler
=
new
Handler();
handler.post(new
Runnable()
{
@Override
public
void
run()
{
//
TODO
Auto-generated
method
stub
if
(scroll
==
null
||
inner
==
null)
{
return;
}
//
內層高度超過外層
int
offset
=
inner.getMeasuredHeight()
-
scroll.getMeasuredHeight();
if
(offset
<
0)
{
System.out.println("定位...");
offset
=
0;
}
scroll.scrollTo(0,
offset);
}
});
}
}
『陸』 android 帶排序的recyleview怎麼滑動到指定的item
Question
最近在寫 SideBar 的時候遇到一個問題,當執行 Recyclerview 的 smoothScrollToPosition(position) 的時候,Recyclerview 看上去並沒有滾動到指定位置。
Analysis
當然,這並不是方法的bug,而是 smoothScrollToPosition(position) 的執行效果有三種情況,需要區分。
·目標position在第一個可見項之前 。
這種情況調用smoothScrollToPosition能夠平滑的滾動到指定位置,並且置頂。
·目標position在第一個可見項之後,最後一個可見項之前。
這種情況下,調用smoothScrollToPosition不會有任何效果···
·目標position在最後一個可見項之後。
這種情況調用smoothScrollToPosition會把目標項滑動到屏幕最下方···
『柒』 android listview如何按時加滾動到頂部
listview的一些方法:
1.public
void setSelection (int position)
position位置的item置頂(即position位置的item到listview的最頂端),但是,沒有從原來位置到頂端的滑動效果。
2.public
void setSelectionFromTop (int position, int y)
與setSelection 類似。setSelection(position)就是setSelectionFromTop (position,0)
選中position指定的項目,並將所選項置於距離ListView頂端y像素的位置
參數
position 需要選中的項目的索引(從0開始)
y
距離ListView(包括間隙)頂端的位置
3.public
void smoothScrollToPositionFromTop (int position, int
offset)
平滑滾動到指定的適配器位置。 指定位置的視圖會滾動到相對頂邊偏移 offset 像素的位置顯示。
如果無法做到(比如該偏移量會使首尾條目超越列表邊緣),會滾動到盡量接近的位置。
參數
position 滾動到的位置
offset 滾動結束時,指定 position 條目距離視圖頂部的像素數
當offset=0時,可以把position位置的item置頂,而且帶有滑動效果,即會從原來位置輕輕滑動到最頂
端位置。
測試:
可以順利滾動,返回滾動也很順利,滑動順暢
4、public void
smoothScrollToPositionFromTop(int position)
參數:
position 滾動到的位置
帶有滑動效果的滾動到指定位置。
如何判斷其內容已滾動到最頂部或者最底部看
getListView().setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(firstVisibleItem==0){
Log.e("log", "滑到頂部");
}
if(visibleItemCount+firstVisibleItem==totalItemCount){
Log.e("log", "滑到底部");
}
}
});
平滑的滾動listview到一個指定位
package com.android.contacts.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;
public class AutoScrollListView extends ListView {
private static final
float PREFERRED_SELECTION_OFFSET_FROM_TOP = 0.33f;
private int
mRequestedScrollPosition = -1;
private boolean
mSmoothScrollRequested;
public
AutoScrollListView(Context context) {
super(context);
}
public
AutoScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public
AutoScrollListView(Context context, AttributeSet attrs, int
defStyle) {
super(context, attrs, defStyle);
}
public void
requestPositionToScreen(int position, boolean smoothScroll) {
mRequestedScrollPosition = position;
mSmoothScrollRequested = smoothScroll;
requestLayout();
}
@Override
protected void
layoutChildren() {
super.layoutChildren();
if (mRequestedScrollPosition == -1) {
return;
}
final int position =
mRequestedScrollPosition;
mRequestedScrollPosition = -1;
int firstPosition = getFirstVisiblePosition() +
1;
int lastPosition =
getLastVisiblePosition();
if (position >= firstPosition &&
position <= lastPosition) {
return; //
Already on screen
}
final int offset = (int) (getHeight() *
PREFERRED_SELECTION_OFFSET_FROM_TOP);
if (!mSmoothScrollRequested) {
setSelectionFromTop(position, offset);
// Since
we have changed the scrolling position, we need to redo child
layout
// Calling
"requestLayout" in the middle of a layout pass has no effect,
// so we
call layoutChildren explicitly
super.layoutChildren();
} else {
// We will
first position the list a couple of screens before or after
// the new
selection and then scroll smoothly to it.
int
twoScreens = (lastPosition - firstPosition) * 2;
int
preliminaryPosition;
if
(position < firstPosition) {
preliminaryPosition = position + twoScreens;
if (preliminaryPosition >=
getCount()) {
preliminaryPosition = getCount() - 1;
}
if (preliminaryPosition <
firstPosition) {
setSelection(preliminaryPosition);
super.layoutChildren();
}
} else
{
preliminaryPosition =
position - twoScreens;
if (preliminaryPosition <
0) {
preliminaryPosition = 0;
}
if
(preliminaryPosition > lastPosition) {
setSelection(preliminaryPosition);
super.layoutChildren();
}
}
smoothScrollToPositionFromTop(position, offset);
}
}
}
『捌』 Android 讓listview滑動到指定的的位置,這個位置不在當前界面,怎麼實現
Intent intent = new Intent(); intent.setClass(**.this, **.activity); startActivity(intent); (**.this, **.activity) 第一個為當前activity,第二個為想要跳轉的activity
『玖』 android recyclerview 是否能上滑動
使用RecyclerView時,調用smoothScrollToPostion()方法滑動到指定位置,但是條目很多時滑動的很慢,本篇文章就是實現RecyclerView的快速滑動。
先介紹如何實現,然後再介紹原理。
實現代碼創建FastScrollLinearLayoutManager,繼承LinearLayoutManager復moothScrollToPosition()方法,主要復寫LinearSmoothScroller中方法
代碼如下,解釋全在注釋中:
public class FastScrollLinearLayoutManager extends LinearLayoutManager {
public FastScrollLinearLayoutManager(Context context) { super(context);
} @Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) { @Override
public PointF (int targetPosition) { return FastScrollLinearLayoutManager.this.(targetPosition);
} //該方法控制速度。
//if returned value is 2 ms, it means scrolling 1000 pixels with LinearInterpolation should take 2 seconds.
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { /*
mdpi上, 1英寸有160個像素點, 25/160,
xxhdpi,1英寸有480個像素點, 25/480,
*/
//return 10F / displayMetrics.densityDpi;//可以減少時間,默認25F
return super.calculateSpeedPerPixel(displayMetrics);
//Calculates the time it should take to scroll the given distance (in pixels)
protected int calculateTimeForScrolling(int dx) { /*
控制距離, 然後根據上面那個方(calculateSpeedPerPixel())提供的速度算出時間,默認一次 滾動 TARGET_SEEK_SCROLL_DISTANCE_PX = 10000個像素, 在此處可以減少該值來達到減少滾動時間的目的.
*/
//間接計算時提高速度,也可以直接在calculateSpeedPerPixel提高
if (dx > 3000) {
dx = 3000;
} int time = super.calculateTimeForScrolling(dx);
LogUtil.d(time);//列印時間看下
}
};
linearSmoothScroller.setTargetPosition(position);
startSmoothScroll(linearSmoothScroller);
}
從復寫的兩個方法可以看出,都是為了提高滑動速度。一種是直接修改速度,另外一種是通過減少距離來減少所需時間,間接提高滑動速度。
這兩種方法都可以,看自己所需。接下來就講講實現的原理。這塊我只是梳理的大致的流程,不過至此你已經可以實現快速滑動了。
2. RecyclerView 滑動過程梳理
1.調用RecyclerView.smoothScrollToPosition(position)時public void moothScrollToPosition(int position) { //...直接調用了LayoutManage的該方法
}1234
2.LinearLayoutManager中@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) { //...
}; //設置終點位置
linearSmoothScroller.setTargetPosition(position); //開始滾動,使用LinearSmoothScroller(一直勻速滑動,當targetPosition出現在屏幕上時再減速滑動),startSmoothScroll()是LayoutManager中的方法
startSmoothScroll(linearSmoothScroller);
}1234567891011
3.LayoutManager中public void startSmoothScroll(SmoothScroller smoothScroller) { //...
mSmoothScroller = smoothScroller; //調用SmoothScroller.start()方法開始滾動,this參數指當前LayoutManager
mSmoothScroller.start(mRecyclerView, this);
}123456
4.SmoothScroller中
void start(RecyclerView recyclerView, LayoutManager layoutManager) { //...
//使用ViewFlinger進行動畫,ViewFlinger實現了Runnable介面,並且內部使用了Scroller,這樣就可以post自己進而對RecyclerView不斷layout就可以實現滑動
mRecyclerView.mViewFlinger.postOnAnimation();
}12345
5.ViewFlinger中,這是實現滑動的重點,省略了很多代碼邏輯
private class ViewFlinger implements Runnable {
@Override
public void run() { if (scroller.computeScrollOffset()) { //調用SmoothScroller的onAnimation方法
smoothScroller.onAnimation(dx - overscrollX, dy - overscrollY);
}
}
}123456789
6.SmoothScroller中private void onAnimation(int dx, int dy) { //...
if (mTargetView != null) { // verify target position
if (getChildPosition(mTargetView) == mTargetPosition) { //要滑動到的位置已經顯示在屏幕上,onTargetFound()方法里update了差值器,由線性差值器變成了減速的差值器。
onTargetFound(mTargetView, recyclerView.mState, mRecyclingAction);
mRecyclingAction.runIfNecessary(recyclerView);
} //...
if (mRunning) { //再下一次滑動
onSeekTargetStep(dx, dy, recyclerView.mState, mRecyclingAction); //調用內部類Action的runIfNecessary方法
mRecyclingAction.runIfNecessary(recyclerView);
}
}12345678910111213141516171819
7.Action中 private void runIfNecessary(RecyclerView recyclerView) { //調用了ViewFlinger.smoothScrollBy()方法,並傳入了mDuration,mDuration是在SmoothScroller中upDate()時傳入的,就是由前文講的兩個方法共同決定的
recyclerView.mViewFlinger.smoothScrollBy(mDx, mDy, mDuration, mInterpolator);
}1234
8.ViewFlinger中開始滾動 public void smoothScrollBy(int dx, int dy, int ration, Interpolator interpolator) { if (mInterpolator != interpolator) {
mInterpolator = interpolator;
mScroller = ScrollerCompat.create(getContext(), interpolator);
}
setScrollState(SCROLL_STATE_SETTLING);
mLastFlingX = mLastFlingY = 0; //調用Scroller開始滾動,此處即ration
mScroller.startScroll(0, 0, dx, dy, ration);
postOnAnimation();
}1234567891011
這塊粗略的按照流程說了一下滾動過程,涉及的類比較多,最終通過Scroller來進行滾動。
結語:本篇文章實現了RecyclerView的快速滾動,但需要注意一個問題:如果你的Item比較復雜,滾動起來會卡頓。 這個在看源碼時的一個注釋裡面有提到,後來實踐時確實也發現。不得不說微信朋友圈滑動起來的真的快,它用的是ListView,貌似開啟了FastEnable屬性。 同時也可以仿照知乎,先使用RecyclerView.scrollToPosition(position)直接滑動到某一個位置後再使用smoothScrollToPosition(0)滑動到頂部。這塊在RecyclerView里的Action類中jumpTo()的注釋里有提到,如果很遠的話可以先到一個位置後再滑動。
『拾』 android 當onScroll()方法被執行時讓滾動的位置固定
如果是ListView中的話你可以用setSelection()方法。
舉例:如果你要跳到第三個item的位置的話
listview.setSelection(2);
@Override
publicvoidsetSelection(intposition){
setSelectionFromTop(position,0);
}
position參數:Index(startingat0)ofthedataitemtobeselected.
從0開始表示item的位置。