我正在Android上创建配方应用。用户可以将食谱添加到他的收藏夹列表(我通过webservices存储在我的数据库中),他应该能够使用他喜欢的食谱查看收藏夹列表。
我使用AsyncTask从数据库中获取所有配方,这使用SharedPreferences来跟踪用户名,该用户名作为参数传递给我的webservices以获取该用户名的配方。
收藏夹页面是一个通过NavigationDrawer的选项,一旦点击它就应该执行AsyncTask并立即用收藏夹信息填充收藏夹列表。但是当我第一次访问收藏页面时,我从终端返回成功,但页面是空白的。当我在第二次尝试时访问收藏夹列表时,页面成功加载了配方信息。我尝试了很多不同的组合,比如在膨胀片段之前执行任务,尝试在NavigationDrawerItem上执行它,但是这给了我一个错误。
如何在第一次尝试时显示?我相信我错过了一些如此明显的东西,但我看不到它!
第一次尝试
第二次尝试
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。我知道我可能因为编码标准差而被屠杀,但我会稍后解决它!
答案 0 :(得分:2)
我认为你的onPostExecute可能需要一个lazyFavsAdapter.notifyDataSetChanged()。