单击按钮时再次加载android viewtreeObserver
我有一个ViewTreeObserver,我想单击按钮并再次重新加载此ListView 这是我的viewTreeObserver代码:单击按钮时再次加载android viewtreeObserver,android,listview,Android,Listview,我有一个ViewTreeObserver,我想单击按钮并再次重新加载此ListView 这是我的viewTreeObserver代码: menuLinkListView=(ListView) findViewById(R.id.menu_listview); observer= menuLinkListView.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new OnGlobalLayoutListen
menuLinkListView=(ListView) findViewById(R.id.menu_listview);
observer= menuLinkListView.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
boolean measured=false;
@Override
public void onGlobalLayout() {
if(!measured){
listHeight=menuLinkListView.getHeight();
int spacing =0;
int itemsPerRow = 2;
adapter=new HomeMenuLinksListArrayAdapter(MainActivity.this,MyApplication.articles, listHeight);
wrapperAdapter = new MultiItemRowListAdapter(MainActivity.this, adapter, itemsPerRow, spacing);
menuLinkListView. setAdapter(wrapperAdapter);
}
// observer.removeGlobalOnLayoutListener(this);
measured=true;
}
});
当我点击按钮时,我想得到新的文章列表,并用新的arrayList重新加载这个列表视图。我该怎么做
请注意,MyApplication.articles=ArrayList of articles
在单击时,我将此任务称为asynk任务:
getArticles getarticles = new getArticles();
getarticles.execute("2",tag);
AsynkTask的代码:
public class getArticles extends AsyncTask<String, Void, ArrayList<Article>>
{
private ProgressDialog pd;
ArrayList<Article> array = new ArrayList<Article>();
@Override
protected void onPreExecute()
{
pd=ProgressDialog.show(MainActivity.this, "", MainActivity.this.getResources().getString(R.string.loading), false);
}
@Override
protected ArrayList<Article> doInBackground(String... params) {
if(Actions.isNetworkAvailable(MainActivity.this))
{
Connection.disableSSLCertificateChecking();
String url=getResources().getString(R.string.serviceLink)+getResources().getString(R.string.getArticleIssueCat) + "issueId=" + params[0] + "&categoryId=" + params[1];
Connection conn=new Connection( url);
ArticleXmlPullParser parser = new ArticleXmlPullParser();
array=parser.parse(conn.getInputStream());
}
return array;
}
@Override
protected void onPostExecute(final ArrayList<Article> p)
{
MyApplication.articles = p;
adapter.notidyDataSetChanged();//here i cann notify for adapter of listview but nothing changed
try{
pd.dismiss();
}catch(Exception e){
}
}
}
公共类getArticles扩展异步任务
{
私营部门;
ArrayList数组=新的ArrayList();
@凌驾
受保护的void onPreExecute()
{
pd=ProgressDialog.show(MainActivity.this,”,MainActivity.this.getResources().getString(R.string.loading),false);
}
@凌驾
受保护的ArrayList doInBackground(字符串…参数){
if(Actions.isNetworkAvailable(MainActivity.this))
{
Connection.disableSSLCertificateChecking();
字符串url=getResources().getString(R.String.serviceLink)+getResources().getString(R.String.getArticleIssueCat)+“issueId=“+params[0]+”&categoryId=“+params[1]”;
连接连接=新连接(url);
ArticleXmlPullParser=新的ArticleXmlPullParser();
array=parser.parse(conn.getInputStream());
}
返回数组;
}
@凌驾
PostExecute上受保护的void(最终ArrayList p)
{
MyApplication.articles=p;
adapter.notidyDataSetChanged();//这里我无法通知listview的适配器,但没有任何更改
试一试{
pd.解散();
}捕获(例外e){
}
}
}
问题在于您没有更改适配器上的数据。
适配器上的数据应该有一个set方法
MyApplication.articles=p
adapter.setData(p)强>
adapter.notidyDataSetChanged()
像这样的事情不是这样做的。为什么每次调用OnGlobalYout()时都需要创建新适配器?为什么不在onClick()上添加notifyDataChanged()?我刚刚在onClick上添加了notifyDataChanged,但仍然显示了旧的ArrayList代码的问题不在这里。附加更多代码。在onClick()上还有什么?你下载更多的数据吗?添加/删除?为什么需要再次加载列表?附加更多的代码,我会帮助你。好的,我会把我的代码,每次我点击按钮,我想加载新数据并显示在列表上,我会用更多的代码更新我的问题你的意思是
adapter.clear();adapter.addAll(p);adapter.notifyDataSetChanged()代码>及其工作方式:D。。谢谢,我已经有一段时间没有使用带数据的适配器了,而不是游标适配器。在CursorAdapter,你有一个名为CursorAdapter.swapCursor(newCursor)的方法,这就完成了。但是如果清除和添加所有工作,那么它工作:)我可能会尝试一种方法,只更新文章之间的增量,而不是所有文章之间的增量。。。