ListAdapter 不使用 notifyDataSetChanged 更改数据?

ListAdapter not change data with notifyDataSetChanged?

我有一个带有 ListView 和 ListAdapter 的 Fragment,在这个 Fragment 中我有一个 volley 方法来获取 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();
    }

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();
}
 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 否则你的数据永远不会填充到适配器中。

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

    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();
        }
}