2016-03-06 60 views
0

我正在Android上创建食谱应用程序。用户可以将食谱添加到他的收藏夹列表(我通过webservices存储在我的数据库中),他应该能够使用他喜欢的食谱查看收藏夹列表。在onCreateView中执行AsyncTask不会在第一次尝试中显示信息

我正在使用AsyncTask从数据库中获取所有配方,这使用SharedPreferences跟踪用户名,该用户名作为参数传递给我的webservices以获取该用户名的配方。

收藏夹页面是一个通过NavigationDrawer的选项,一旦点击它应该执行AsyncTask并立即用配方信息填充收藏夹列表。但是,当我第一次访问收藏夹页面时,终端返回成功,但页面为空。当我第二次尝试访问收藏夹列表时,该页面会成功加载配方信息。我已经尝试了很多不同的组合,例如在对Fragment进行膨胀之前执行任务,尝试在NavigationDrawerItem上单击执行它,但是这给了我一个错误。

如何在第一次尝试时进行此显示?我相信我错过了那么明显的东西,但我看不到它!

1日尝试

enter image description here

第2次尝试

enter image description here

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.我知道我可能会因为糟糕的编码标准而被屠杀,但我会稍后再解决!

回答

2

我想你可能需要一个lazyFavsAdapter.notifyDataSetChanged()在你的onPostExecute。

+0

哇,工作!一条线改变了很多!谢谢! – Theman

相关问题