c listview 排序如何排序

ListView的排序
今天天气好晴朗处处好风光,好天气好开始,图老师又来和大家分享啦。下面给大家推荐ListView的排序,希望大家看完后也有个好心情,快快行动吧!
  ---- 列表框控件在应用程序中的使用率很高,在中经常见到,它有四种常见的式样,分别具有显示大图标,小目标,含有图标的多列列表,含有列标头的列表。我们也经常见到一些扩展功能,例如我们在资源管理器中的列表框中,在选用详细资料察看时,用单击列标头,如大小,则所列文件按大小排序;单机日期,则按文件日期进行排序.这一功能增强了应用程序的可用性,使操作更直观、方便。笔者在以Borland C++Builder 3.0(以下简称BCB)作为开发平台实现这一功能时发现,仅通过设定列表框控件的属性值的方法,只能根据项目的首列加以排序,不能根据子项目(SubItems)排序。因此,我们需要编写自己的代码以完成这一功能。  ---- 以下描述如何在BCB开发平台上为列表框添加列标头点击排序功能,当我们点击的次数为奇数时,所列内容以降序排列;当我们点击的次数为偶数时,所列内容以升序排列。  ---- 首先将一个列表框控件安放在Form上,并将其名称设为ListView1。然后在其中添加若干项目作为试验对象。方法为:用鼠标右键单击控件,在弹出的对话框中选择Columns Editor用来添加列和子列;再选Items Editor用来添加项目(包含子列和主列上的内容)。  ---- 为了显示出子项目内容,需要在Object Inspector中修改ListView属性值,将ViewStyle设置为vsReport。另外,还必须将SortType设置为None,以使我们的排序程序起作用。这样,程序的外观已经符合需要,下面应该增加排序功能的代码了。为此需要添加类的方法到源代码中。添加位置为:  void __fastcall TForm1::ListView1ColumnClick  (TObject *Sender,  TListColumn *Column)  ---- 在该方法的传递参数中,指向TListColumn类型的指针Column中含有用户所点击的列的信息。  ---- 下面先定义变量:  int i,m,n,j;  static bool od=  od=!  ---- od代表用户点击的次数,奇数时为true,偶数时为false。注意此处od的类型设定为static,可以保证其数值的连续性。用n记录用户点击的列号,m记录列表框中的总项目数。  n=Column- I  m=ListView1- Items- C  ---- 在列表框中临时添加一个项目作为排序中交换用的临时空间。  ListView1- Items- Add();  ---- 当用户点击第一列列标头时,排序按ListView1- Items- Item[i]- Caption进行,与其它列不同,所以要单独进行排序。  if (n==0){for(i=0;i m-1;i++)for(j=i+1;j++)if(od){if(ListView1- Items- Item[i]- Caption ListView1- Items- Item[j]- Caption){ListView1- Items- Item[m]=ListView1- Items- Item[i];ListView1- Items- Item[i]=ListView1- Items- Item[j];ListView1- Items- Item[j]=ListView1- Items- Item[m];}}else{if(ListView1- Items- Item[i]- CaptionListView1- Items- Item[j]- Caption){ListView1- Items- Item[m]=ListView1- Items- Item[i];ListView1- Items- Item[i]=ListView1- Items- Item[j];ListView1- Items- Item[j]=ListView1- Items- Item[m];}}ListView1- Items- Delete(m);}  ---- 点击其它列时,需要将所点击的列内容从ListView1- Items- Item[i]-
SubItems- Text中抽出,并参照其进行排序。子项目在存储中,形式为_子项目1rn子项目2rn子项目3rn...子项目Nrn_。为抽取其中某一子项目,需编写如下函数,并将其放于void __fastcall TForm1::ListView1ColumnClick前面即可。  #include
vcl/dstring.h AnsiString __stdcall sg(AnsiString str,int n){int l,i;AnsiString (str);l=qq.Length();AnsiString p(str);char a[]=&rn&;int j=0,k=0;for(j=1;j++){i=1;while(qq[j]!=a[0] && qq[j+1]!=a[1]){p[i++]=qq[j];j++;}k++;if((k-1)==n)}p[i]=NULL;return (p);}  ---- 有了此函数以后,只需将上面的ListView1- Items- Item[i]- Caption更换为sg(ListView1- Items- Item[i]- SubItems- Text,n-1)即可完成对此项目的点击排序功能。  for(i=0;i m-1;i++)for(j=i+1;j++)if(od){if(sg(ListView1- Items- Item[i]- SubItems- Text,n-1) sg(ListView1- Items- Item[j]- SubItems- Text,n-1))// ...以下从略最后,删除临时的交换项目。ListView1- Items- Delete(m);  ---- 编译运行程序后,即会看到我们预期的结果。另外,本程序是按照字符串方式进行排序的,如果需要按照数字或其它方式排序,只需进行相应的类型转换即可。理解本程序后,读者即掌握了对ListView控件编程的一条基本思路,对今后使用BCB以及对windows编程起到良好作用。& 搜索“图”或者“tulaoshi_com”加关注,每天最新的美食、、、美妆、、手工DIY等教程让你一手全掌握。推荐关注!【扫描下图可直接关注】
来源:/n/3772.html
点击查看更多与《》相关的文章>>
在这个颜值当道,屌丝闪边的时代,拼不过颜值拼内涵,只有知识丰富才能提升一个人的内在气质和修养,所谓人丑就要多学习,今天图老师给大家分享解析shell排序的实现代码,希望可以对大家能有小小的帮助。
Excel教程:数据排序的技巧,排序是数据处理中的经常性工作,Excel排序有序数计算(类似成绩统计中的名次)和数据重排两类。本文以几个车间的产值和名称为例,介绍Excel 2000/XP的数据排序方法。
下面是个超简单的希尔排序的算法代码教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~
get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是关于Select Where In 的排序问题,一起来学习了解下吧!
给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的java中常用的排序方法,过去的都会过去,迎接崭新的开始,释放更美好的自己。
今天天气好晴朗处处好风光,好天气好开始,图老师又来和大家分享啦。下面给大家推荐整理一下SQLSERVER的排序规则,希望大家看完后也有个好心情,快快行动吧!
热门搜索:
ps教程 打造魔幻小精灵
Excel2010手动求和图解教程
如何使用酷狗下载音乐
PS后期处理教程 怎么使用PS给截图图片进行调色
双杠是普遍流行于生活中的运动器材,用于做简便的手臂背部力量动作。双杠简笔画画法非常简单,需要注意的是造型角度突出该物品的特色。接下来我们即通过双杠儿童简笔画教学图解步骤来学习双杠简笔画。
电脑是我们生活中最常接触的电子产品之一,大家都知道电脑操作有许多的快捷键,很多时候可以不用鼠标去点击,直接快捷键按键操作就好啦,这样又快又方便。下面给大家介绍电脑计算器内部有哪些快捷键吧。
对于大部分人来说,日常生活已经离不开电子产品, 一天中接触吧最多的电子产品就是手机和电脑。windows系统自带的计算器程序是大家经常用到的,一般需要使用的时候大家都会在开始菜单-附件里找到它,这样就不太方便了,如何快速打开电脑上的计算器程序呢?
现在很多人都非常喜欢饲养狗狗,而且饲养金毛狗狗的人可以说是非常多的,毕竟金毛狗狗非常的可爱,而且性格非常温顺。所以饲养的人当然很多。那么喂养金毛狗时要注意什么?一起来看看吧。
怎么利用Photoshop给电商模特照片精修磨皮?很多朋友在工作中经常会遇到要求精修模特的情况,特别是做化妆品行业的电商设计师,所以总结了一下我的模特修图方法和技巧与大家分享,喜欢的朋友让我们一起来学习吧。
磨皮是我们ps照片最基本的技能,Photoshop人物磨皮是我们必须掌握的,如今不少国人对Photoshop修图的三大酷炫神技双曲线、中性灰与高低频几近痴迷,抓耳挠腮想学会它,下面一起看看教程吧。
掌握一点Photoshop教程对你是非常有用的,这篇教程是给大家分享PS简单快速创建眼睛彩虹美瞳效果方法,教程最终创建出来的效果非常漂亮,而且难度并不是很大,很值得大家学习,一起来学习吧。
2017年最受欢迎的生活服务APP!!生活服务类App的出现为日常生活带来极大便利,我们可以通过手机客户端预约各种家政服务,足不出户就能够享受实惠、便捷的生活服务,那么接下来我为大家推荐一些生活中必备生活app。
由于现在抢红包大热起来,很多app都开始支持发红包抢红包了,因此也出现了微信抢红包神器,可以自动抢微信红包,肯定比认为手动操作快,有消息就会自动打开,然后打开红包。今天就给大家分享2017微信自动抢红包神器大全。
2017手机赚钱软件排行榜!!很多朋友都在苦恼每天的钱不够话,空闲时间不知道怎么打发,总想寻找一种简单的赚钱方式,我们的手机app就有很多,下面具体给大家介绍手机赚钱软件有哪些,总有一款你中意的。
经常玩微信的朋友都知道,微信小程序已经全面上线了,对于小程序的出现是否会引发App变革众说纷纭,但不可否认的是小程序能够带给用户及产商一定的便利,那么今天为大家汇总目前上线的一些实用小程序。
男女交往一直都是人们比较关注的一个问题,都说相爱容易,相处不易,交往过的朋友应该都能深刻的体会到,女生常常抱怨着让男生理解自己,但男生也希望多体谅一下他们。尤其不要老是问一些无法回答的问题来考验他们。
很多朋友都信风水一说,对于自己家里房屋客厅的装修也是有一定要求的,因为客厅的风水关系着整个家居的运势,更关系着主人的财运与健康,因而客厅里的风水禁忌是需要我们谨慎注意的,那么风水学中客厅风水禁忌有哪些呢?
春天已经来临了,夏天也不远了,新的一才刚刚开始,时尚爱美的美眉们最关注的就是春夏服装设计的流行趋势了,早早的把握住时尚趋势走在流行的最尖端,今天就给大家整理分享2017春夏女装设计流行趋势 ,你绝对不能错过的亮点。ListView列表拖拽排序,listview拖拽排序-android100学习网
ListView列表拖拽排序,listview拖拽排序
ListView列表拖拽排序,listview拖拽排序
ListView列表拖拽排序可以参考Android源代码下的Music播放列表,他是可以拖拽的,源码在[packages/...
ListView列表拖拽排序,listview拖拽排序
ListView列表拖拽排序可以参考Android源代码下的Music播放列表,他是可以拖拽的,源码在[packages/apps/Music下的TouchInterceptor.java下]。
首先是搭建框架,此处的ListView列表类似于QQ消息列表,当然数据只是模拟,为了简单起见,没有把ListView的条目的所有的属性全部写上。首先是消息的实体类Msg.java:
package me.chenfuduo.
public class Msg {
private int ivId;
public Msg() {
public Msg(int ivId, String text) {
this.ivId = ivId;
this.text =
public int getIvId() {
return ivId;
public String getText() {
然后是数据列表的每个Item的布局item.xml:
&?xml version="1.0" encoding="utf-8"?&
&RelativeLayout xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
&ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
android:layout_marginLeft="10dp"
android:layout_centerInParent="true"
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView"
android:layout_toRightOf="@id/imageView"
android:layout_centerInParent="true"
android:layout_marginLeft="10dp"
&/RelativeLayout&
现在可以新建一个MsgAdapter适配器类,让其继承自ArrayAdapter,并实现其构造方法和重写getView()方法。
package me.chenfuduo.
import java.util.L
import android.content.C
import android.view.V
import android.view.ViewG
import android.widget.ArrayA
import android.widget.ImageV
import android.widget.TextV
public class MsgAdapter extends ArrayAdapter&Msg& {
public MsgAdapter(Context context, List&Msg& msgList) {
super(context, 0, msgList);
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewH
if (convertView == null) {
view = View.inflate(getContext(), R.layout.item, null);
viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) view
.findViewById(R.id.imageView);
viewHolder.textView = (TextView) view.findViewById(R.id.textView);
view.setTag(viewHolder);
view = convertV
viewHolder = (ViewHolder) view.getTag();
viewHolder.imageView.setImageResource(getItem(position).getIvId());
viewHolder.textView.setText(getItem(position).getText());
static class ViewHolder {
ImageView imageV
TextView textV
主界面MainActivity设置适配器:
package me.chenfuduo.
import java.util.ArrayL
import java.util.L
import android.app.A
import android.os.B
public class MainActivity extends Activity {
private MyDragListV
private List&Msg& msgL
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = (MyDragListView) findViewById(R.id.list);
msgList = new ArrayList&Msg&();
initData();
list.setAdapter(new MsgAdapter(this, msgList));
private void initData() {
for (int i = 0; i & 30; i++) {
msgList.add(new Msg(R.drawable.ic_launcher, "new item" + i));
这里提到的MyDragListView就是下面我们要着重介绍的自定义的ListView,先不管。
OK,现在运行,数据全部展示在ListView上了,下面开始新建一个类MyDragListView,并让其继承自ListView,提供三个构造方法。
public MyDragListView(Context context) {
this(context, null);
public MyDragListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
public MyDragListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
接下来,需要重写onInterceptTouchEvent()拦截事件的方法,为了能在子控件响应触摸事件的情况下此ListView也能监听到触摸事件,需要重写此方法,做一些初始化的工作,在这里捕获ACTION_DOWN事件,在ACTION_DOWN事件中,做一些拖动的准备工作。
获取点击数据项,初始化一些变量(pointToPosition)
判断是否是拖动还是仅仅是点击
如果是拖动,建立拖动影像()
以上都是后面拖动的基础。
那首先定义我们需要的一些变量:
// 原始条目位置
private int dragSrcP
// 目标条目位置
private int dragDestP
//在当前数据项中的位置
private int dragP
//拖动的时候,开始向上滚动的边界
private int upScrollB
//拖动的时候,开始向下滚动的边界
private int downScrollB
//窗口控制类
private WindowManager windowM
//用于控制拖拽项显示的参数
private WindowManager.LayoutParams windowP
//当前视图和屏幕的距离(这里只使用了y轴上的)
private int dragO
// 判断滑动的一个距离,scroll的时候会用到
private int scaledTouchS
// 被拖拽项的影像,其实就是一个ImageView,在我们这里是"用户头像"
private ImageView dragImageV
我们在构造器中获取滑动的距离:
public MyDragListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
scaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
注意获取这个系统所能识别出的被认为是滑动的最小距离的方式。
getScaledTouchSlop()是一个距离,表示滑动的时候,手的移动要大于这个距离才开始移动控件。如果小于这个距离就不触发移动控件。
接下来,在onInterceptTouchEvent()捕获的ACTION_DOWN事件中,做处理。
还是按照上面的来,第一部需要得到选中的数据项的位置,这里使用pointToPosition(x,y)即可。如果想要测试这个api,也很简单,下面是实例代码:
mListView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
int item=mListView.pointToPosition((int) event.getX(), (int) event.getY());
System.out.println("---& 现在点击了ListView中第"+(item+1)+"个Item");
ok,在我们这里是这样:
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// 触点所在的条目的位置
int x = (int) ev.getX();
int y = (int) ev.getY();
dragSrcPosition = dragDestPosition = pointToPosition(x, y);
//如果是无效位置(超出边界,分割线等位置),返回
if(dragDestPosition==AdapterView.INVALID_POSITION){
return super.onInterceptTouchEvent(ev);
现在我们要获取ListView的单个Item,因为获取了这个单个的Item,才能获取Item里面的”头像”(姑且这么叫),ok,代码如下:
//这里如果不减去,会报空指针异常
ViewGroup itemView = (ViewGroup) getChildAt(dragSrcPosition
- getFirstVisiblePosition());
在这里我当时遇到一个NPE的问题,就是当ListView滚动到下面的时候,我选择下面的Item,报错了,归根到底,还是没有理解好getChildAt(i)这个方法。这里,我参考了下面的资料去理解的。
ListView中getChildAt(index)的使用注意事项
通过getChildAt方法取得AdapterView中第n个Item
stackover:ListView getChildAt returning null for visible children
说到底,getChildAt(i)是获取可见视图的。
接下来,就可以获取”用户头像”了:
View dragger = itemView.findViewById(R.id.imageView);
下面需要判断手指的触点是不是在logo(”用户头像”)范围内:
if (dragger != null && x & dragger.getRight() + 10) {
upScrollBounce = Math.min(y - scaledTouchSlop, getHeight() / 3);
downScrollBounce = Math.max(y + scaledTouchSlop,
getHeight() * 2 / 3);
这个很好理解。
接着便可以获取选中条目的图片了。
itemView.setDrawingCacheEnabled(true);
Bitmap bitmap = itemView.getDrawingCache();
startDrag(bitmap, y);
itemView.setDrawingCacheEnabled(false);
这里,又学到一招,将View转化为Bitmap,相关的api:
setDrawingCacheEnabled(boolean)注意最后需要设置其为false
getDrawingCache()
那么现在就可以拖动了。
startDrag(bitmap, y);
最后,我们返回false,让事件可以传递到子控件。
整体的代码入下:
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// 触点所在的条目的位置
int x = (int) ev.getX();
int y = (int) ev.getY();
dragSrcPosition = dragDestPosition = pointToPosition(x, y);
// 如果是无效位置(超出边界,分割线等位置),返回
if (dragDestPosition == AdapterView.INVALID_POSITION) {
return super.onInterceptTouchEvent(ev);
//这里如果不减去
ViewGroup itemView = (ViewGroup) getChildAt(dragSrcPosition
- getFirstVisiblePosition());
// 手指在条目中的相对y坐标
dragPoint = y - itemView.getTop();
/*Log.e("Test", "dragPoint:" + dragPoint + "\n" + "y:"+ y
+ "\n" + "itemView.getTop():" + itemView.getTop());*/
dragOffset = (int) (ev.getRawY() - y);
/*Log.e("Test", "dragOffset:" + dragPoint + "\n" + "y:"+ y
+ "\n" + "ev.getRawY():" + ev.getRawY());*/
View dragger = itemView.findViewById(R.id.imageView);
// 判断触点是否在logo的区域
if (dragger != null && x & dragger.getRight() + 10) {
upScrollBounce = Math.min(y - scaledTouchSlop, getHeight() / 3);
downScrollBounce = Math.max(y + scaledTouchSlop,
getHeight() * 2 / 3);
// 获取选中条目的图片
itemView.setDrawingCacheEnabled(true);
Bitmap bitmap = itemView.getDrawingCache();
itemView.setDrawingCacheEnabled(false);
startDrag(bitmap, y);
// 可以传递到子控件
return super.onInterceptTouchEvent(ev);
在上面有获取坐标的getRawY()等等,如果不清楚,可以看下这个文章。
android MotionEvent中getX()和getRawX()的区别
接下来是拖拽的方法startDrag(bitmap, y);:
private void startDrag(Bitmap bitmap, int y) {
// 释放影像,在准备影像的时候,防止影像没释放,每次都执行一下
stopDrag();
windowManager = (WindowManager) getContext().getSystemService(
Context.WINDOW_SERVICE);
// 窗体参数配置
windowParams = new WindowManager.LayoutParams();
windowParams.gravity = Gravity.TOP;
windowParams.x = 0;
// 图片在屏幕上的绝对坐标
windowParams.y = y - dragPoint + dragO
/*Log.e("Test", "windowParams.y:" + windowParams.y + "\n" + "y:"+ y
+ "\n" + "dragPoint:" + dragPoint +
"\n" + "dragOffset" + dragOffset);*/
// 添加显示窗体
windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
// 下面这些参数能够帮助准确定位到选中项点击位置,照抄即可
windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
windowParams.format = PixelFormat.TRANSLUCENT;
windowParams.windowAnimations = 0;
// 把影像ImagView添加到当前视图中
ImageView imageView = new ImageView(getContext());
imageView.setImageBitmap(bitmap);
windowManager = (WindowManager) getContext().getSystemService("window");
windowManager.addView(imageView, windowParams);
// 把影像ImageView引用到变量drawImageView,用于后续操作(拖动,释放等等)
dragImageView = imageV
如果做过自定义Toast,对上面的代码不会陌生。
不做解释,接着重写boolean onTouchEvent(MotionEvent ev):
public boolean onTouchEvent(MotionEvent ev) {
// 如果dragImageView为空,说明拦截事件中已经判定仅仅是点击,不是拖动,返回
// 如果点击的是无效位置,返回,需要重新判断
if (dragImageView != null && dragDestPosition != INVALID_POSITION) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_UP:
int upY = (int) ev.getY();
// 释放拖动影像
stopDrag();
// 放下后,判断位置,实现相应的位置删除和插入
onDrop(upY);
case MotionEvent.ACTION_MOVE:
int moveY = (int) ev.getY();
// 拖动影像
onDrag(moveY);
// 这个返回值能够实现selected的选中效果,如果返回true则无选中效果
return super.onTouchEvent(ev);
首先得判断是点击还是拖动,直接通过dragImageView即可判断,如果dragImageView为空,说明拦截事件中已经判定仅仅是点击,不是拖动,返回。接着分析拖动的方法onDrag(moveY);:
拖动的时候,当前拖动的条目的透明度让其有所变化,然后是位置在不断更新,其次需要判断位置是否合法,最后是滚动。
private void onDrag(int y) {
if (dragImageView != null) {
windowParams.alpha = 0.8f;
windowParams.y = y - dragPoint + dragO
windowManager.updateViewLayout(dragImageView, windowParams);
// 为了避免滑动到分割线的时候,返回-1的问题
int tempPosition = pointToPosition(0, y);
if (tempPosition != INVALID_POSITION) {
dragDestPosition = tempP
int scrollHeight = 0;
if (y & upScrollBounce) {
scrollHeight = 8;// 定义向上滚动8个像素,如果可以向上滚动的话
} else if (y & downScrollBounce) {
scrollHeight = -8;// 定义向下滚动8个像素,,如果可以向上滚动的话
if (scrollHeight != 0) {
// 真正滚动的方法setSelectionFromTop()
setSelectionFromTop(dragDestPosition,
getChildAt(dragDestPosition - getFirstVisiblePosition())
.getTop() + scrollHeight);
这里的ViewManager.updateViewLayout(View arg0, LayoutParams arg1)会使得view所引用的实例使用params重新绘制自己。
接下来介绍下ListView的setSelectionFromTop(...)和setSelection(...)方法。
看一下setSelectionFromTop()的具体实现,代码如下:
* 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.)
* position Index (starting at 0) of the data item to be selected.
* 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) {
if (!isInTouchMode()) {
position = lookForSelectablePosition(position, true);
if (position &= 0) {
setNextSelectedPositionInt(position);
mResurrectToPosition =
if (position &= 0) {
mLayoutMode = LAYOUT_SPECIFIC;
mSpecificTop = mListPadding.top +
if (mNeedSync) {
mSyncPosition =
mSyncRowId = mAdapter.getItemId(position);
requestLayout();
从上面的代码可以得知,setSelectionFromTop()的作用是设置ListView选中的位置,同时在Y轴设置一个偏移量(padding值)。
ListView还有一个方法叫setSelection(),传入一个index整型数值,就可以让ListView定位到指定Item的位置。
这两个方法有什么区别呢?看一下setSelection()的具体实现,代码如下:
* 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.
* position Index (starting at 0) of the data item to be selected.
public void setSelection(int position) {
setSelectionFromTop(position, 0);
原来,setSelection()内部就是调用了setSelectionFromTop(),只不过是Y轴的偏移量是0而已。
Ok,当手指抬起来的时候,需要停止拖动:
private void stopDrag() {
if (dragImageView != null) {
windowManager.removeView(dragImageView);
dragImageView =
最后得将Item放到正确的位置:
private void onDrop(int y) {
// 获取放下位置在数据集合中position
// 定义临时位置变量为了避免滑动到分割线的时候,返回-1的问题,如果为-1,则不修改dragPosition的值,急需执行,达到跳过无效位置的效果
int tempPosition = pointToPosition(0, y);
if (tempPosition != INVALID_POSITION) {
dragDestPosition = tempP
// 超出边界处理
if (y & getChildAt(1).getTop()) {
// 超出上边界,设为最小值位置0
dragDestPosition = 0;
} else if (y & getChildAt(getChildCount() - 1).getTop()) {
// 超出下边界,设为最大值位置,注意哦,如果大于可视界面中最大的View的底部则是越下界,所以判断中用getChildCount()方法
// 但是最后一项在数据集合中的position是getAdapter().getCount()-1,这点要区分清除
dragDestPosition = getAdapter().getCount() - 1;
// 数据更新
if (dragDestPosition &= 0 && dragDestPosition & getAdapter().getCount()) {
MsgAdapter adapter = (MsgAdapter) getAdapter();
Msg dragItem = adapter.getItem(dragSrcPosition);
// 删除原位置数据项
adapter.remove(dragItem);
// 在新位置插入拖动项
adapter.insert(dragItem, dragDestPosition);
版权声明:本文为博主原创文章,未经博主允许不得转载。
/Androidjc/1029892.true/Androidjc/1029892.htmlTechArticleListView列表拖拽排序,listview拖拽排序 ListView列表拖拽排序可以参考Android源代码下的Music播放列表,他是可以拖拽的,源码在[packages/apps/Mu...

我要回帖

更多关于 vb listview 排序 的文章

 

随机推荐