2010-06-01 94 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

相关问题