在片段中重新加载android视图

Posted

技术标签:

【中文标题】在片段中重新加载android视图【英文标题】:Reloading android view in a fragment 【发布时间】:2014-11-27 10:39:47 【问题描述】:

我在开发一个项目时使用 android Eclipse,用户可以在该项目中保存和上传带有图像的笔记。

我有一个片段,其中包含一个文本视图和一些缩略图。用户可以使用相机添加额外的图像,他们可以通过查看(单击)图像(在单独的活动中)并删除它来删除图像。

我的问题是刷新片段的布局以反映已删除的图像。目前正在调用以下函数来处理此问题:

public ViewGroup removeNoteImageFromView(String location) 
    List<String> imageLinks = new ArrayList<String>();

    for (String string : imageLocations) 
        if (string.equalsIgnoreCase(location)) 
            break;              
        
        imageLinks.add(string);
    

    //REMOVE ALL THE IMAGEVIEWS from the Linear Layout
    LinearLayout linear = (LinearLayout) rootView.findViewById(R.id.imageContainer);
    if (linear.getChildCount() != 0) 
        linear.removeAllViewsInLayout();
        linear.refreshDrawableState();
        linear.postInvalidate();

    

    imageLocations.addAll(imageLinks);
    //Add them all back from the new array
    String root = Environment.getExternalStorageDirectory().toString();

    for (String string : imageLinks) 
        Bitmap myBitmap = BitmapFactory.decodeFile((new File(root +"/saved_images/"+string)).getAbsolutePath());
        addImage(myBitmap);
    
    return linear;

此代码所做的只是隐藏所有由 linear.removeAllViewsInLayout() 调用的缩略图。然而,以下两行是我认为会在屏幕上重新加载布局的内容,但它们似乎没有任何效果。

请注意,我已尝试过 linear.invalidate() 和 postInvalidate,但仍然一无所获。

正确的图像已从设备中删除,因为这是在其他地方处理的,所以当我通过在菜单中重新选择它返回到此片段时,所有内容都会正确显示。

【问题讨论】:

这段代码没有什么意义,因为你已经将一个字符串从 imageLocations 添加到 imageLinks 即 imageLinks.add(string);然后再次将相同的字符串读取到 imageLocations imageLocations.addAll(imageLinks);您似乎在阅读之前跳过了清除列表。 @humblerookie 问题是我是 android/java 开发的新手,这是我的第一个项目,我之前的一些开发人员已经完成了,所以大部分代码甚至不是我的。害怕:/ 嘿,我明白了,但是,为什么要从 list(imagelocations) 本身向 List (imagelocations) 添加另一个字符串。我正在反思上面代码使用的这个逻辑。只需通过代码观察您对 imageLocation List 所做的操作 这很公平。我想只有以前的开发人员可以回答这个问题哈哈 我暗示的是你需要做一个 removeAll() 而不是 addAll() 即 imageLocations.addAll(imageLinks) 到 imageLocations.removeAll(imageLinks) 和 for (String string : imageLinks) 到 for (字符串字符串:imageLocations) 【参考方案1】:

替换这个:

linear.refreshDrawableState();
linear.postInvalidate();

有了这个:

linear.requestLayout();

【讨论】:

还是没什么好怕的:/【参考方案2】:
@Override
    public View getView(int position, View convertView, ViewGroup parent) 

  // Your code is here...
 // for refresh view use..
 convertView.invalidate();


【讨论】:

我无法让它有所作为。我已经尝试将我的所有代码从 removeNoteImageFromView 放到这里并改为调用它,但没有区别。这是我需要做的还是我是个白痴?【参考方案3】:

好吧,我终于明白了!

我觉得有点愚蠢,因为代码运行良好,但根路径不正确,因此找不到要添加回视图的图像。

感谢您的所有回复和帮助。对不起,我的新手(我只正确使用了几个星期的 Java)。

【讨论】:

以上是关于在片段中重新加载android视图的主要内容,如果未能解决你的问题,请参考以下文章

android如何跨片段分离/附加保留视图状态

何时从android中的布局加载片段中的视图

单击ListViewItem时Android加载片段

Android - 新的 BottomNavigationBar 中的 PageView - 防止重新加载片段

使用 BottomBar 和片段容器禁用 Android 片段重新加载

Android:NullPointerException 无法将数据库加载到片段内的列表视图中