2015-04-09 2 views
1

Я начинаю изучать Android и сталкиваюсь с некоторыми трудностями с помощью фрагментов. Не могли бы вы помочь мне разобраться, в чем проблема? Все остальное, кроме того, что упомянуто ниже, одинакова в обоих проектахRecylerView работает без фрагментов. Не работает, когда я использую фрагменты

1. Code without fragments (works totally fine. Gives a simple list with some data): 



    @Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerList); 
    LinearLayoutManager llm = new LinearLayoutManager(this); 
    llm.setOrientation(LinearLayoutManager.VERTICAL); 
    recyclerView.setLayoutManager(llm); 
    recyclerView.setAdapter(new MyRecyclerAdapter(generatePalettes())); 
} 



2. Code with Fragment (doesnt work. Blank Screen): 



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



    MainActivityFragment  
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
      RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerList); 
      LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
      llm.setOrientation(LinearLayoutManager.VERTICAL); 
      recyclerView.setLayoutManager(llm); 
      recyclerView.setAdapter(new PaletteAdapter(generatePalettes())); 
      return rootView; 
     } 

--------------------------- ----- ДОПОЛНЕНИЕ -------------

Код изменен на следующее: Не работает. Отображен пустой экран. Пробовал поместить обновление пользовательского интерфейса как в onActivityCreated, так и в onViewCreated(). Gist с кодом здесь: https://gist.github.com/adityarb88/12f5ccce665afbf58069

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

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerList); 
     LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
     llm.setOrientation(LinearLayoutManager.VERTICAL); 
     recyclerView.setLayoutManager(llm); 
     recyclerView.setAdapter(new PaletteAdapter(generatePalettes())); 
    } 
+1

Может быть 'если (savedInstanceState == NULL) {' состояние не удовлетворяет. – Piyush

+0

Привет, Piyush. Спасибо за ваш ответ. Я отлаживался и удовлетворен. Я создал суть только в том случае, если вы хотели бы передать код: https://gist.github.com/adityarb88/12f5ccce665afbf58069 – takeradi

+0

@takeradi, не делайте изменения пользовательского интерфейса в 'onCreateView', но делайте их в 'onActivityCreated' для вашего фрагмента –

ответ

1

Наконец нашел ответ на Эта проблема. Во-первых, спасибо Панкай. Вы были частично правы. Мой макет был действительно неправильным. Итак: 1. Я изменил это на RelativeLayout, но я добавил фрагмент в свою программу программно. 2. Чтобы увидеть все более ясно, я изменил фон Activity и фрагмент и добавленные поля и paddings соответственно.

После этого я до сих пор не смог заполнить вид ресайклера, хотя знал, что мой фрагмент добавлен правильно. Таким образом, ошибка была в классе PaletteAdapter.

public PaletteAdapter(List<Palette> palettes){ 
     this.palettes = new ArrayList<Palette>(); 
     this.palettes.addAll(palettes); 
    } 

Мне не хватало этого перед палитрами.addВсе (палитры). Следовательно, список пуст. Я загрузил код новой сутью в случае, если кто-то хочет передать его:

https://gist.github.com/adityarb88/c6109fc1d8a796383c71

+0

отличный мужчина:) ... –

1

Для ваших Осколков установки адаптеров после создания ваших взглядов:

MainActivityFragment

Этого метод должен только надуть и вернуть вид:

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

Затем в onViewCreated(View, Bundle) или onActivityCreated(Bundle):

@Override 
    public void onActivityCreated(Bundle savedInstanceState){ 
    super.onActivityCreated(savedInstanceState); 

     // getView() returns your Fragments root view 
     RecyclerView recyclerView = (RecyclerView) getView().findViewById(R.id.recyclerList); 
     LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
     llm.setOrientation(LinearLayoutManager.VERTICAL); 
     recyclerView.setLayoutManager(llm); 
     recyclerView.setAdapter(new PaletteAdapter(generatePalettes())); 

    } 
+0

Привет внутренний класс. Спасибо за ваш ответ. Я внес изменения, которые вы задали, но он все еще не работает. У меня есть список, указанный в одном из комментариев выше, если вы хотите взглянуть на мой полный код. Спасибо за вашу помощь снова. – takeradi

0

вы должны сделать некоторые изменения в activity_main.xml

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

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

</LinearLayout> 

и MainACtivity вы должны использовать этот идентификатор frame_container заменить фрагмент с

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,         Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
     recyclerView = (RecyclerView) rootView .findViewById(R.id.recyclerList); 
     return rootView; 
    } 


@Override 
    public void onActivityCreated(bala,bala, bala, cause i don't remember) { 

     LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
    llm.setOrientation(LinearLayoutManager.VERTICAL); 
    recyclerView.setLayoutManager(llm); 
    recyclerView.setAdapter(new PaletteAdapter(generatePalettes())); 
    } 
Смежные вопросы