直接上代码
import java.util.Timer; import java.util.TimerTask; import android.content.Context; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.View; import android.view.View.OnKeyListener; import android.widget.ListAdapter; import android.widget.ListView; import com.letv.tvos.lechou.utils.LogCat; public class SmoothScrollListView extends ListView implements OnKeyListener { private int itemsCount; private int itemHeight; private ListAdapter adapter; private int scrollDuration = 1000; private boolean isScrollTop; private Timer timer; private OnScrollBottomListener onScrollBottomListener; private OnScrollTopListener onScrollTopListener; public SmoothScrollListView(Context context) { this(context, null); } public SmoothScrollListView(Context context, AttributeSet attrs) { super(context, attrs); this.setOnKeyListener(this); this.setSmoothScrollbarEnabled(true); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); if (adapter != null) { //获取每个item 的高度,因为要调用滑动的方法,每次滑动的距离就是item 的高度 itemHeight = this.getChildAt(0).getHeight(); } } @Override public void setAdapter(ListAdapter adapter) { super.setAdapter(adapter); this.adapter = adapter; //获取listview item的count,一定要是由adapter获得,不能通过listView,因为listView是动态添加删除孩子的,可以打印一下比较看看 itemsCount = adapter.getCount(); } /** * 设置滚动动画的滚动时间 * * @param scrollDutation */ public void setScrollDuration(int scrollDutation) { this.scrollDuration = scrollDutation; } @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP) { return false; } //获取当前被选中的状态 int currentItemPosition = this.getSelectedItemPosition(); if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { //当时倒数第二个的时候 if (currentItemPosition == itemsCount - 2) { //如果listView的最后一个可见Item是倒数第二个item,或者是倒数第一个item同时timer不为空,这时要滚动一次,并让最后一个item获取焦点 if(this.getLastVisiblePosition() == itemsCount - 2 || (this.getLastVisiblePosition() == itemsCount - 1 && timer != null)){ LogCat.e("倒数第二个"); this.smoothScrollBy(itemHeight, scrollDuration); if(timer == null){ smoothScrollToBottom(); }else{ timer.cancel(); timer = null; //延迟一下,再让最后一个item编程selected状态,不让没有动画,太突兀 smoothScrollToBottom(); } // this.smoothScrollToPositionFromTop(itemsCount - 1, 0, scrollDuration); // this.setSelection(itemsCount - 1); } return false; } else if (currentItemPosition == itemsCount - 1) { //当是最后一个item是selectionItem,则给出回调,让他不要在滚动了 if (onScrollBottomListener != null) { onScrollBottomListener.onScrollBottom(); } return true; } else { //是中间其他状态的时候,滚动一个item的距离 this.smoothScrollBy(itemHeight, scrollDuration); // this.smoothScrollToPositionFromTop(currentItemPosition + 1, 0, scrollDuration); return false; } } if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { if (currentItemPosition == 1) { if(this.getChildAt(0).isFocusable() == false){ this.smoothScrollBy(-itemHeight, scrollDuration); } return false; } else if (currentItemPosition == 0) { if (onScrollTopListener != null) { onScrollTopListener.onScrollTop(); } return isScrollTop; } else { this.smoothScrollBy(-itemHeight, scrollDuration); return false; } } return false; } private void smoothScrollToBottom(){ LogCat.e("平滑移动到最后"); timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { SmoothScrollListView.this.post(new Runnable() { @Override public void run() { SmoothScrollListView.this.setSelection(SmoothScrollListView.this.getLastVisiblePosition()); } }); } }, scrollDuration / 3); } /** * 当滚动到底部的时候的监听 */ public interface OnScrollBottomListener { void onScrollBottom(); } public void setOnScrollBottomListener( OnScrollBottomListener onScrollBottomListener) { this.onScrollBottomListener = onScrollBottomListener; } /** * 当滚动到顶部的时候的监听 */ public interface OnScrollTopListener { void onScrollTop(); } public void setOnScrollTopListener(OnScrollTopListener onScrollTopListener) { isScrollTop = true; this.onScrollTopListener = onScrollTopListener; } }
相关推荐
Android listview viewpager 滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 blog 地址 : http://blog.csdn.net/aaawqqq/article/details/43824631
android listview快速滑动,修改默认的滑动条Demo.zip
android Listview下拉刷新 上拉(滑动分页)加载更多 高仿新浪微博下拉刷新,同时实现了滑动加载下一页
Android ListView 滑动分页 分页加载数据
实现ListView选项左右滑动,可以再该demo基础上实现自己想要的效果,如滑动删除等
* Android下拉刷新自动加载更多 * @author mzba * */ public class PullToRefreshActivity extends ListActivity { private LinkedList, String>> mListItems; private NewsAdapter adapter; private int ...
公司有个项目要用到类似手机QQ聊天记录列表ListView左右滑动后改变item的效果,网上没找到好的代码,偶然在安卓巴士的开源站http://d.apkbus.com/里面找到了SwipeToDismiss的源码...改成自己的显示另一个view的效果就行...
android listview item 左右滑动删除
解决复杂布局,scrollview嵌套ListView滑动性能的问题,提供下拉刷新和暴露对外操作listview控件UI的方法,同步博文:http://blog.csdn.net/qq_28690547/article/details/50792439
安卓Android源码——listview快速滑动,修改默认的滑动条.rar
Android Listview Item上下拖动位置
Android应用源码之listview快速滑动,修改默认的滑动条.zip
滑动listview标题置顶,listview吸顶效果,安卓系统状态栏透明,有图有源码
实现了listview滑动删除功能的下拉刷新加载更多功能的整合
ListView每页加载10条数据,当滑动到页尾时自动加载下面的数据。
Android ListView上下翻页效果
http://blog.csdn.net/icqapp/article/details/24978057 详看效果图...android listview左右滑动分页(viewpager嵌套listview进行分页),焦点图带圆焦点 先敬告学者:如在此项目上运行不了的直接找到本人QQ:508181017,
实现listview可上下左右滑动,上下滑动时固定列表头,左右滑动时固定行表头。
Android应用源码之listview快速滑动,修改默认的滑动条_Android
android listview 左右滑动 实现 滑动删除