androidlistview排序
1. Android 如何按时间先后显示ListView数据
解决方法:
lisrview绑定的是哪种adapter?我假设是最简单的arrayAdapter,其实原理都一样。
绑定adapter的数据大多数是数组。
数组的排序总会把?我记得是sort。
排序好再将数据绑定到adapter,然后adapter绑定到listview
2. 如何用listview实现对数值进行排序
当我们用ListView显示数据时,有一种很人性化的设计便是单击ListView某一列,该列则以升序或降序排列。
自己定义一个类继承自IComparer接口
class ListViewSort:IComparer
{
private int col;
private bool descK;
public ListViewSort()
{
col = 0;
}
public ListViewSort(int column, object Desc)
{
descK = (bool)Desc;
col = column; //当前列,0,1,2...,参数由ListView控件的ColumnClick事件传递
}
public int Compare(object x, object y)
{
int tempInt = String.Compare(((ListViewItem)x).SubItems[col].Text, ((ListViewItem)y).SubItems[col].Text);
if (descK) return -tempInt;
else return tempInt;
}
}
在ListView的ColumnClick事件中调用
代码如下
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
if (this.listView1.Columns[e.Column].Tag == null)
this.listView1.Columns[e.Column].Tag = true;
bool flag = (bool)this.listView1.Columns[e.Column].Tag;
if (flag)
this.listView1.Columns[e.Column].Tag = false;
else
this.listView1.Columns[e.Column].Tag = true;
this.listView1.ListViewItemSorter = new ListViewSort(e.Column, this.listView1.Columns[e.Column].Tag);
this.listView1.Sort();//对列表进行自定义排序
}
3. listview的排序功能是怎么实现的
在VB.NET中,您可以通过创建一个类来实现System.Collections.IComparer接口,实现ListView控件的排序功能。具体实现是:创建该类的实例,赋予给ListView1控件对象的ListViewItemSorter属性,然后在ListView的ColumnClick事件句柄(ListView1_ColumnClick)中添加代码实现按点击列排序。
下面提供一段示例代码功能参考,请根据您的系统的实际情况进行相应的修改:
Private Sub ListView1_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
ListView1.Sorting = SortOrder.Ascending
Dim Sorter = New ListViewSorter(e.Column)
ListView1.ListViewItemSorter = Sorter
End Sub
Public Class ListViewSorter
Implements System.Collections.IComparer
Public SortIndex As Integer
Public Sub New(ByVal SortIndex As Integer)
Me.SortIndex = SortIndex
End Sub
//这里只考虑按数值排序
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim x1, y1 As ListViewItem
Dim intx, inty As Integer
x1 = x
y1 = y
intx = ParseListItemString(x1.SubItems(SortIndex).ToString())
inty = ParseListItemString(y1.SubItems(SortIndex).ToString())
If (intx < inty) Then
Return -1
ElseIf (intx = inty) Then
Return 0
End If
Return 1
End Function
Private Function ParseListItemString(ByVal x As String) As Integer
Dim counter, i As Integer
counter = 0
For i = x.Length - 1 To 0 Step -1
If (x.Chars(i) = "{") Then
Exit For
End If
counter = counter + 1
Next i
Return CInt((x.Substring(x.Length - counter, counter - 1)))
End Function
End Class
4. android 如何让listview 里的内容从左到右排列
可以用gallery或者水平滚动的ScrollView,不一定非要用ListView的
5. android listviewadapter 怎么进行排序
代码片段如下
java">privatevoidsortInfo(){
Comparator<InfoTmp>itemComparator=newComparator<InfoTmp>(){
publicintcompare(InfoTmpinfo1,InfoTmpinfo2){
returninfo1.getAge().compareTo(info2.getAge());
}
};
Collections.sort(mProfileList,itemComparator);
}
[java]viewplain
{
privateContextmContext;
privateList<InfoTmp>mUserList;
publicUserListAdapter(Contextcontext,List<InfoTmp>users){
mContext=context;
mUserList=users;
}
publicintgetCount(){
returnmUserList.size();
}
publicObjectgetItem(intposition){
if(position>=mUserList.size()){
returnnull;
}
returnmUserList.get(position);
}
publiclonggetItemId(intposition){
returnposition;
}
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
LayoutInflaterinflater=LayoutInflater.from(mContext);
convertView=inflater.inflate(R.layout.user_item,null);
TextViewtext=(TextView)convertView.findViewById(R.id.text);
ImageViewicon=(ImageView)convertView.findViewById(R.id.icon);
ImageButtonbtnEdit=(ImageButton)convertView.findViewById(R.id.edit);
ImageButtonbtnDel=(ImageButton)convertView.findViewById(R.id.delete);
//......
returnconvertView;
}
}
[java]viewplain
privatevoidrefreshAdapter(){
//......
sortInfo();
mListVew.setAdapter(newUserListAdapter(mContext,mProfileList));
}
6. android中怎么把list中内容按a-z排序
PinyinComparator接口用来对ListView中的数据根据A-Z进行排序,前面两个if判断主要是将不是以汉字开头的数据放在后面
package com.example.sortlistview;
import java.util.Comparator;
/**
*
* @author xiaanming
*
*/
public class PinyinComparator implements Comparator<SortModel> {
public int compare(SortModel o1, SortModel o2) {
//这里主要是用来对ListView里面的数据根据ABCDEFG...来排序
if (o2.getSortLetters().equals("#")) {
return -1;
} else if (o1.getSortLetters().equals("#")) {
return 1;
} else {
return o1.getSortLetters().compareTo(o2.getSortLetters());
}
}
}
7. android listview 根据id值升序显示
先给数据排序,再绑定数据
8. Android入门 在ListView中如何进行精确的位置设定
在android的开发中,经常会遇到需要主动去设定某条ListItem的位置的需求。设置位置的函数有
ListView.setSelection(int position)
ListView.setSelectionFromTop(int position, int y);
其中
position指的是指定的item的在ListView中的索引,注意如果有Header存在的情况下,索引是从Header就开始算的。
y指的是到ListView可见范围内最上边边缘的距离。
函数有了,现在就是根据自身需求来进行设置。
这次遇到的需求,ListView要求是从下往上展示的,并且当Cursor更新时,要保持住原先的最上方的item(不包括header)的位置不变,然后新的历史数据在原先那条item上方继续向上展示。如图:
ListView从下往上展示,也就是
android:stackFromBottom="true"
但是发现这一属性的设置不会影响索引的排序顺序,也就是item的索引都是从上往下递增的,不会变成从下往上递增。索引为0的item,都是在ListView的最上方的item(或header).
那么当Cursor更新时,原先第一条的索引便会发生变化。要想保持住它(图中的 R)的位置。步骤如下:
(1)获取这一条在新Cursor中的位置(posiition)
(2)获取这一条在更换Cursor后ListView中的位置。
(4)由于ListView的可滚动的属性,我们需要记录更换Cursor前可视的第一条item的索引(ListView.getFirstVisiblePosition())
(3)区分FirstVisiblePosition是0和大于0的情况。由于header,也就是图中的Loading那一条在新数据出来后是会消失的。
(4)当FirstVisiblePosition为0时实际指向的是header,我们要保持位置不变的是header下面第一条(R)的位置。那么此时要设置FirstVisiblePosition为1
(5)当FirstVisiblePosition大于0时实际指向的就是item,但是我们需要设置FirstVisiblePosition为0。*
(6)我们根据FirstVisiblePosition用ListView.getChildAt(int position)函数获取对应的item的View,再根据View.getTop()函数获取到ListView顶部的距离Y。
这样ListView.setSelectionFromTop(int position, int y)所需的两个参数 position 和 y就都有了。
*注解:ListView.getChildAt(int position), 这个position指的是在可视的item中的索引,跟cursor里的位置是大不一样的。可以看看ListView.getChildCount()函数得到个数是小于或等于Cursor里的个数的(不考虑header的话)。虽然一共可能有20条数据,但是界面只能看到8条,那么这个ChildCount大约就是8了。另一方面, FirstVisiblePosition取出的是在总的条数中的索引,再将会消失的header考虑进来,所以就是 FirstVisiblePosition为0时要设为1,大于0时又要设为0。
下面上代码:
调用的代码:
int headerCount = mListContainer.getListView().getHeaderViewsCount();
int firstVisiblePos = mListContainer.getListView().getFirstVisiblePosition();
int newCursorPosition = getPositionInNewCursor(cursor.getCount(), firstVisiblePos);
int offsetY = getOffsetY(cursor, firstVisiblePos, newCursorPosition);
mAdapter.changeCursor(cursor);
mUpRefreshLayout.setVisibility(View.GONE);
mListContainer.getListView().setSelectionFromTop(newCursorPosition + headerCount, offsetY);
getPositionInNewCursor函数:
private int getPositionInNewCursor(int newCursorCount, int firstVisiblePos){
if(firstVisiblePos == 0){
firstVisiblePos += 1;
}
int headerCount = mListContainer.getListView().getHeaderViewsCount();
int newCursorPos = newCursorCount - mAdapter.getCount() + firstVisiblePos - headerCount;
return newCursorPos;
}
getOffsetY函数:
private int getOffsetY(Cursor cursor, int firstVisiblePos, int newCursorPosition){
int y;
View firstVisibleItem = null;
if(firstVisiblePos == 0){
firstVisibleItem = mListContainer.getListView().getChildAt(1);
}else{
firstVisibleItem = mListContainer.getListView().getChildAt(0);
}
y = firstVisibleItem.getTop();
View timeView = firstVisibleItem.findViewById(R.id.time_text_view);
if(timeView != null && timeView.getVisibility() == View.VISIBLE){
Cursor curItem = (Cursor)mAdapter.getItem(newCursorPosition);
Cursor preItem = (Cursor)mAdapter.getItem(newCursorPosition - 1);
if(curItem != null || preItem != null){
long curTimeStamp = curItem.getLong(MessagesProjection.JEDI_CREATE_DATE_INDX);
long preTimeStamp = preItem.getLong(MessagesProjection.JEDI_CREATE_DATE_INDX);
if(Math.abs(curTimeStamp - preTimeStamp) <= SHOW_TIME_STAMP_TEN_MINS){
LayoutParams param = (LinearLayout.LayoutParams)mTimeView.getLayoutParams();
y += mTimeView.getHeight() + param.topMargin + param.bottomMargin;
}
}
}
return y;
}
getOffsetY中有一段计算图中TimeStamp的高度的代码,不关心的可以自己跳过一下。因为查询出历史数据后可能会造成原先有TimeStamp的那一条在刷新后不再显示TimeStamp(与上一条合并到一个时间段了),所以要把它的高度也计算进去。
9. 如何样将listview按数值大小排序
Public Class Form1
Dim sortColumn As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For i = 0 To 100
ListView1.Items.Add(Int(Rnd() * 10000))
ListView1.Items(i).SubItems.Add(Int(Rnd() * 10000))
ListView1.Items(i).SubItems.Add(Int(Rnd() * 10000))
ListView1.Items(i).SubItems.Add(Int(Rnd() * 10000))
Next
End Sub
Private Sub ListView1_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
Dim columnsort As New ColumnSort(e.Column)
columnsort.bAscending = (ListView1.Sorting = SortOrder.Ascending)
If columnsort.bAscending Then
ListView1.Sorting = SortOrder.Descending
Else
ListView1.Sorting = SortOrder.Ascending
End If
ListView1.ListViewItemSorter = columnsort
ListView1.ListViewItemSorter = Nothing
End Sub
Public Class ColumnSort : Implements IComparer
Private columnNum As Integer = 0
Public bAscending As Boolean = True
Public Sub New(ByVal column_to_sort As Integer)
columnNum = column_to_sort
End Sub
Private Function CompareInt(ByVal x As Integer, ByVal y As Integer) As Integer
If x > y Then
Return 1
ElseIf x < y Then
Return -1
Else
Return 0
End If
End Function
Public Function Compare(ByVal a As Object, ByVal b As Object) As Integer Implements IComparer.Compare
Dim listItemA As System.Windows.Forms.ListViewItem = DirectCast(a, System.Windows.Forms.ListViewItem)
Dim listItemB As System.Windows.Forms.ListViewItem = DirectCast(b, System.Windows.Forms.ListViewItem)
Dim xText As String = listItemA.SubItems(columnNum).Text
Dim yText As String = listItemB.SubItems(columnNum).Text
Dim xInt As Integer, yInt As Integer
If bAscending Then
If Integer.TryParse(xText, xInt) AndAlso Integer.TryParse(yText, yInt) Then
Return CompareInt(xInt, yInt)
Else
Return [String].Compare(xText, yText)
End If
Else
If Integer.TryParse(xText, xInt) AndAlso Integer.TryParse(yText, yInt) Then
Return -1 * CompareInt(xInt, yInt)
Else
Return -1 * [String].Compare(xText, yText)
End If
End If
End Function
End Class
End Class
10. 急,listview显示内容如何排序
function ListViewCompare(lParam1, lParam2, lParamSort: Integer): Integer stdcall;begin //lParam1是第一个Item,lParam2是第二个Item, //内部用的是快速排序,体系会给你两个Item让你比较,procere TForm1.ListView1ColumnClick(Sender:TObject); //比较的规矩由你决定,我这里是简单的比较字符串。 Result := Comparetext(TListItem(lParam1).Text, TListItem(lParam2).Text);end;begin Listview1.CustomSort(ListViewCompare, 0); //应当是CustomSort。 //不是膳绫擎说的Sort,记错了。end;