ListView 实现定位特定 item

最近在项目中需要使 ListView 能跳转到特定的 item,查阅文档后,发现 ListView 有以下几种方法可供使用:

  • smoothScrollToPosition(int position):平滑滚动到指定位置。如果 position 为负,则滚动到第一条;如果 position 大于 ListView item 的最大值,则滚动到最后一条。
  • smoothScrollByOffset(int offset):平滑滚动偏移量 offset 指定的 item。如果 offset 大于 0,则表示下移;如果 offset 小于 0,则表示上移。当 offset 超过可以移动的最大值时,默认移动到顶部或尾部。
  • setSelection(int position):直接跳转到指定的位置,没有任何滚动效果。
  • setSelectionFromTop(int position,int offset):直接跳转到指定的位置,并在Y轴设置一个偏移量。该偏移量是个 padding 值,可以用来实现类似 QQ 查看历史消息的功能。可参考ListView的setSelection()和setSelectionFromTop()联系

:通过查看源代码,其实可以发现 setSelection(int position) 其实调用的是 setSelectionFromTop(int position,int offset) 方法,只不过 offset = 0 而已。

源码:

/**
* Sets the currently selected item. If in touch mode, the item will not be selected
* but it will still be positioned appropriately. If the specified selection position
* is less than 0, then the item at position 0 will be selected.
*
* @param position Index (starting at 0) of the data item to be selected.
*/
@Override
public void setSelection(int position) {
setSelectionFromTop(position, 0);
} /**
* Sets the selected item and positions the selection y pixels from the top edge
* of the ListView. (If in touch mode, the item will not be selected but it will
* still be positioned appropriately.)
*
* @param position Index (starting at 0) of the data item to be selected.
* @param y The distance from the top edge of the ListView (plus padding) that the
* item will be positioned.
*/
public void setSelectionFromTop(int position, int y) {
if (mAdapter == null) {
return;
} if (!isInTouchMode()) {
position = lookForSelectablePosition(position, true);
if (position >= 0) {
setNextSelectedPositionInt(position);
}
} else {
mResurrectToPosition = position;
} if (position >= 0) {
mLayoutMode = LAYOUT_SPECIFIC;
mSpecificTop = mListPadding.top + y; if (mNeedSync) {
mSyncPosition = position;
mSyncRowId = mAdapter.getItemId(position);
} if (mPositionScroller != null) {
mPositionScroller.stop();
}
requestLayout();
}
}

简单小Demo

MainActivity.java:

public class MainActivity extends Activity implements View.OnClickListener {

    private EditText mEdt;
private Button mBtnJump, mBtnMoveUp, mBtnMoveDown;
private Button mBtnSelect;
private Button mBtnSelectPositive,mBtnSelectNagetive;
private ListView mLv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); mEdt = (EditText) findViewById(R.id.edt);
mBtnJump = (Button) findViewById(R.id.btn_jump);
mBtnMoveUp = (Button) findViewById(R.id.btn_move_up);
mBtnMoveDown = (Button) findViewById(R.id.btn_move_down);
mBtnSelect = (Button) findViewById(R.id.btn_select);
mBtnSelectPositive = (Button) findViewById(R.id.btn_select_from_top_positive_offset);
mBtnSelectNagetive = (Button) findViewById(R.id.btn_select_from_top_nagetive_offset);
mLv = (ListView) findViewById(R.id.lv);
mLv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, generateString())); mBtnJump.setOnClickListener(this);
mBtnMoveUp.setOnClickListener(this);
mBtnMoveDown.setOnClickListener(this);
mBtnSelect.setOnClickListener(this);
mBtnSelectPositive.setOnClickListener(this);
mBtnSelectNagetive.setOnClickListener(this);
} private List<String> generateString() {
List<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add("item " + i);
}
return list;
} @Override
public void onClick(View v) {
String input = mEdt.getText().toString();
int position = Integer.valueOf(input);
switch (v.getId()) {
case R.id.btn_jump:
//平滑滚动到指定位置
mLv.smoothScrollToPosition(position);
break;
case R.id.btn_move_up:
//平滑上移指定数量的item
mLv.smoothScrollByOffset(-position);
break;
case R.id.btn_move_down:
//平滑下移指定数量的item
mLv.smoothScrollByOffset(position);
break;
case R.id.btn_select:
//跳转到指定的位置,不平移
mLv.setSelection(position);
break;
case R.id.btn_select_from_top_positive_offset:
//跳转到指定的位置,第二个参数表示Y轴偏移量
mLv.setSelectionFromTop(position, 100);
break;
case R.id.btn_select_from_top_nagetive_offset:
//跳转到指定的位置,第二个参数表示Y轴偏移量
mLv.setSelectionFromTop(position, -100);
break;
}
}
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.littlejie.listview.MainActivity"> <EditText
android:id="@+id/edt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入你要跳转的行数(0~9999)"
android:inputType="number" /> <Button
android:id="@+id/btn_jump"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点我跳转(smoothScrollToPosition)" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"> <Button
android:id="@+id/btn_move_up"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="上移指定偏移量" /> <Button
android:id="@+id/btn_move_down"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="下移指定偏移量" />
</LinearLayout> <Button
android:id="@+id/btn_select"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="直接跳转到position" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"> <Button
android:id="@+id/btn_select_from_top_positive_offset"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="setSelectionFromTop(+)" /> <Button
android:id="@+id/btn_select_from_top_nagetive_offset"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="setSelectionFromTop(-)" />
</LinearLayout> <ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World!" />
</LinearLayout>

ListView中item定位的更多相关文章

  1. Android ListView中Item点击事件失效解决方案

    欢迎关注公众号,每天推送Android技术文章,二维码如下:(可扫描) 在平常的开发过程中,我们的ListView可能不只是简单的显示下文本或者按钮,更多的是显示复杂的布局,这样的话,我们就得自己写布 ...

  2. android listview中item通过viewpager实现《IT蓝豹》

    android listview中item通过viewpager实现 android listview中item通过viewpager实现,每一个item都支持viewpager实现图片切换功能.本项 ...

  3. Android 实现ListView中Item被单击后背景色保持高亮

    今天为了解决一个需求,就是我有一个slidingDrawer,里面是一个ListView.然后,单击其中的Item,默认只是显示一个橙色背景后就恢复了.客户便有着个需求,需要单击这个Item的背景高亮 ...

  4. ListView中item的最外层使用margin属性失效

    参考文章:http://stackoverflow.com/questions/16278159/why-linearlayouts-margin-is-being-ignored-if-used-a ...

  5. Android关于ListView中item与控件抢夺焦点的那些事

    在开发中,listview可以说是我们使用最频繁的控件之一了,但是关于listview的各种问题也是很多.当我们使用自定义布局的Listview的时候,如果在item的布局文件里面存在Button或者 ...

  6. 奇葩问题:ListView中Item与Item中的Button不能单击问题

    android中ListView是一个经常要用到的一个组件,用到该组件时经常会碰到ListView的Item和Item中的Button不能单击的问题. 本人在使用时同样也遇到过这样的情况,共有三种情况 ...

  7. 简单的ListView中item图片异步加载

    前言:     在android开发当中,从目标地址获取图片往往都是采用异步加载的方法.当完全加载完图片后在进行显示,也有些是直接将加载的图片一点一点的显示出来. 这两个区别只是对流的处理不同而已.现 ...

  8. ListView中Item与Checkable子类控件抢焦点问题

    Android开发中,经常需要为ListView定制Adapter,绑定各种子类控件.如果Item包含Button等Checkable的控件,那么就会发生点击Item无法响应的问题.原因是自己定义的I ...

  9. 改变listview中item选中时文字的颜色

    摘要 当listview的某个item选中时,默认有个选中的高亮显示,如果你要自定义选中时的高亮显示效果,可以在listview中设置属性 android:listSelector="@dr ...

随机推荐

  1. 数学思想:为何我们把 x²读作x平方

    要弄清楚这个问题,我们得先认识一个人.古希腊大数学家 欧多克索斯,其在整个古代仅次于阿基米德,是一位天文学家.医生.几何学家.立法家和地理学家. 为何我们把 x²读作x平方呢? 古希腊时代,越来越多的 ...

  2. 完美判断iframe是否加载完成

    var iframe = document.createElement("iframe"); iframe.style.width = "265px"; ifr ...

  3. CORS详解[译]

    介绍 由于同源策略的缘故,以往我们跨域请求,会使用诸如JSON-P(不安全)或者代理(设置代理和维护繁琐)的方式.而跨源资源共享(Cross-Origin Resource Sharing)是一个W3 ...

  4. ES6模块import细节

    写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ...

  5. solr_架构案例【京东站内搜索】(附程序源代码)

    注意事项:首先要保证部署solr服务的Tomcat容器和检索solr服务中数据的Tomcat容器,它们的端口号不能发生冲突,否则web程序是不可能运行起来的. 一:solr服务的端口号.我这里的sol ...

  6. Win10 IIS本地部署网站运行时图片和样式不正常?

    后期会在博客首发更新:http://dnt.dkill.net 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 启用关闭win功 ...

  7. 使用Java原生代理实现AOP

    ### 本文由博主柒.原创,转载请注明出处 ### 完整源码下载地址 [https://github.com/MatrixSeven/JavaAOP](https://github.com/Matri ...

  8. iOS逆向工程之Reveal工具的安装、配置与使用

    今天博客内容比较简单,不过还是蛮重要的.经常有小伙伴在QQ上私下问我,说博客中是如何使用Reveal查看AppStore中下载应用的UI层级的,那么就在今天这篇博客中作为一个主题来统一的介绍一下吧.虽 ...

  9. [原] KVM 虚拟化原理探究(3)— CPU 虚拟化

    KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要 ...

  10. ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器

    原文:Filters 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:何镇汐 ASP.NET MVC 过滤器 可在执行管道的前后特定阶段执行代码.过滤器可以配置为全局有效.仅对控 ...