2011-04-16 107 views
9

如何找到ListView中特定項目的位置? (由SimpleCursorAdapter填充)。獲取ListView中項目的位置?

我問的原因:listview設置爲singleChoice模式。當用戶關閉並重新打開應用程序時,我希望用戶的選擇被記住。

到目前爲止,我做到這一點的方式是當用戶點擊一個項目時,所選項目的ID被保存到首選項。我需要學習的是如何在重新填充後重新選擇活動的onCreate方法中的項目。

我保存所選項目的ID代碼:

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

    Cursor c = (Cursor) l.getItemAtPosition(position); 
    selectedItem = c.getLong(c.getColumnIndex("_id")); 
} 

(我試着用搜索引擎,但似乎只找到如何讓選擇項目的位置)

謝謝!

回答

15

你應該嘗試

//SimpleCursorAdapter adapter; 
final int position = adapter.getCursor().getPosition(); 

API文檔:

public abstract int getPosition() 

自:API等級1

返回在 光標的當前位置行集。值爲 從零開始。當行集合第一個返回 時,光標將位於第一行之前的位置 -1。在最後一行返回後,另一個 調用next()將使光標 超過最後一個條目,位置爲 count()

返回 當前光標位置。

更新

爲了得到基於所使用的適配器的ID的項目的位置:

private int getItemPositionByAdapterId(final long id) 
{ 
    for (int i = 0; i < adapter.getCount(); i++) 
    { 
     if (adapter.getItemId(i) == id) 
      return i; 
    } 
    return -1; 
} 

爲了得到基於基本對象的屬性的項目的位置(部件值)

//here i use `id`, which i assume is a member of a `MyObject` class, 
//and this class is used to represent the data of the items inside your list: 
private int getItemPositionByObjectId(final long id) 
{ 
    for (int i = 0; i < adapter.getCount(); i++) 
    { 
     if (((MyObject)adapter.getItem(i)).getId() == id) 
      return i; 
    } 
    return -1; 
} 
+0

謝謝!但是,如果給出身份證,我將如何查看物品的位置? – Jodes 2011-04-16 06:55:03

+0

(抱歉,我希望我不會過於密集!!) – Jodes 2011-04-16 07:05:22

+0

不要擔心。你的意思是一個id,它是你渲染的底層對象的成員,或者是適配器使用的id(如果它們不相同)?無論如何,我只是更新了答案,也許它涵蓋了你所需要的信息 – rekaszeru 2011-04-16 07:07:05

1

當您說「...重新選擇活動的onCreate方法中的項目...」時,您的意思是當用戶重新選擇轉向ListView活動,無論以前選擇什麼項目,現在都在屏幕的頂部(假設足夠的項目出現在其下面的列表中)?

如果是這樣,那麼從onListItemClick開始,您還應該努力保存position的值,因爲它會告訴您所選項目列表中的位置。這將允許您不需要從_id反向查找位置。

或者是由於某種原因不適合您的目的?你真的需要從_id找出位置嗎?

+0

Thane,謝謝,是的這正是我所知道的NT。我不認爲使用這個職位是一個好主意,但也許我會訴諸於此。 – Jodes 2011-04-16 07:39:00

3

我做這個簡單的在自己的應用程序:

long lastItem = prefs.getLong(getPreferenceName(), -1); 
if (lastItem >= 0) { 
    cursor.moveToFirst(); 
    while (!cursor.isAfterLast()) { 
     if (lastItem == cursor.getLong(0)) { 
      spinner.setSelection(cursor.getPosition()); 
      break; 
     } 
     cursor.moveToNext(); 
    } 
} 

微調填充了光標的內容,所以我只是期待通過他們,並與所選擇的項目ID進行比較。在你的情況下,這將是一個ListView。

+0

這就是我一直在尋找的效果!我希望找到一種方法來遍歷所有項目,但也許這是不可避免的。謝謝 – Jodes 2011-04-16 07:41:09

+0

偉大的一段代碼。真的幫助沒有地方修改謝謝 – j2me 2012-04-17 09:24:40

+0

這可能是最快的解決方案,因爲它直接與支持數據,而不是視圖或適配器。 – WindRider 2014-02-03 19:36:17