2010-06-01 92 views
23

我想知道是否有可能在listview中只重新渲染一個元素?我假設通過調用notifyDatasetChanged()是要重新提交整個列表?Android:是否有可能刷新列表視圖中的一個項目?

謝謝,

+0

確實,notify ...告訴列表適配器已被修改。我不確定你可以更新一個元素。 – Sephy 2010-06-01 21:46:41

+1

這裏有一個類似的SO問題:http://stackoverflow.com/questions/3724874/android-update-single-item-in-list – 2010-12-21 19:28:14

+6

的Google,要注意**這些問題是非常非常古老的**。對於現代Android(2014+),您只需使用notifyDatasetChanged。它效率非常高,只能重畫屏幕上的內容。這些天使用現代「HolderView」模式至關重要。所以這都不是問題。 – Fattie 2014-06-26 14:42:44

回答

11

你可以,但它有點複雜。您必須獲取列表中第一個可見項目的索引,然後使用它來確定該項目需要更新的可視項目列表的距離,然後獲取其視圖並在那裏更新它。

只需撥打notifyDatasetChanged()就容易多了。你

+0

以及如何獲得列表中第一個項目的索引?可能有性能的原因,爲什麼刷新整個列表是不可取的 – Marchy 2012-03-31 03:14:02

+0

你只需要在ListView上調用'getFirstVisiblePosition()'。 http://developer.android.com/reference/android/widget/AdapterView.html#getFirstVisiblePosition() – CaseyB 2012-04-02 16:56:59

+0

@CaseyB可以幫助我解決這個問題http:// stackoverflow。com/questions/18312539/update-the-value-of-item-in-the-listview-android?noredirect = 1#comment26873838_18312539 – Developer 2013-08-19 12:36:20

3

也可以使用此:

myListView.invalidateViews(); 
+4

似乎不起作用。 – manmal 2012-02-27 11:17:03

+0

它可以工作,但大部分時間都會延遲重繪所有頁面。 – AVEbrahimi 2015-02-10 07:05:51

3
dataAdapter.remove(dataAdapter.getItem(clickedpos)); 

dataAdapter.insert(t.getText().toString(), clickedpos); 
1

你需要保持你的適配器的軌道(或定製適配器如果您在花哨的功能設置)。當您更改項目的數據時,只需在適配器中更改您感興趣的字段。 然後調用notifyDatasetChanged,這些更改將反映在您的列表視圖中。

請注意,此方法對於圖庫視圖也完全相同。

18

你不能渲染(刷新)單行,而是你可以得到所要求的視圖,並直接通過調用yourListView.getChildAt(int VisiblePosition);,其中visiblePostion是在ListView減去位置yourListView.getFirstVisiblePosition()

這個方法使它chages :

View v = listViewItems.getChildAt(position - 
      listViewItems.getFirstVisiblePosition()); 
    v.setBackgroundColor(Color.GREEN); 

我希望這有助於...

+0

當然,它確實有幫助..感謝很多 – 2013-06-11 18:04:00

+0

+1:這正是我正在尋找。 – PeteH 2013-06-16 21:34:56

+0

+10這真的在我的應用程序中節省了很多實施 – 2014-02-24 15:55:28

3

這是我做的:

您的項目(行)必須具有唯一的ID,以便稍後進行更新。當列表從適配器獲取視圖時,設置每個視圖的標記。 (您也可以使用鍵標籤如果默認標籤用於其他地方)

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View view = super.getView(position, convertView, parent); 
    view.setTag(getItemId(position)); 
    return view; 
} 

對於更新檢查列表的每一個元素,如果與給定id的看法是有它的可見的,必須對其執行更新。

private void update(long id) 
{ 

    int c = list.getChildCount(); 
    for (int i = 0; i < c; i++) 
    { 
     View view = list.getChildAt(i); 
     if ((Long)view.getTag() == id) 
     { 
      // update view 
     } 
    } 
} 

它實際上比其他方法更容易,當你處理ID不是位置時更好!此外,您必須考慮情景,以便您的視圖再次隱身並可見。

+0

標籤的想法幫助我解決了這個問題 - 我從同一個佈局文件中獲得動態數量的視圖,並且不得不以某種方式檢查我是哪一個改變。 – JakeP 2014-07-23 11:02:04

相關問題