‘壹’ 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的位置。