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 而已。

源码:

  1. /**
  2. * Sets the currently selected item. If in touch mode, the item will not be selected
  3. * but it will still be positioned appropriately. If the specified selection position
  4. * is less than 0, then the item at position 0 will be selected.
  5. *
  6. * @param position Index (starting at 0) of the data item to be selected.
  7. */
  8. @Override
  9. public void setSelection(int position) {
  10. setSelectionFromTop(position, 0);
  11. }
  12. /**
  13. * Sets the selected item and positions the selection y pixels from the top edge
  14. * of the ListView. (If in touch mode, the item will not be selected but it will
  15. * still be positioned appropriately.)
  16. *
  17. * @param position Index (starting at 0) of the data item to be selected.
  18. * @param y The distance from the top edge of the ListView (plus padding) that the
  19. * item will be positioned.
  20. */
  21. public void setSelectionFromTop(int position, int y) {
  22. if (mAdapter == null) {
  23. return;
  24. }
  25. if (!isInTouchMode()) {
  26. position = lookForSelectablePosition(position, true);
  27. if (position >= 0) {
  28. setNextSelectedPositionInt(position);
  29. }
  30. } else {
  31. mResurrectToPosition = position;
  32. }
  33. if (position >= 0) {
  34. mLayoutMode = LAYOUT_SPECIFIC;
  35. mSpecificTop = mListPadding.top + y;
  36. if (mNeedSync) {
  37. mSyncPosition = position;
  38. mSyncRowId = mAdapter.getItemId(position);
  39. }
  40. if (mPositionScroller != null) {
  41. mPositionScroller.stop();
  42. }
  43. requestLayout();
  44. }
  45. }

简单小Demo

MainActivity.java:

  1. public class MainActivity extends Activity implements View.OnClickListener {
  2. private EditText mEdt;
  3. private Button mBtnJump, mBtnMoveUp, mBtnMoveDown;
  4. private Button mBtnSelect;
  5. private Button mBtnSelectPositive,mBtnSelectNagetive;
  6. private ListView mLv;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. mEdt = (EditText) findViewById(R.id.edt);
  12. mBtnJump = (Button) findViewById(R.id.btn_jump);
  13. mBtnMoveUp = (Button) findViewById(R.id.btn_move_up);
  14. mBtnMoveDown = (Button) findViewById(R.id.btn_move_down);
  15. mBtnSelect = (Button) findViewById(R.id.btn_select);
  16. mBtnSelectPositive = (Button) findViewById(R.id.btn_select_from_top_positive_offset);
  17. mBtnSelectNagetive = (Button) findViewById(R.id.btn_select_from_top_nagetive_offset);
  18. mLv = (ListView) findViewById(R.id.lv);
  19. mLv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, generateString()));
  20. mBtnJump.setOnClickListener(this);
  21. mBtnMoveUp.setOnClickListener(this);
  22. mBtnMoveDown.setOnClickListener(this);
  23. mBtnSelect.setOnClickListener(this);
  24. mBtnSelectPositive.setOnClickListener(this);
  25. mBtnSelectNagetive.setOnClickListener(this);
  26. }
  27. private List<String> generateString() {
  28. List<String> list = new ArrayList<>();
  29. for (int i = 0; i < 10; i++) {
  30. list.add("item " + i);
  31. }
  32. return list;
  33. }
  34. @Override
  35. public void onClick(View v) {
  36. String input = mEdt.getText().toString();
  37. int position = Integer.valueOf(input);
  38. switch (v.getId()) {
  39. case R.id.btn_jump:
  40. //平滑滚动到指定位置
  41. mLv.smoothScrollToPosition(position);
  42. break;
  43. case R.id.btn_move_up:
  44. //平滑上移指定数量的item
  45. mLv.smoothScrollByOffset(-position);
  46. break;
  47. case R.id.btn_move_down:
  48. //平滑下移指定数量的item
  49. mLv.smoothScrollByOffset(position);
  50. break;
  51. case R.id.btn_select:
  52. //跳转到指定的位置,不平移
  53. mLv.setSelection(position);
  54. break;
  55. case R.id.btn_select_from_top_positive_offset:
  56. //跳转到指定的位置,第二个参数表示Y轴偏移量
  57. mLv.setSelectionFromTop(position, 100);
  58. break;
  59. case R.id.btn_select_from_top_nagetive_offset:
  60. //跳转到指定的位置,第二个参数表示Y轴偏移量
  61. mLv.setSelectionFromTop(position, -100);
  62. break;
  63. }
  64. }
  65. }

activity_main.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. tools:context="com.littlejie.listview.MainActivity">
  8. <EditText
  9. android:id="@+id/edt"
  10. android:layout_width="match_parent"
  11. android:layout_height="wrap_content"
  12. android:hint="请输入你要跳转的行数(0~9999)"
  13. android:inputType="number" />
  14. <Button
  15. android:id="@+id/btn_jump"
  16. android:layout_width="match_parent"
  17. android:layout_height="wrap_content"
  18. android:text="点我跳转(smoothScrollToPosition)" />
  19. <LinearLayout
  20. android:layout_width="match_parent"
  21. android:layout_height="wrap_content"
  22. android:orientation="horizontal">
  23. <Button
  24. android:id="@+id/btn_move_up"
  25. android:layout_width="0dp"
  26. android:layout_height="wrap_content"
  27. android:layout_weight="1"
  28. android:text="上移指定偏移量" />
  29. <Button
  30. android:id="@+id/btn_move_down"
  31. android:layout_width="0dp"
  32. android:layout_height="wrap_content"
  33. android:layout_weight="1"
  34. android:text="下移指定偏移量" />
  35. </LinearLayout>
  36. <Button
  37. android:id="@+id/btn_select"
  38. android:layout_width="match_parent"
  39. android:layout_height="wrap_content"
  40. android:text="直接跳转到position" />
  41. <LinearLayout
  42. android:layout_width="match_parent"
  43. android:layout_height="wrap_content"
  44. android:orientation="horizontal">
  45. <Button
  46. android:id="@+id/btn_select_from_top_positive_offset"
  47. android:layout_width="0dp"
  48. android:layout_height="wrap_content"
  49. android:layout_weight="1"
  50. android:text="setSelectionFromTop(+)" />
  51. <Button
  52. android:id="@+id/btn_select_from_top_nagetive_offset"
  53. android:layout_width="0dp"
  54. android:layout_height="wrap_content"
  55. android:layout_weight="1"
  56. android:text="setSelectionFromTop(-)" />
  57. </LinearLayout>
  58. <ListView
  59. android:id="@+id/lv"
  60. android:layout_width="match_parent"
  61. android:layout_height="wrap_content"
  62. android:text="Hello World!" />
  63. </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. C# 文章导航

    1. C#相关文章 1.1 C# 基础(一) 访问修饰符.ref与out.标志枚举等等 1.2 C# 基础(二) 类与接口 1.3 C# DateTime日期格式化 1.4 C# DateTime与时 ...

  2. $.extend()的实现源码 --(源码学习1)

    目标: $.extend({         add:function(a,b){             return a + b;         }     }) console.log($.a ...

  3. 前端学HTTP之字符集

    前面的话 HTTP报文中可以承载以任何语言表示的内容,就像它能承载图像.影片或任何类型的媒体那样.对HTTP来说,实体主体只是二进制信息的容器而已.为了支持国际性内容,服务器需要告知客户端每个文档的字 ...

  4. 46张PPT讲述JVM体系结构、GC算法和调优

    本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...

  5. 谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  6. [C#] C# 知识回顾 - 学会处理异常

    学会处理异常 你可以使用 try 块来对你觉得可能会出现异常的代码进行分区. 其中,与之关联的 catch 块可用于处理任何异常情况. 一个包含代码的 finally 块,无论 try 块中是否在运行 ...

  7. Android之SharedPreferences数据存储

    一.SharedPreferences保存数据介绍 如果有想要保存的相对较小键值集合,应使用SharedPreferences API.SharedPreferences对象指向包含键值对的文件并提供 ...

  8. ios label 自动计算行高详解

    在OC当中自动计算行高主要调用系统的 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #ffffff } span ...

  9. sqlServer去除字符串空格

    说起去除字符串首尾空格大家肯定第一个想到trim()函数,不过在sqlserver中是没有这个函数的,却而代之的是ltrim()和rtrim()两个函数.看到名字所有人都 知道做什么用的了,ltrim ...

  10. json

    #json序列化,只能处理简单的数据类型,如:字典.列表.字符串,类和函数等数据类型过于复杂,不支持序列化import jsondef sayhi(name): print('hello,', nam ...