1

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

所以底线:维护几个页脚视图是困难的、冗长的和严重的,但页脚空间很有用。

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

这是处理这个问题的最好方法吗?如果我将子页脚视图添加到现有的页脚视图中,页脚视图是否会正确刷新而不重置适配器?

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

4

2 回答 2

1

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

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

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

于 2012-10-04T04:28:02.327 回答
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
    }
    

希望这会有所帮助...

于 2012-10-05T06:13:50.063 回答