我正在Android上創建食譜應用程序。用戶可以將食譜添加到他的收藏夾列表(我通過webservices存儲在我的數據庫中),他應該能夠使用他喜歡的食譜查看收藏夾列表。在onCreateView中執行AsyncTask不會在第一次嘗試中顯示信息
我正在使用AsyncTask從數據庫中獲取所有配方,這使用SharedPreferences跟蹤用戶名,該用戶名作爲參數傳遞給我的webservices以獲取該用戶名的配方。
收藏夾頁面是一個通過NavigationDrawer的選項,一旦點擊它應該執行AsyncTask並立即用配方信息填充收藏夾列表。但是,當我第一次訪問收藏夾頁面時,終端返回成功,但頁面爲空。當我第二次嘗試訪問收藏夾列表時,該頁面會成功加載配方信息。我已經嘗試了很多不同的組合,例如在對Fragment進行膨脹之前執行任務,嘗試在NavigationDrawerItem上單擊執行它,但是這給了我一個錯誤。
如何在第一次嘗試時進行此顯示?我相信我錯過了那麼明顯的東西,但我看不到它!
1日嘗試
第2次嘗試
Favourites.java
public static Favourites newInstance(int sectionNumber) {
Favourites fragment = new Favourites();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
session = new SessionManager(getActivity());
if(!session.isLoggedIn()){
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, new Login());
ft.commit();
}
new DisplayFavourite().execute();
View rootView = inflater.inflate(R.layout.fragment_favs, container, false);
setHasOptionsMenu(true);
final ListView myListView = (ListView) rootView.findViewById(R.id.favouritesView);
lazyFavsAdapter = new LazyFavsAdapter(getActivity(),Favourites.pairs);
myListView.setAdapter(lazyFavsAdapter);
return rootView;
}
DisplayFavourite
class DisplayFavourite extends AsyncTask<String, String, String> {
private String user_id;
private ProgressDialog pDialog;
/**
* Before starting background thread Show Progress Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(getActivity());
pDialog.setMessage("Retrieving Favourites...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
user_id = session.getID();
}
/**
* Fetching Favourited recipes
* */
protected String doInBackground(String... args) {
// Building Parameters
HashMap<String, String> params = new HashMap<>();
params.put("user_id", user_id);
// getting JSON Object
JSONObject json = jsonParser.makeHttpRequest("MyWebsiteURL",
"POST", params);
// check for success tag
try {
JSONArray array = json.getJSONArray("results");
//Log.d("Create Response", json.toString());
if (pairs.size()>0){
pairs.clear();
}
if (array.length() > 0) {
for (int i = 0; i<array.length(); i++){
set = new HashMap<>();
JSONObject jo = array.getJSONObject(i);
image = jo.getString(TAG_IMAGE);
name = jo.getString(TAG_NAME);
recipe_id = jo.getString(TAG_ID);
rating = jo.getString(TAG_RATING);
source = jo.getString(TAG_SOURCE);
set.put("image", image);
set.put("name", name);
set.put("recipe_id", recipe_id);
set.put("rating", rating);
set.put("source", source);
pairs.add(set);
}
} else {
// Log.d("Failure!",json.getString(TAG_MESSAGE));
// return json.getString(TAG_MESSAGE);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url) {
// dismiss the dialog once done
pDialog.dismiss();
//print recipes to terminal
for(int j =0; j<pairs.size(); j++) {
System.out.println(pairs.get(j));
}
}
}
LazyFavsAdapter.java
public class LazyFavsAdapter extends BaseAdapter{
private Activity activity;
private ArrayList data;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader;
public LazyFavsAdapter(Activity a, ArrayList d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader=new ImageLoader(activity.getApplicationContext());
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.list_item, null);
TextView nameText=(TextView)vi.findViewById(R.id.recipe_name);
nameText.setText(Favourites.pairs.get(position).get("name"));
TextView sourceText=(TextView)vi.findViewById(R.id.source);
sourceText.setText(Favourites.pairs.get(position).get("source"));
RatingBar ratingBar =(RatingBar)vi.findViewById(R.id.ratingBar);
ratingBar.setRating(Float.parseFloat(Favourites.pairs.get(position).get("rating")));
ImageView image=(ImageView)vi.findViewById(R.id.recipe_pic);
imageLoader.DisplayImage(Favourites.pairs.get(position).get("image"), image);
return vi;
}
}
MainPage.java
@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
FragmentManager fragmentManager = getSupportFragmentManager();
if (position == 0) {
fragmentManager.beginTransaction()
.replace(R.id.container, PlaceholderFragment.newInstance(1))
.commit();
} else if (position == 1) {
fragmentManager.beginTransaction()
.replace(R.id.container, Search.newInstance(2))
.commit();
}
else if (position == 2) {
fragmentManager.beginTransaction()
.replace(R.id.container, Favourites.newInstance(3))
.commit();
}
else if (position == 3) {
fragmentManager.beginTransaction()
.replace(R.id.container, AccountManagement.newInstance(4))
.commit();
}
}
我在做什麼錯?
N.B.我知道我可能會因爲糟糕的編碼標準而被屠殺,但我會稍後再解決!
哇,工作!一條線改變了很多!謝謝! – Theman