1

ListView があり、リストの条件に応じてフッターを追加/削除することがよくあります。進行状況ビューが表示されることもあれば、エラー ビューなどが表示されることもあります。ポイントは、フッター ビューを頻繁に交換する必要があることです。ただし、アダプターを設定またはリセットする前にフッター ビューを追加する必要があるため、既存のフッター ビューを削除して新しいフッター ビューに置き換えると、奇妙な例外が発生することがよくあります。はい、フッター ビューを削除した直後に null ポインター例外とアダプター クラス キャスト例外が発生しました。

つまり、結論としては、複数のフッター ビューを維持するのは難しく、冗長で面倒ですが、フッターの領域は便利です。

そのため、コンテナになるフッターを1つだけ持つことを考えていました。このフッターを最初に設定し、必要に応じてサブフッタービューをフッタービューに追加/削除/非表示にします。

これはこれを処理する最良の方法ですか?既存のフッター ビューにサブ フッター ビューを追加すると、アダプターをリセットせずにフッター ビューが適切に更新されますか?

アダプターをリセットせずにフッター ビューを更新するオプションはありますか? 他の人々はこれをどのように扱っていますか?

4

2 に答える 2

1

ListView は、項目が画面に出入りするときに項目を作成および破棄することに注意してください。そのため、アイテムを個別に参照すると、null ポインター例外やその他の多くのエラーが発生する可能性が非常に高くなります。あなたの実際の問題はまさにそれであり、さまざまな種類のフッターではありません。

そのため、フッターを処理する前に、項目が実際に表示されていることを確認してください (null ではなく、完全にまたは部分的に画面内に表示されます)。

コードを投稿したほうがよいでしょう。特定の (より良い) ソリューションをターゲットにすることができるかもしれません。

于 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 に答える