我有一个带有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();
}
答案 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();
}
}