ListAdapter不使用notifyDataSetChanged更改数据?

时间:2015-01-20 11:18:30

标签: android listview android-fragments listadapter

我有一个带有ListView和ListAdapter的片段,在这个Fragment中我有一个凌空方法来获取web服务的一些信息。我在ListView中添加了这些信息,问题是当我尝试用其他信息更改适配器时,适配器不会更改。

当方法执行第一次确实有效时,因为适配器等于null而我确实定义了它,但是当我回到片段addToBackStack()时不起作用。我添加了onResume(),但也没有工作。

我该怎么做?

片段

public class FormCidadesFrag extends Fragment implements AdapterView.OnItemClickListener{
    private ListView lvCidades;
    private ProgressDialog progress;
    private static List<Cidade> lista;
    private CidadesListAdapter cidadeLA;
    private final String TAG = getClass().getSimpleName() + "->";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ((CustomDrawerLayout)getActivity()).getSupportActionBar().show();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.frm_cidades, container, false);
        lvCidades = (ListView)view.findViewById(R.id.lvCidades);
        lvCidades.setOnItemClickListener(this);

        // action bar title
        ActionBar actionBar = ((CustomDrawerLayout)getActivity()).getSupportActionBar();
        actionBar.setTitle("Guia Store");

        return  view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        getAllCidades();
        super.onActivityCreated(savedInstanceState);
    }


    /** retorna todas as cidades */
    private void getAllCidades(){
        progress = new CustomProgressDialog().getCustomProgress("Buscando cidades...", getView().getContext());
        progress.show();
        ApplicationController app = new CidadeDAO().getAllCidades(new CidadeAdapter(){
            @Override
            public void getAllCidades(List<Cidade> list) {
                if(!list.isEmpty()){
                    lista = list;
                    if(cidadeLA == null){
                        //works
                        cidadeLA = new CidadesListAdapter(lista, getView().getContext());
                        lvCidades.setAdapter(cidadeLA);
                    }else{
                        //not works
                        cidadeLA.changeList(lista);
                    }
                }
                progress.dismiss();
            }
        });
        CustomVolleySingleton.getInstance(getView().getContext()).addToRequestQueue(app);
    }

适配器

public class CidadesListAdapter extends BaseAdapter{
    private List<Cidade> list;
    private Context context;

    public CidadesListAdapter(List<Cidade> list, Context context) {
        this.list = list;
        this.context = context;
    }

    //change adapter
    public void changeList(List<Cidade> list){
        this.list = list;
        notifyDataSetChanged();
    }

3 个答案:

答案 0 :(得分:2)

notifyDataSetChanged将检查您是否在更新数据时调用了clear,add,delete方法。因此,您必须使用提到的方法而不是分配列表this.list = list

//change adapter
public void changeList(List<Cidade> list){
    this.list.clear();
    for(Cidade item: list){
        this.list.add(item);
    }
    notifyDataSetChanged();
}

答案 1 :(得分:0)

 if(cidadeLA == null){
                    //works
                    cidadeLA = new CidadesListAdapter(lista, getView().getContext());
                    lvCidades.setAdapter(cidadeLA); 
                    notifyDataSetChanged();

                }else{
                    //not works
                    cidadeLA.changeList(lista);
// notifyDataSetChanged();
                }

来自您的代码,

1)首先如果条件有效,   在setAdapter之后,您需要调用notifyDataSetChanged()。

2)同意@edisonthk你需要从你的方法中移出notifyDataSetChanged()。

3)放入Log.d();要认真检查它,你会得到第一个条件为null,否则你的数据永远不会填入适配器。

答案 2 :(得分:0)

你需要实现一些像这样的回调

    public class CidadesListAdapter extends BaseAdapter{
        private List<Cidade> list;
        private Context context;

        public CidadesListAdapter(List<Cidade> list, Context context) {
            this.list = list;
            this.context = context;
        }

        //change adapter
        public void changeList(List<Cidade> list){
            this.list = list;
            notifyDataSetChanged();
        }

        public Object getItem(int pos)
        {
          return list.get(pos);
        }

        public int  getCount()
        { 
          return list.size();
        }
}