0

ListView の ArrayAdapter のデータの更新に問題があり、listAdapter.notifyDataSetChanged() でも変更が ListView に反映されていません。

興味深いのは、初期ロードが問題ないことです。ListView でレンダリングされたデータの完全なリストを取得します。アクティビティを 2 回目にロードすると、キャッシュされた ArrayList が setDataList() メソッドに渡されてレンダリングされません。結果の ListView には、onCreate() メソッドの単一のデフォルト エントリ セットアップのみが含まれます。

コードをデバッグし、ランナブルをステップ実行しましたが、最終結果がなくても、期待どおりに実行されているように見えます。

誰かがこれを手伝ってくれるなら、私は本当に感謝しています.

私のコードスニペット:

public class CriteriaOriginIncludeActivity extends Activity {   

private CriteriaOriginIncludeController m_controller;
private CriteriaOriginIncludesAdapter m_listAdapter;
private ArrayList<OriginRowData> m_listData;
private ListView m_originList;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.criteria_origin_includes);      
    ArrayList<OriginRowData> list = new ArrayList<OriginRowData>();
    list.add(new OriginRowData(new Origin(0,""), false));

    m_listAdapter = new CriteriaOriginIncludesAdapter(this,
                                                                R.layout.origin_include_list_row,
                                                                R.id.lst_origin_include,
                                                                list);

    m_originList = (ListView) this.findViewById(R.id.lst_origin_include);
    m_originList.setAdapter(m_listAdapter);

    m_controller = new CriteriaOriginIncludeController(this);

}

public void setOriginList(ArrayList<OriginRowData> list) {

    if (list != null && list.size() > 0) {
        m_listData = list;
    } else {
        m_listData = new ArrayList<OriginRowData>();
    }

    runOnUiThread(returnRes);
}

private Runnable returnRes = new Runnable() {

public void run() {

    m_listAdapter.clear();
    if(m_listData != null && m_listData.size() > 0){
        m_listAdapter.notifyDataSetChanged();
        for(int i=0;i<m_listData.size();i++)
            m_listAdapter.add(m_listData.get(i));
    }
    m_listAdapter.notifyDataSetChanged();
}
};
}

そしてアダプター:

public class CriteriaOriginIncludesAdapter extends ArrayAdapter<OriginRowData> {
private ArrayList<OriginRowData> m_items;
    private Context m_context;

    public CriteriaOriginIncludesAdapter(Context context, int resourceId, int           textViewResourceId, ArrayList<OriginRowData> list) {
      super(context, resourceId, textViewResourceId, list);
      this.m_context = context;
      m_items = list;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      View v = convertView;
      if (v == null) {
        LayoutInflater vi = (LayoutInflater)m_context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.origin_include_list_row, null);
      }
      OriginRowData o = m_items.get(position);
      if (o != null) {
        TextView txtName = (TextView) v.findViewById(R.id.txt_origin_include_name);
        TextView txtId = (TextView) v.findViewById(R.id.txt_origin_include_id);
        CheckBox chkOrigin = (CheckBox) v.findViewById(R.id.chk_origin);

        if (txtName != null) {
          txtName.setText(o.getOrigin().getOrigin());                            
        }
        if (txtId != null) {
          txtId.setText(Integer.toString(o.getOrigin().getId()));                            
        }
        if (chkOrigin != null) {
          chkOrigin.setChecked(o.getInclude());

          chkOrigin.setOnClickListener(new OriginIncludeOnClickListener(position));
        }

      }

      return v;
   }

}
4

1 に答える 1

0

ArrayAdapterAdd()メソッドをオーバーライドする必要があります。

独自の private を使用しているためprivate ArrayList<OriginRowData> m_items;、デフォルトのAdd()メソッドは、この配列リストにデータを追加する必要があることを知りません。

getView ではm_items配列を使用しているため、これを更新する必要があります。デフォルトのAdd()メソッドは、項目を ArrayAdapter の組み込みに追加します

于 2013-02-17T10:55:23.430 に答える