2016-02-16 4 views
0

В настоящее время я использую Yummly API, который возвращает данные рецепта в виде JSON. Пользователь вводит ингредиент, и приложение должно отображать рецепты, которые могут быть сделаны из этого ингредиента. Пока поиск работает, и я успешно получил список имен рецептов, из которых я добавил в ArrayList.ListView не отображает данные из ArrayList

Я могу напечатать все содержимое массива ArrayList на терминале в методе onPostExecute(), поэтому в ArrayList есть определенные данные. Однако по какой-то причине он не отображается внутри ListView! Я могу достичь страницы результатов, но все, что я получаю, - это пустая страница.

Search.java

public class Search extends Fragment { 

EditText ingredient; 
Activity mActivity; 
ArrayList<String> pairs = new ArrayList<>(); 
private static final String TAG_TOTAL_MATCH = "totalMatchCount"; 
private static final String TAG_MATCHES = "matches"; 
private static final String TAG_NAME = "recipeName"; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.searchpage, container, false); 

    Button btnSearch = (Button) rootView.findViewById(R.id.search_button); 

    btnSearch.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      ingredient = (EditText) getView().findViewById(R.id.search_box); 
      // search returns something 
      new SearchRecipe().execute(); 
     } 
    }); 

    return rootView; 
} 

    class SearchRecipe extends AsyncTask<String, String, ArrayList<String>> { 

    private String search_string; 
    private ProgressDialog pDialog; 

    JSONParser jsonParser = new JSONParser(); 

    /** 
    * Searching for recipes 
    * */ 
    protected ArrayList<String> doInBackground(String... args) { 


     String full_url = url_search_recipe + search_string; 

     JSONObject json = jsonParser.makeHttpRequest(full_url, "GET", params); 

     // check log cat for JSON response 
     Log.d("Response", json.toString()); 

     // check for success tag 
     try { 
      int count = json.getInt(TAG_TOTAL_MATCH); 
      JSONArray matches = json.getJSONArray(TAG_MATCHES); 

      if (count > 0) { 
       int i; 

       //populate array with recipe 
       for (i=0; i<matches.length(); i++){ 
        JSONObject js = matches.getJSONObject(i); 
        String name = js.getString(TAG_NAME); 
        pairs.add(name); 

       } 
       // return json.getString(TAG_MESSAGE); 

      } else { 
       // no results found 
       // Toast.makeText(mActivity.getApplicationContext(), "There were: " + count + " recipes found", Toast.LENGTH_LONG).show(); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    /** 
    * After completing background task Dismiss the progress dialog 
    * **/ 
    protected void onPostExecute(ArrayList<String> menu) { 
     // 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)); 
     } 
     FragmentManager fm = getActivity().getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.replace(R.id.container, new Results()); 
     ft.commit(); 
     View v = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_resultspage, null); 
     ListView myListView = (ListView) v.findViewById(R.id.resultsView); 
     ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, pairs); 
     myListView.setAdapter(arrayAdapter); 

    } 

} 
} 

Results.java

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     View rootView = inflater.inflate(R.layout.fragment_resultspage, container, false); 
     return rootView; 
    } 

fragment_resultspage.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="#9ad979" 
     android:id="@+id/resultsView" 
     android:scrollbars="vertical" 
     android:choiceMode="singleChoice" /> 

</RelativeLayout> 

I-й чернила есть что-то очевидное, что я упускаю, но я в недоумении. Что может быть причиной того, что он ничего не отображает? Включен только фрагмент моего файла Search.java, поскольку он имеет длину более 200 строк, поэтому я включил только соответствующие части!

+0

Вы показываете результат в фрагменте. Вы должны передать данные, полученные этому фрагменту, и заполнить список оттуда –

+0

, когда вы добавите фрагмент, как вы, он не отображается мгновенно. Затем, когда вы увеличиваете свое представление в 'onPostExecute', вы не добавляете его в иерархию, поэтому он никогда не отображается. Более распространенный шаблон заключается в том, чтобы добавить контент, который вы хотите отобразить в свой 'ResultFragment', обычно в заводском методе с использованием аргументов фрагмента, затем помещать содержимое в представление в' onCreateView' – njzk2

+1

Использовать 'android: layout_height =" match_parent "' вместо 'android: layout_height =" wrap_content "' для высоты ListView :) –

ответ

3

Сделайте это в своем фрагменте результата. Сначала вам необходимо передать данные, полученные из службы, в ваш фрагмент результатов.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    View rootView = inflater.inflate(R.layout.fragment_resultspage, container, false); 
    ListView myListView = (ListView) rootView.findViewById(R.id.resultsView); 
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(), 
            android.R.layout.simple_list_item_1, 
                   YOUR_RESULT); 
    myListView.setAdapter(arrayAdapter); 
    return rootView; 
} 
+0

Работал! Спасибо, сэр!! – Theman

Смежные вопросы