2017-04-06 15 views
2

ListViewにはカスタムArrayAdapterがあります。 すべて正常に動作しますが、最初のアップデートでは空になります。android ArrayAdapter.clear()はカスタムメソッドの変数を消去します

マイ配列アダプタ:私は私の値を更新すると

protected class ResultArrayAdapter extends ArrayAdapter<JsonObject> { 
    private ArrayList<JsonObject> values; 
    protected ResultArrayAdapter(ArrayList<JsonObject> values) { 
      super(context, R.layout.content_result_item, values); 
      this.values = values; 
    } 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { ... } 
    public void updateValues(ArrayList<JsonObject> values) { 
     //here values.size() > 0 and everything OK 
     this.clear(); 
     //here values.size() == 0, why?? 
     for (JsonObject value : values) { 
      this.add(value); 
     } 
     this.notifyDataSetChanged(); 
    } 
} 

、私はupdateValues()を呼び出し、this.clear()を呼び出した後も、このメソッドのパラメータArrayList<JsonObject> valuesは空です。したがって、this.add(value)で追加する値はありませんが、初めての場合はonUpdate()の後になります。

ArrayList<JsonObject> valuesの名前を変更するか、別のパラメータに保存することは役に立ちません。

+2

ArrayAdapterはコンストラクタとclearメソッドで渡されたArrayList参照を格納するので、それをクリアします(必ずしもフィルタリングに気付かないでください!!!)... addの後にアダプタを通知する必要はありません方法。代わりに値を更新するaddAllメソッドを使用して – Selvin

+0

私は正しいとは思わない "これをクリア"、あなたはArrayList をクリアする必要があります。 – oscargc

答えて

1

はこれを試してみてください:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { ... } 
public void updateValues(ArrayList<JsonObject> newValues) { 
    //here values.size() > 0 and everything OK 
    values.clear(); 

    //here values.size() == 0, why?? 
    for (JsonObject value : newValues) { 
     values.add(value); 
    } 

    this.notifyDataSetChanged(); 
} 
+0

thx、しかし、すでに試してみました...うまくいきません – wendt88

1

あなたがArrayListの同じインスタンスに値を更新しているようにあなたがコンストラクタで設定しているようです。外部から初期値を設定しないことでこれを上回る可能性があります。また、あなたのクラスに実際にvaluesのメンバーが必要ではありません。

protected class ResultArrayAdapter extends ArrayAdapter<JsonObject> { 
    protected ResultArrayAdapter(List<JsonObject> values) { 
     super(context, R.layout.content_result_item, new ArrayList<JsonObject>()); 
     updateValues(values); 
    } 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { ... } 
    public void updateValues(List<JsonObject> values) { 
     this.clear(); 
     this.addAll(values); 
     this.notifyDataSetChanged(); 
    } 
} 

また、あなたは、forループ内代わりadd()addAll()を使用して、代わりにArrayListListを提供することができます。あなたが好きなら、Collectionを選択することさえできます。

0

問題があった。そうthis.clear()は私の値をクリア

ListView resultsView = (ListView)findViewById(R.id.results); 
ResultArrayAdapter adapter = (ResultArrayAdapter)resultsView .getAdapter(); 
if(adapter == null){ 
    adapter = new ResultArrayAdapter(MyActivity.this, values); 
    resultsView .setAdapter(adapter); 
} else { 
    adapter.updateValues(values); 
} 

:私は、私は次のように初期化され、それを持つ値でarrayadapterを更新した場合。例えば私の配列のアダプタを値リスト1で初期化してから、値リスト2で更新するので、値リスト1で再度更新すると空になりました。 私のworkaraoundはあなたの例を組み合わせたものなので、THX!

protected class ResultArrayAdapter extends ArrayAdapter<JsonObject> { 
    private ArrayList<JsonObject> values; 
    protected ResultArrayAdapter(Context context, ArrayList<JsonObject> values) { 
     super(context, R.layout.content_result_item, new ArrayList<JsonObject>()); //passing new fake values 
     this.values = values; //without this, it crashes 
     updateValues(values); 
    } 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { ... } 
    public void updateValues(List<JsonObject> values) { 
     this.clear(); 
     this.addAll(values); 
    } 
} 
関連する問題