2016-06-26 14 views
0

私はこの文脈で他の多くの記事を見てきましたが、役に立たなかったのです。問題は、addFieldボタンをクリックすると、ダイアログ内のリストビューが新しいビューを1回追加するだけです。しかし、他のクリックでは更新されませんが、アダプタは正しく動作します(つまり、getViewが呼び出され、アダプタのarrayListのサイズが変更されたことを意味します)。arraylistが更新された後、リストビューが更新されませんか?

アダプタクラスでnotifyDataSetChanged()を使用しました。検索結果はありません!私はアクティビティでadpaterクラスのインスタンスを使用し、myAdapter.notifyDataSetChanged()を呼び出しました。検索結果はありません!

は、ここに私のコードです:

public class MainActivity extends Activity { 

ListView lvfid; 
FieldAdapter fAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //some code 
    showFid(); 
} 

private void showFiD(){ 
    final ArrayList <HashMap<String,String>> al = new ArrayList<HashMap<String,String>>(); 
    final Dialog dialog = new Dialog(MainActivity.this , R.style.DialogTheme); 
    dialog.setContentView(R.layout.field_dialog); 
    dialog.setCancelable(true); 
    dialog.show(); 
    Button addField = (Button) dialog.findViewById(R.id.btnfidField); 
    lvfid = (ListView) dialog.findViewById(R.id.lvfid); 
    //Another plan i have tested, but no result: 
    //fAdapter = new FieldAdapter(dialog.getContext(),al); 
    //lvfid.setAdapter(fAdapter); 
    addField.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      HashMap<String,String> h = new HashMap<String,String>(); 
      h.put("name", ""); 
      h.put("value", ""); 
      al.add(h); 
      lvfid.setAdapter(new FieldAdapter(dialog.getContext(), al)); 
      //fAdapter.notifyDataSetChanged(); 

     } 
    }); 
} 

public class FieldAdapter extends BaseAdapter{ 

private ArrayList <HashMap <String,String>> arrayList; 
private LayoutInflater inflater; 

public FieldAdapter(Context context, ArrayList<HashMap <String,String>> arrayList) { 
    inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.arrayList = arrayList; 
} 

@Override 
public int getCount() { 
    return arrayList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return position; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 


@Override 
public View getView(int position, View convertView, ViewGroup arg2) { 
    View view = null; 
    if (convertView == null) 
     view = inflater.inflate(R.layout.field_inflater, null); 
    else 
     view = convertView; 
    Holder holder = new Holder(); 
    holder.edName  = (EditText) view.findViewById(R.id.edfidName); 
    holder.edValue  = (EditText) view.findViewById(R.id.edfidValue); 
    //holder.edName.setText(arrayList.get(position).get("name")); 
    //holder.edValue.setText(arrayList.get(position).get("value")); 
    return view; 
} 

private class Holder { 
    private EditText edName; 
    private EditText edValue; 
} 


} 

} 

UPDATE: は私がみんなの時間がかかりましたごめんなさい。愚かな問題は、私のリストビューがスクロールビューの中にあってはいけないということでした!私はこれが同じ問題を抱えている人たちに役立つことを願っています

+0

リストが更新されるたびにnotifyDataSetChanged()を使用します。 –

+1

lvfid.setAdapterは一度だけ行うべきだと思います – user3793589

答えて

0

私は皆さんの時間をとって申し訳ありません!愚かな問題はちょうど私のリストビューはスクロールビューの中にあってはいけませんでした!スクロールビューからリストビューを取り出した後、問題は解決しました。

0

リストが更新されるたびにnotifyDataSetChanged()を使用してください。

+0

実際には、私はそれをしましたが、結果はありませんでした!質問を更新してnotifyDataSetChanged()メソッドを追加しました。 – sinfa

0

私は同じ問題を抱えていました。私はonDateChanged()の後にlistViewを更新したいときに、この問題に直面していました。あなたのケースに余分なArrayList変数と余分なカスタムアダプタを付けて解決しましたFieldAdapter変数。

任意の操作の後、リフレッシュアダプタと配列リスト変数を使用してlistViewを更新します。たとえば、ボタンをクリックした後。

カウンタを定義します。
2.チェックボタンがクリックされたときに、1
によってカウンタを増やすたびにカウンタをチェックし、カウンタが1より大きい場合には、ボタンを一度そうしてリストビューを更新する以上クリックされた意味新しい変数(arrayList, FeildAdapter)

私はプライベートクラスのフィールドとして変数を定義して、そのようなrefreshedArrayListrefreshedAdapter

0
  1. オプション
  2. 01としてそれらに名前を付けることをお勧めします

    ArrayAdapterを使用してください。 ボタンをクリックするたびに、新しいアダプタを作成しないでください。

    は、ArrayAdapterからadd(T o)関数を呼び出すだけです。

    <オール開始=「2」>
  3. その他のオプション:

あなたのArrayListにオブジェクトを追加し、notifiyDataSetChangedを呼び出す追加フィールドアダプタであなたのFieldAdapterに追加機能を追加(アダプタがaslo 1を持っており、アダプタはすべてのオブザーバに通知します)

また、ボタンをクリックするたびに新しいアダプタを作成しないでください。

0
public class MainActivity extends Activity { 

ListView lvfid; 
FieldAdapter fAdapter; 
ArrayList <HashMap<String,String>> al ; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //some code 

    al = new ArrayList<HashMap<String,String>>(); 
    lvfid.setAdapter(new FieldAdapter(MainActivity.this , al)); 

    showFid(); 
    } 

    private void showFiD(){ 
     final Dialog dialog = new Dialog(MainActivity.this , R.style.DialogTheme); 
     dialog.setContentView(R.layout.field_dialog); 
     dialog.setCancelable(true); 
     dialog.show(); 
     Button addField = (Button) dialog.findViewById(R.id.btnfidField); 
     lvfid = (ListView) dialog.findViewById(R.id.lvfid); 
     //Another plan i have tested, but no result: 
     //fAdapter = new FieldAdapter(dialog.getContext(),al); 
     //lvfid.setAdapter(fAdapter); 
     addField.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      HashMap<String,String> h = new HashMap<String,String>(); 
      h.put("name", ""); 
      h.put("value", ""); 
      al.add(h); 
      fAdapter.notifyDataSetChanged(); 

     } 
    }); 
} 
+0

ありがとうございますが、これはテストされていますか? lvfidがダイアログコンテキストにあるため、lvfid.setAdapterはonCreateで呼び出すことができません。 – sinfa

+0

上記の編集コードを使用してください。 – Drv

関連する問題