如何在Android中维护多个页脚视图?

时间:2012-10-04 02:15:56

标签: android android-layout

我有一个ListView,并且经常根据列表条件添加/删除页脚。有时会显示进度视图,有时会显示错误视图等。重点是我经常需要换出页脚视图。但是在设置或重置适配器之前必须添加页脚视图,因此在删除现有页脚视图以将其替换为新页脚视图时通常会出现奇怪的异常。是的,我已经获得了空指针异常,并且在删除页脚视图时,适配器类强制转换异常!

所以最重要的是:它的难度和冗长程度以及保持多个页脚视图,但是页脚空间是有用的。

所以我考虑只有一个只是一个容器的页脚,在开头设置这个页脚,然后根据需要添加/删除/隐藏子页脚视图到页脚视图。

这是处理此问题的最佳方法吗?如果我将子页脚视图添加到现有的页脚视图,脚注视图是否会在不重置适配器的情况下正确刷新?

页脚视图是否有刷新选项而不重置适配器?其他人如何处理这个问题?

2 个答案:

答案 0 :(得分:1)

请记住,ListView会在项目进入或离开屏幕时创建并丢弃这些项目。因此,如果您独立引用这些项,很可能会出现空指针异常和许多其他错误。 你的实际问题正是这个而不是不同类型的页脚。

因此,在处理页脚之前,请确保该项目实际上是可见的(不是空的,而是在屏幕内部完全或部分。)

更好地发布您的代码,也许我们将能够针对特定(更好)的解决方案。

答案 1 :(得分:0)

好的,这就是我的想法

  1. 定义数组适配器

    public class CustomArrayAdapter<T> extends ArrayAdapter<T>{
    
            // override all of the constructors as follows
    
            public CustomArrayAdapter(Context context, int textViewResourceId, T[] objects) {
                    super(context, textViewResourceId, objects);
            }
    
            public CustomArrayAdapter(Context context, int textViewResourceId, List<T> objects) {
                    super(context, textViewResourceId, objects);
            }
    
            public CustomArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects) {
                    super(context, resource, textViewResourceId, objects);
            }
    
            public CustomArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects) {
                    super(context, resource, textViewResourceId, objects);
            }
    
            public CustomArrayAdapter(Context context, int resource, int textViewResourceId) {
                    super(context, resource, textViewResourceId);
            }
    
            public CustomArrayAdapter(Context context, int textViewResourceId) {
                    super(context, textViewResourceId);
            }
    
            Map<View, View> footerMappings = new HashMap<View, View>();
    
            public View getView(int position, View recycleView, ViewGroup parent){
                    if(recycleView == null){
                            //Initialize the view here
                    } else {
                            //Clean up the view from old data
                    }
    
                    // Populate with current data
    
                    View footerView = create and assign the footer view here
    
                    this.footherMappings.put(recycleView, footerView); // this will overwrite the mappings that are out of the view
                    return recycleView;
            }
    
            public boolean isFooterVisible(View footerView){
                    Set<View> keys = this.footerMappings.keySet();
                    for(View key : keys){
                            if(this.footerMappings.get(key) == footerView){
                                    return true;
                            }
                    }
                    return false;
            }
    }
    
  2. 在ListView中使用CustomArrayAdapter

    ListView lv = new ListView(context);
    lv.setAdapter(new CustomeArrayAdapter(context, 0, your_object_list));
    
  3. 当您想要使用页脚进行操作时

    CustomeArrayAdapter adapter = (CustomeArrayAdapter)lv.getAdapter();
    if(adapter.isFooterVisible(your_footer_view)){
            // do whatever you want here
    } else {
            // footer is not in the view. Do something else
    }
    
  4. 希望这会有所帮助......