为了账号安全,请及时绑定邮箱和手机立即绑定

如何更新ListView中的一行?

如何更新ListView中的一行?

呼唤远方 2019-07-15 09:38:59
如何更新ListView中的一行?我有一个ListView显示新闻。它们包含一个图像,一个标题和一些文本。映像被加载到一个单独的线程中(包含一个队列和所有的线程),当图像被下载时,我现在调用notifyDataSetChanged()在列表适配器上更新映像。这很管用,但是getView()经常被打电话,因为notifyDataSetChanged()打电话getView()所有可见的物品。我只想更新列表中的单个项目。我该怎么做?我目前的做法有以下问题:滚动很慢我有一个淡入动画在图像上发生,每次一个新的图像在列表中被加载。
查看完整描述

3 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

您确实可以使用View#getChildAt(int index)..问题是它从第一个可见项开始计数。事实上,你只能得到可见的项目。你用ListView#getFirstVisiblePosition().

例子:

private void updateView(int index){
    View v = yourListView.getChildAt(index - 
        yourListView.getFirstVisiblePosition());

    if(v == null)
       return;

    TextView someText = (TextView) v.findViewById(R.id.sometextview);
    someText.setText("Hi! I updated you manually!");}


查看完整回答
反对 回复 2019-07-15
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

我就是这样做的:

您的项(行)必须具有唯一的ID,以便以后可以更新它们。当列表从适配器获取视图时,设置每个视图的标记。(如果默认标记在其他地方使用,也可以使用Key标记)

@Overridepublic 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而不是位置时更好!此外,您还必须调用更新的项目,使之可见。


查看完整回答
反对 回复 2019-07-15
  • 3 回答
  • 0 关注
  • 530 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信