我的ListFragment代码
public class ItemFragment extends ListFragment {
private DatabaseHandler dbHelper;
private static final String TITLE = "Items";
private static final String LOG_TAG = "debugger";
private ItemAdapter adapter;
private List<Item> items;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.item_fragment_list, container, false);
return view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.setHasOptionsMenu(true);
super.onCreate(savedInstanceState);
getActivity().setTitle(TITLE);
dbHelper = new DatabaseHandler(getActivity());
items = dbHelper.getItems();
adapter = new ItemAdapter(getActivity().getApplicationContext(), items);
this.setListAdapter(adapter);
}
@Override
public void onResume() {
super.onResume();
items.clear();
items …Run Code Online (Sandbox Code Playgroud) 这是我的代码
listview =(ListView) findViewById(R.id.lv1);
ArrayList<SClass> Monday = new ArrayList<SClass>();
SClass s1=new SClass();
s1.sName="samp";
s1.salary=1000;
Monday.add(s1);
temp=Monday;
adapter = new CustomAdap(this, temp);
listview.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常.但是当我将代码更改为此时
listview =(ListView) findViewById(R.id.lv1);
adapter = new CustomAdap(this, temp);
SClass s1=new SClass();
s1.sName="samp";
s1.salary=1000;
Monday.add(s1);
temp=Monday;
listview.setAdapter(adapter);
adapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
Listview没有显示任何内容.问题是什么?
我很难在基础数据发生变化时更新ListActivity.
我正在使用自定义(列表)适配器(CustomListAdapter)派生的vom BaseAdapter来使用自定义列表元素(CustomListElement)填充ListActivity.
有问题的元素可以通过用户交互或基础数据库中的更改随时间更改其基础数据.为了宣布所述更改,CustomListElement和CustomListAdapter对象可以注册DataSetObserver对象.
这本质上是这样做的(不幸的是发布整个代码会有点过分):
public class CustomListElement extends DataSetObservable {
protected Object value;
public void setValue(Object newValue) {
this.value = newValue;
notifyChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,CustomListElement通过继承DataSetObservable来提供registerDataSetObserver,并通过它的notifyChanged()方法宣布更改.
而对于CustomListAdapter:
public class CustomListAdaper extends BaseAdapter {
protected List<CustomListElement> elementList;
@Override
public void registerDataSetObserver(DataSetObserver observer) {
super.registerDataSetObserver(observer);
for (CustomListElement element : elementList)
element.registerDataSetObserver(observer);
}
}
Run Code Online (Sandbox Code Playgroud)
即观察者是"通过".
现在,在调用时
setListAdapter(new CustomListAdapter(customElementList));
Run Code Online (Sandbox Code Playgroud)
在ListActivity中,这应该在ListView的setAdapter方法中注册一个android.widget.AbsListView.AdapterDataSetObserver(从ListActivity的setListAdapter调用).
在通知已注册的DataSetObserver对象任何更改时,应调用AdapterDataSetObserver的onChanged方法以及ListView的requestLayout.这应该(据我的理解)刷新ListView.
但是,ListView不会使用新数据进行更新.
我意识到已经指出notifyDataSetChanged和(可能)notifyChanged应该在runOnUiThread环境中运行,但是这似乎不能解决问题.
我也意识到类似的问题出现了,但不是这个特定的android类,并且有不满意的答案.
我错过了什么吗?任何洞察为什么这个打破以及如何解决它非常感谢.
我的应用程序使用MultiColumnListView(https://github.com/huewu/PinterestLikeAdapterView),正如其名称所示,它有助于创建多列列表视图.
该库很棒,但正如它们指定的那样,不支持过滤.
因此,我尝试使用简单的编辑文本创建自己的文本过滤器功能.
最后我实现了过滤列表,但现在我需要刷新listView并调用setAdapter,因为我传递了列表.
MyAdapter adapter = new MyAdapter(this,myList);
listView.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)
当我执行listView.invalidateViews()或adapter.notifyDataSetChanged()listView刷新但使用旧列表.
哪个是调用setAdapter的最佳方法?或许是另一种方式这样做..
提前致谢
编辑:
//Method that filters the list
Log.i("On filter myList.size()",""+myList.size());
adapter.notifyDataSetChanged();
//on the Adapter
Log.i("On Adapter myList.size()",""+myList.size());
Run Code Online (Sandbox Code Playgroud)
日志:

适配器类:
public class MiAdaptadorListaComercios extends BaseAdapter{
//Textview and Imageviews declarations
private Context contexto;
private List<Comercio> myList;
public MiAdaptadorListaComercios(Context c,List<Comercio> myList){
this.contexto = c;
this.myList = new ArrayList<Comercio>();
this.myList = myList;
}
@Override
public int getCount() {
Log.i("On Adapter myList.size()",""+listaComercios.size());
return myList.size();
} …Run Code Online (Sandbox Code Playgroud)