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. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  2. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  3. 谱聚类(spectral clustering)原理总结

    谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多,更加难能可贵的是实现起来也 ...

  4. WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体

    最近在修改维护以前的webform项目(维护别人开发的.....)整个aspx没有用到任何的控件,这个我也比较喜欢不用控件所以在提交信息的时候需要自己手动的去Request.QueryString[] ...

  5. 微框架spark--api开发利器

    spark简介 Spark(注意不要同Apache Spark混淆)的设计初衷是,可以简单容易地创建REST API或Web应用程序.它是一个灵活.简洁的框架,大小只有1MB.Spark允许用户自己选 ...

  6. Javascript实现HashTable类

    散列算法可以尽快在数据结构中找出指定的一个值,因为可以通过Hash算法求出值的所在位置,存储和插入的时候都按照Hash算法放到指定位置. <script> function HashTab ...

  7. java设计模式之单例模式(几种写法及比较)

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  8. WEB安全隐患

    org.apache.commons.lang.StringEscapeUtils 进行输入框内容处理 [StringEscapeUtils.escapeSql(str);StringEscapeUt ...

  9. Android 添加ActionBar Buttons

    一.在res/menu文件夹下创建Xml文件 跟标签为menu,设置item <?xml version="1.0" encoding="utf-8"?& ...

  10. Mysql - 性能优化之子查询

    记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...