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;