2015-06-26 3 views
1

Я получаю данные от этого API и проанализировал его в виде списка внутри фрагмента. Тем не менее, я не могу показаться, что он отображается на главной странице. Может ли кто-нибудь указать мне в правильном направлении, пожалуйста?ListView in Fragment не отображается в MainActivity

EDIT1: файлы макета можно найти here.

Основная деятельность:

package com.example.szen95.meddict; 

    import android.os.Bundle; 
    import android.support.v7.app.ActionBarActivity; 
    import android.view.Menu; 
    import android.view.MenuItem; 

    public class MainActivity extends ActionBarActivity { 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      // Inflate the menu; this adds items to the action bar if it is present. 
      getMenuInflater().inflate(R.menu.menu_main, menu); 
      return true; 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      // Handle action bar item clicks here. The action bar will 
      // automatically handle clicks on the Home/Up button, so long 
      // as you specify a parent activity in AndroidManifest.xml. 
      int id = item.getItemId(); 

      //noinspection SimplifiableIfStatement 
      if (id == R.id.action_settings) { 
       return true; 
      } 

      return super.onOptionsItemSelected(item); 
     } 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
     } 
    } 

SearchFragment:

package com.example.szen95.meddict; 

import android.app.ListFragment; 
import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.SimpleAdapter; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.ArrayList; 
import java.util.HashMap; 


public class SearchFragment extends ListFragment { 

// 
// @Override 
// protected void onCreate(Bundle savedInstanceState) { 
//  super.onCreate(savedInstanceState); 
//  setContentView(R.layout.activity_search_fragment); 
//  if (savedInstanceState == null) { 
//   getSupportFragmentManager().beginTransaction() 
//     .add(R.id.container, new SearchFragment()) 
//     .commit(); 
//  } 
// } 


    private ProgressDialog pDialog; 

    // URL to get contacts JSON 
    private static String url = "http://dailymed.nlm.nih.gov/dailymed/services/v2/drugclasses.json"; 

    // JSON Node names 
    private static final String TAG_DATA = "data"; 
    private static final String TAG_CODE = "code"; 
    private static final String TAG_CODING_SYSTEM = "codingsystem"; 
    private static final String TAG_TYPE = "type"; 
    private static final String TAG_NAME = "name"; 


    // contacts JSONArray 
    JSONArray data = null; 

    // Hashmap for ListView 
    ArrayList<HashMap<String, String>> dataList = new ArrayList<HashMap<String, String>>(); 

    public View onCreateView(LayoutInflater inflater, 
          ViewGroup container, 
          Bundle savedInstanceState) { 

     // Retrieving the currently selected item number 
     int position = getArguments().getInt("position"); 

     // Creating view correspoding to the fragment 
     View v = inflater.inflate(R.layout.activity_search_fragment, container, false); 

     // Updating the action bar title 
//  getActivity().getActionBar().setTitle(options[position]); 

     // Calling async task to get json 
     new GetData().execute(); 

     return v; 
    } 

    /** 
    * Async task class to get json by making HTTP call 
    * */ 
    private class GetData extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // Showing progress dialog 
      pDialog = new ProgressDialog(getActivity()); 
      // 
      pDialog.setMessage("Please wait..."); 
      pDialog.setCancelable(false); 
      pDialog.show(); 

     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 
      // Creating service handler class instance 
      ServiceHandler sh = new ServiceHandler(); 

      // Making a request to url and getting response 
      String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET); 

      Log.d("Response: ", "> " + jsonStr); 

      if (jsonStr != null) { 
       try { 
        JSONObject jsonObj = new JSONObject(jsonStr); 

        // Getting JSON Array node 
        data = jsonObj.getJSONArray(TAG_DATA); 

        // looping through All Contacts 
        for (int i = 0; i < data.length(); i++) { 
         JSONObject c = data.getJSONObject(i); 

         String code = c.getString(TAG_CODE); 
         String codingsystem = c.getString(TAG_CODING_SYSTEM); 
         String type = c.getString(TAG_TYPE); 
         String name = c.getString(TAG_NAME); 
; 

         // tmp hashmap for single contact 
         HashMap<String, String> data = new HashMap<String, String>(); 

         // adding each child node to HashMap key => value 
         data.put(TAG_CODE, code); 
         data.put(TAG_CODING_SYSTEM, codingsystem); 
         data.put(TAG_TYPE, type); 
         data.put(TAG_NAME, name); 

         // adding contact to contact list 
         dataList.add(data); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } else { 
       Log.e("ServiceHandler", "Couldn't get any data from the url"); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      // Dismiss the progress dialog 
      if (pDialog.isShowing()) 
       pDialog.dismiss(); 
      /** 
      * Updating parsed JSON data into ListView 
      * */ 
      SimpleAdapter adapter = new SimpleAdapter(getActivity(), dataList, 
        R.layout.list_item, new String[] { TAG_NAME, TAG_CODE}, new int[] { R.id.name, 
        R.id.code}); 

      setListAdapter(adapter); 
     } 

    } 

} 
+0

Вы получаете сообщение об ошибке, и если да, то что это такое? – BrokenBinary

+0

Вам также нужно добавить файл основного макета xml в свой вопрос. – Thupten

+0

@BrokenBinary Я не получаю никаких ошибок. Я ничего не вижу в MainActivity, когда я запускаю приложение. –

ответ

1

Un прокомментирует OnCreate метода в searchFragment, потому что ваш фрагмент не раздувания любого макета

+0

Когда я раскомментирую это, setContentView и getSupportFragmentManager в методе становятся красными, и код не может скомпилироваться. –

+0

Без setContentView не будет макета для заполнения вашей деятельности, можете ли вы рассказать нам, что является ошибкой ??? –

+0

Хорошо, я запустил его снова, и он говорит следующее: Ошибка: (27, 9) error: не удается найти метод символа setContentView (int) Ошибка: (29, 13) ошибка: не удается найти метод символов getSupportFragmentManager() –

1

Фрагменты могут быть помещены в макет, используя FragmentManager. Добавьте замену onCreate вашего MainActivity следующим образом.

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction fts = fragmentManager.beginTransaction(); 
Fragment fragment = new SearchFragment(); 
String fragmentTag = "SearchFragment"; 
fts.add(R.id.main_container, fragment, fragmentTag); 
fts.commit(); 
    } 

Измените свой layout_activity_main.xml на следущее. Вам не нужен список. Просто убедитесь, что у вас есть макет контейнера main_container разместить фрагмент в.

<?xml version="1.0" encoding="utf-8"?> 

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <FrameLayout android:id="@+id/main_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     > 
    </FrameLayout> 

    <!-- Main ListView 
    Always give id value as list(@android:id/list) 

    <ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:divider="@null"/> 
    --> 
</LinearLayout> 
+0

Хорошо, я внес изменения, как вы предложили, но фрагмент фрагмента = новый SearchFragment(); и fts.replace (R.id.main_container, фрагмент, фрагментTag); не позволит мне скомпилировать и запустить приложение. Я получаю следующие ошибки: Ошибка: (43, 42) error: несовместимые типы: android.support.v4.app.Fragment не может быть преобразован в android.app.Fragment Ошибка: (41, 29) error: несовместимые типы : SearchFragment не может быть преобразован в Фрагмент –

+0

Поскольку ваш фрагмент поиска использует v4, измените 'getFragmentManager();' на 'getSupportFragmentManager()'. Reimport пакеты, которые включают фрагменты и убедитесь, что они из v4. – Thupten

+0

Хорошо, я сделал то, что вы предложили. Но теперь fts.replace (R.id.main_container, фрагмент, фрагментTag); дает мне проблемы. Произошла одна и та же ошибка: Ошибка: (41, 29) error: несовместимые типы: SearchFragment не может быть преобразован в Fragment @Thupten –

1

Я думаю, ваша проблема вызвана Джейсон разборе.

private static final String TAG_CODING_SYSTEM = "codingSystem"; 

Jason key чувствителен к регистру. Но, пожалуйста, попробуйте самостоятельно отладить себя в следующий раз, это единственный способ стать лучшим кодером. Ура!

+0

Спасибо, но это все еще не помогает отображать данные ... –

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