2014-01-16 5 views
1

Я очень смущен тем, как реализовать ListView внутри фрагмента, управляемого через FragmentPagerAdapter.ListViews внутри Фрагменты внутри FragmentPagerAdapter

В настоящий момент я пытаюсь вернуть некоторые данные JSON и в зависимости от значения в JSON отделяет данные от 3 отдельных списков; «Кредит», «Бронирование» и «Забронировано». Это похоже на упражнение TeamTreehouse «Создайте приложение для чтения блога Android», и я попытался расширить его, чтобы продолжить свое образование в отношении Android.

У меня возникли проблемы, когда я пытался реализовать фрагменты. Из моего понимания Фрагменты являются элементами многократного использования с их собственным жизненным циклом деятельности, поэтому казалось, что он идеально подходит для реализации фрагмента, содержащего всю логику, а затем просто извлекает информацию, которую я требую, в отдельные списки с помощью FragmentPagerAdapter. Единственная проблема заключается в том, что ListView не отображается, хотя информация вытягивается в LogCat. Я потратил несколько дней на чтение и исследование этой проблемы, и я думаю, что это может иметь какое-то отношение к тому, как я реализую свой ListView во Фрагменте, но я действительно мог бы с некоторой помощью справиться.

Я включил код для своего класса фрагмент, который я назвал «LoanFragment», а также в FragmentPagerAdapter «LibraryPagerAdapter» и мой класс «библиотеки», из которого называется FragmentPagerAdapter:

public class LoanFragment extends Fragment { 

    ListView lv; 
    private final String KEY_TITLE = "Title"; 
    private final String KEY_AUTHOR = "Author"; 
    public static final String TAG = Library.class.getSimpleName(); 
    protected JSONArray mTasksData; 
    SessionManager session; 

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

     View rootView = inflater.inflate(R.layout.booked_fragment, container, false); 

     lv = (ListView) rootView.findViewById(R.id.listMe); 

     bindListView(); 

     return rootView; 

    } 

    public void bindListView() { 
     new GetLibraryInformation(getActivity(),lv).execute(""); 
    } 


    class GetLibraryInformation extends AsyncTask<Object, Void, JSONArray> { 
     ListView mListView; 
     Activity mContext; 


     public GetLibraryInformation(Activity context,ListView gview) { 
        this.mListView=gview; 
        this.mContext=context; 
      } 

     @Override 
     protected JSONArray doInBackground(Object... params) { 
      JSONArray jsonResponse = null; 

      // Get JSON data, all coming through fine 
     } 


     @Override 
     protected void onPostExecute(JSONArray result) {   
      mTasksData = result; 
      String[] keys = { KEY_TITLE, KEY_AUTHOR }; 
      int[] ids = { android.R.id.text1, android.R.id.text2 }; 
      String author = ""; 
      String title = ""; 
      List<HashMap<String, String>> fetch2 = new ArrayList<HashMap<String, String>>(); 

      if(mTasksData == null) { 

      } 
      else { 
       try { 
        for (int i = 0; i < mTasksData.length(); i++) {  
         JSONObject task = mTasksData.getJSONObject(i); 

         if(task.has(KEY_TITLE)) {      
          title = task.getString(KEY_TITLE); 
         } 
         else { 
          title = "Title not set."; 
         } 

         if(task.has(KEY_AUTHOR)) {      
          author = task.getString(KEY_AUTHOR); 
         } 
         else { 
          author = "Author not set."; 
         }      

         HashMap<String, String> libraryInfo = new HashMap<String, String>(); 
         libraryInfo = new HashMap<String, String>(); 
         libraryInfo.put(KEY_TITLE, title); 
         libraryInfo.put(KEY_AUTHOR, author); 

         fetch2.add(libraryInfo); 

        } 

        SimpleAdapter adapter = new SimpleAdapter(getActivity(), fetch2, android.R.layout.simple_list_item_2, keys, ids); 

        lv.setAdapter(adapter); 
       } 
       catch(JSONException e) { 
        Log.e(TAG, "Exception caught! ", e); 
       } 
      } 

     } 
    }  
} 

Это мой FragmentPagerAdapater, из которого я понимаю, должен возвращать каждый отдельный фрагмент (на данный момент все они выглядят как LoanFragment):

public class LibraryPagerAdapter extends FragmentPagerAdapter { 

    public LibraryPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int index) { 

     switch (index) { 
     case 0:  
      return new LoanFragment(); 
     case 1: 
      return new ReservationFragment(); 
     case 2: 
      return new BookedFragment(); 
     default: 
      return null; 
     } 

    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 

} 

И моя библиотека, простираясь FragmentActivity:

public class Library extends FragmentActivity implements ActionBar.TabListener { 

    private ViewPager viewPager; 
    private LibraryPagerAdapter mAdapter; 
    private ActionBar actionBar; 

    private String[] tabs = { "Loan", "Reservation", "Booked" }; 

    @SuppressLint("NewApi") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_library); 

     viewPager = (ViewPager) findViewById(R.id.pager); 
     actionBar = getActionBar(); 
     mAdapter = new LibraryPagerAdapter(getSupportFragmentManager()); 

     viewPager.setAdapter(mAdapter); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);   

     for (String tab_name : tabs) { 
      actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this)); 
     } 

     viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

      @Override 
      public void onPageSelected(int position) { 
       // on changing the page 
       // make respected tab selected 
       actionBar.setSelectedNavigationItem(position); 
      } 

      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) { 
      } 

      @Override 
      public void onPageScrollStateChanged(int arg0) { 
      } 
     }); 
    } 

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

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 
     viewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 

    } 



} 

И, наконец, «booked_fragment.xml», который я пытаюсь использовать для отображения ListView:

FragmentPagerAdapter оба с помощью импорта же фрагмента (android.support.v4.app.Fragment) , но приложение, помимо присутствующих вкладок, просто возвращается совершенно пусто!

Любая помощь будет оценена по достоинству, так как я начинаю превращаться в репу здесь.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:orientation="vertical" 
    android:background="#ffffff" 
    android:layout_height="fill_parent" >   

    <ListView android:id="@+id/listMe" 
       android:layout_width="fill_parent" 
       android:layout_height="0dp" 
       android:background="#f9f9f9" 
       android:layout_weight="1" 
       android:drawSelectorOnTop="false" 
       /> 


</LinearLayout> 

ответ

0

Это недоразумение относительно макета, который должен быть передан в SimpleAdapter. В своем вызове конструктору (контекст контекста, список> данные, int ресурс, String [] from, int [] to) вам нужно передать макет элемента списка, а не макета, содержащего сам ListView. Поскольку элементы отображаются в ListView и динамически добавляются, SimpleAdapter ожидает, что этот макет будет известен (и передан). Если сравнить его с таблицей, например: используемый вами макет определяет макет таблицы, макет для элементов списка определяет, как должна выглядеть одна строка в этой таблице.

+0

спасибо, Питер, я только что заметил, что сейчас я это неправильно сделал и отредактировал, поэтому вместо использования забронированных_фрагментов теперь он использует андроиды simple_list_item_2, но список все еще не отображается:/ –

+0

Не могли бы вы разместить simple_list_item_2. XML? И, пожалуйста, убедитесь, что fetch2.size()! = 0. – Peter

+0

действительно, источник для android.R.layout.simple_list_item_2.xml находится здесь: http://grepcode.com/file/repository.grepcode.com/java /ext/com.google.android/android/4.0.3_r1/frameworks/base/core/res/res/layout/simple_list_item_2.xml и fetch2 определенно не пуст в logcat. спасибо! –

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