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