Android,java listview notifyDataSetChanged();不起作用
嗨,有人能看看这个,看看他们是否知道我哪里出了错。它工作正常,直到getThemeRedata()中的post-execute任务尝试将getThemeRedata和GetTheData中的条目追加到listview中。单击“加载更多”按钮时,不会出现错误,并且listview保持不变。Postexecute会触发,因为我可以在日志中看到数据。谢谢Android,java listview notifyDataSetChanged();不起作用,android,listview,Android,Listview,嗨,有人能看看这个,看看他们是否知道我哪里出了错。它工作正常,直到getThemeRedata()中的post-execute任务尝试将getThemeRedata和GetTheData中的条目追加到listview中。单击“加载更多”按钮时,不会出现错误,并且listview保持不变。Postexecute会触发,因为我可以在日志中看到数据。谢谢 SimpleAdapter mAdapter; String mCurFilter; List<Map<String, String&g
SimpleAdapter mAdapter;
String mCurFilter;
List<Map<String, String>> items = new ArrayList<Map<String, String>>();
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String letter = getActivity().getIntent().getStringExtra("LETTER");
new GetTheData().execute(letter);
final ListView lv = getListView();
Button btnLoadMore = new Button(getActivity());
btnLoadMore.setText("Load More");
lv.addFooterView(btnLoadMore);
lv.setTextFilterEnabled(true);
btnLoadMore.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
new GetTheMoreData().execute("A");
Log.i(TAG, "loadmore clicked : ");
}
});
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//room for stuff
}
});
setListShown(false);
getLoaderManager().initLoader(0, null, this);
}
private class GetTheMoreData extends AsyncTask<String, Void, List<Map<String, String>>> {
@Override
protected List<Map<String, String>> doInBackground(String... res) {
List<Map<String, String>> items = new ArrayList<Map<String, String>>();
start = start +25;
JSONObject json = JSONfunctions.getJSONfromURL("http://www.myurl.com/main.php?letter="+res[0]+"&start="+start);
try{
JSONArray songlist = json.getJSONArray("mainlist");
for(int i=0;i<songlist.length();i++){
HashMap<String, String> map = new HashMap<String, String>();
JSONObject e = songlist.getJSONObject(i);
map.put("id", String.valueOf(i));
map.put("Item", e.getString("Item"));
items.add(map);
Log.i(TAG, "dat:" + items);
}
}catch(JSONException e) {
Log.e("log_tag", "Error parsing data "+e.toString());
}
return items;
}
@Override
protected void onPostExecute(List<Map<String, String>> items) {
mAdapter.notifyDataSetChanged();
super.onPostExecute(items);
}
@Override
protected void onProgressUpdate(Void... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
}
private class GetTheData extends AsyncTask<String, Void, List<Map<String, String>>> {
@Override
protected List<Map<String, String>> doInBackground(String... res) {
JSONObject json = JSONfunctions.getJSONfromURL("http://www.myurl.com/main.php?letter="+res[0]+"&start=0");
try{
JSONArray songlist = json.getJSONArray("mainlist");
for(int i=0;i<songlist.length();i++){
HashMap<String, String> map = new HashMap<String, String>();
JSONObject e = songlist.getJSONObject(i);
map.put("id", String.valueOf(i));
map.put("Item", e.getString("Item"));
items.add(map);
}
}catch(JSONException e) {
Log.e("log_tag", "Error parsing data "+e.toString());
}
return items;
}
@Override
protected void onPostExecute(List<Map<String, String>> items) {
String[] from = new String[] { "Item" };
int[] to = new int[] { android.R.id.text1 };
mAdapter = new SimpleAdapter( getActivity(), items,
android.R.layout.simple_list_item_1, from, to );
setListAdapter( mAdapter );
super.onPostExecute(items);
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
switch( position )
{}
Log.i(TAG, "Item clicked: " + id);
}
// These are the rows that we will retrieve.
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// mAdapter.swapCursor(data);
// The list should now be shown.
if (isResumed()) {
setListShown(true);
} else {
setListShownNoAnimation(true);
}
}
public void onLoaderReset(Loader<Cursor> loader) {
// mAdapter.swapCursor(null);
}
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
// TODO Auto-generated method stub
return null;
}
simpledapter-mAdapter;
串滤波器;
列表项=新建ArrayList();
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
字符串字母=getActivity().getIntent().getStringExtra(“字母”);
新GetTheData().execute(字母);
最终ListView lv=getListView();
按钮btnLoadMore=新按钮(getActivity());
btnLoadMore.setText(“加载更多”);
lv.addFooterView(btnLoadMore);
lv.setTextFilterEnabled(真);
btnLoadMore.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图arg0){
新GetTheMoreData().execute(“A”);
Log.i(标记“loadmore clicked:”);
}
});
lv.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
//放东西的地方
}
});
SetListShowed(假);
getLoaderManager().initLoader(0,null,this);
}
私有类GetTheMoreData扩展异步任务{
@凌驾
受保护列表doInBackground(字符串…res){
列表项=新建ArrayList();
开始=开始+25;
JSONObject json=JSONfunctions.getJSONfromURL(“http://www.myurl.com/main.php?letter=“+res[0]+”&start=“+start”);
试一试{
JSONArray songlist=json.getJSONArray(“mainlist”);
对于(int i=0;i这是因为在gethemoredata
的方法doInBackground()
中,您可以:
List items=new ArrayList();
因此,将创建一个新列表,并将元素添加到一个仅存在于此方法中且未链接到适配器的列表中。
将此行改为:items.clear();
这是因为在gethemoredata
的方法doInBackground()
List items=new ArrayList();
因此,将创建一个新列表,并且您正在将元素添加到一个仅在此方法中存在且未链接到适配器的列表中。
将此行改为:items.clear();
看起来您从未将新数据添加到适配器中。是否要在调用notifyDataSetChanged之前将这些项添加到适配器中()?我试着添加字符串[]from=newstring[]{“Item1”};int[]to=newint[]{android.R.id.text1};mAdapter=new simpledapter(getActivity(),items,android.R.layou.simple_list_item_1,from,to);但是listview保持不变,尽管它确实在后台运行,因为我可以看到日志。这是actionbarsherlock中的一个片段。我做了一个基本测试,没有片段等,只调用notifydatasetchanged就可以了。看起来您从未将新数据添加到适配器中。是否要将项目添加到适配器中在调用notifyDataSetChanged()之前,我试着添加字符串[]from=new String[]{“Item1”};int[]to=new int[]{android.R.id.text1};mAdapter=new simpledapter(getActivity(),items,android.R.layout.simple_list_item_1,from,to);但是listview保持不变,尽管它确实在后台运行,因为我可以看到日志。这是actionbarsherlock中的一个片段。我做了一个基本测试,没有片段等,只需调用notifydatasetchanged即可。我只需删除行List items=new ArrayList();并调用notifydatasetchanged()它似乎有效。我不知道您是否要替换或添加列表中的数据。我很高兴能帮助您。我只需删除行列表项=new ArrayList();并调用notifyDataSetChanged(),它似乎有效。我不知道您是否要替换或添加列表中的数据。我很高兴能帮助您。