android listview更新/刷新数据而不关闭应用程序
Posted
技术标签:
【中文标题】android listview更新/刷新数据而不关闭应用程序【英文标题】:android listview update/refresh data without closing the app 【发布时间】:2013-12-17 20:29:22 【问题描述】:我有一个 android 应用程序,它从我的网络服务器获取数据,然后将它们显示在我的列表视图上并保存到我的本地数据库 (sqlite)。如果我向我的网络服务器添加另一条记录,应用程序应该刷新/更新我的列表视图,就像 facebook 应用程序一样,如果有新帖子然后显示这些帖子。
这是我目前所拥有的:
ListViewAdapter adapter;
// DownloadJSON AsyncTask
private class DownloadJSON extends AsyncTask<Void, Void, Void>
@Override
protected void onPreExecute()
super.onPreExecute();
// Create a progressdialog
mProgressDialog = new ProgressDialog(MainActivity.this);
// Set progressdialog title
mProgressDialog.setTitle("Downloading Records");
// Set progressdialog message
mProgressDialog.setMessage("Loading...");
mProgressDialog.setIndeterminate(false);
// Show progressdialog
mProgressDialog.show();
@Override
protected Void doInBackground(Void... params)
// Create the array
arraylist = new ArrayList<HashMap<String, String>>();
// Retrieve JSON Objects from the given website URL in JSONfunctions.class
String result = JSONFunctions.getJSONfromURL(URL);
try
JSONArray jr = new JSONArray(result);
for(int i=0;i<jr.length();i++)
HashMap<String, String> map = new HashMap<String, String>();
jb = (JSONObject)jr.get(i);
map.put(TAG_ID, jb.getString(TAG_ID));
map.put(TAG_NAME, jb.getString(TAG_NAME));
arraylist.add(map);
String strID = jb.getString(TAG_NAME);
dbHelper.createEntry(strID);
catch (JSONException e)
Log.e("Error", e.getMessage());
e.printStackTrace();
return null;
@Override
protected void onPostExecute(Void args)
// Locate the listview in listview_main.xml
listview = (ListView) findViewById(R.id.listView1);
// Pass the results into ListViewAdapter.java
adapter = new ListViewAdapter(MainActivity.this, arraylist);
// Binds the Adapter to the ListView
listview.setAdapter(adapter);
adapter.notifyDataSetChanged();
//TextView tv = (TextView) findViewById (R.id.textView1);
//tv.setText("Successfully processed");
// Close the progressdialog
mProgressDialog.dismiss();
我的 listviewadapter.class 的片段:
public View getView(final int position, View convertView, ViewGroup parent)
// Declare Variables
TextView id;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View itemView = inflater.inflate(R.layout.list_item, parent, false);
// Get the position from the results
HashMap<String, String> resultp = new HashMap<String, String>();
resultp = data.get(position);
// Locate the TextViews in list_item.xml
id = (TextView) itemView.findViewById(R.id.listitem_id);
// Capture position and set results to the TextViews
id.setText(resultp.get(MainActivity.TAG_NAME));
// Capture position and set results to the ImageView
// Passes movie images URL into ImageLoader.class to download and cache
// images
// Capture button clicks on ListView items
itemView.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
// Get the position from the results
HashMap<String, String> resultp = new HashMap<String, String>();
resultp = data.get(position);
// Send single item click data to SingleMenuItemView Class
Intent intent = new Intent(context, SingleMenuItemActivity.class);
// Pass data
intent.putExtra("id", resultp.get(MainActivity.TAG_ID));
intent.putExtra("name", resultp.get(MainActivity.TAG_NAME));
// Start SingleItemView Class
context.startActivity(intent);
);
return itemView;
我也添加了这个:
adapter.notifyDataSetChanged();
无济于事。它不会更新列表。如果我关闭应用程序并再次打开它,它只是在更新。任何想法如何做到这一点?非常感谢您的帮助。谢谢。
【问题讨论】:
你需要再次调用DownloadJSON
AsyncTask。
什么时候获取数据?一种简单的方法是使用后台任务定期获取数据并在有新数据时更新列表..
@AmulyaKhare 哦,谢谢,我从来没想过,但我的问题是如何实现定期提取?
@Tamilan 我应该把 DownloadJSON asynctask 放在哪里?
@Dunkey On button 单击或在哪里使用刷新适配器时必须调用它。
【参考方案1】:
您应该安排您的 DownloadJSON
任务定期运行,如下所示:
public void callAsynchronousTask()
final Handler handler = new Handler();
Timer timer = new Timer();
TimerTask doAsynchronousTask = new TimerTask()
@Override
public void run()
handler.post(new Runnable()
public void run()
try
DownloadJSON performBackgroundTask = new DownloadJSON();
performBackgroundTask.execute();
catch (Exception e)
e.printStackTrace();
);
;
timer.schedule(doAsynchronousTask, 0, 10000); //execute in every 10 sec
这应该有效,但它不是最有效的方式,因为您一次又一次地请求整个数据。 (有很多不需要的数据正在下载)。
相反,您应该定期运行一个任务来检查服务器是否存在任何新更新。如果服务器说是..那么它会获取完整列表..否则它会等待一段时间并再次请求新的更新。但是为此您需要修改服务器 API(以便您以后可以考虑)
【讨论】:
好吧,我有一个查询来限制已经存储在我的 sqlite 数据库中的行。那你觉得它够高效吗? 我不确定。这取决于你的情况。首先确保一切正常。稍后您可以进行一些测量,看看哪种方式更有效..【参考方案2】:在这种情况下,您可以使用 Google Cloud Messaging(GCM) 服务。每当您的网络服务器发生任何变化时,只需该服务器发出的推送通知就会为您服务。抓住它并相应地在您的应用程序中使用它。你可以看看here
【讨论】:
您好,谢谢,您能给我一些 GCM 的示例实现吗?如果你不介意老兄。 androidhive.info/2012/10/… 或 androidexample.com/… 和谷歌 :)【参考方案3】:你只需要将新的 Adapter 设置为 listView ..
newsAdapter = new NewsListViewAdapter(getActivity(),
R.layout.custome_listview_news_item, newsItems);
listViewNews.setAdapter(newsAdapter);
我假设你有一个片段并且你想更新片段中的列表视图.. 所以只需在 Fragment 中创建一个方法来更新 listview .. 当您有新项目时..只需在您的数据中请求此方法.. 注意:你必须设置新的适配器..
【讨论】:
您好,谢谢,但这只是一个简单的应用程序,我没有片段以上是关于android listview更新/刷新数据而不关闭应用程序的主要内容,如果未能解决你的问题,请参考以下文章
刷新按钮onClick Listview数据必须在android中更新[重复]