-2

Я хочу обновить фрагмент нажатием кнопки - например, уничтожить фрагмент и принудительно вызвать метод onCreateView(). Тем не менее, он продолжает сбой из-за Grrrr NullPointerException на линии fragment.getFragmentManager().findFragmentByTag("Frag1");Мой фрагмент продолжает сбой, когда он обновляется

Это мой код:

import android.app.ProgressDialog; 
import android.support.v4.app.Fragment; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Toast; 

public class UserListRecycler extends Fragment { 
    RecyclerView recyclerView; 
    static UserAdapter adapter; 
    RecyclerView.LayoutManager layoutManager; 
    ArrayList<UserInfo> list; 


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

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.userlistGUI, container, false); 
     recyclerView = (RecyclerView) rootView.findViewById(R.id.reUsers); 
     recyclerView.setHasFixedSize(true); 
     list = new ArrayList<UserInfo>(); 
     // Instantiate new adapter here 
     adapter = new MusicRecyclerAdapter(list); 
     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); 
     linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
     recyclerView.setLayoutManager(linearLayoutManager); 
     // Sets the adapter here 
     recyclerView.setAdapter(adapter); 
     adapter.notifyDataSetChanged(); 
     return rootView; 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     populateRecyclerList(); 
    } 


    public void populateList(){ 
     PopulateUsers userList = new PopulateUsers(list, adapter, recyclerView); 
     userList.execute(); 
    } 


    public void recallFragment(){ 
     Fragment fragment = null; 
     fragment.getFragmentManager().findFragmentByTag("TabOne"); 
     getFragmentManager().beginTransaction() 
       .detach(fragment) 
       .attach(fragment) 
       .commit(); 
    } 
} 

Это recallFragment() метод, который вызывает проблему. Я хочу вспомнить на onCreateView(), так как это физически обновит фрагмент и повторно отобразит recyclerview. Он получает NullPointerException по номеру fragment.getFragmentManager().findFragmentByTag("TabOne");. Это мой stack trace:

java.lang.NullPointerException 
      at lukazs.usersapp.UserListRecycler.recallFragment()(TabOne.java:160) 
      at lukazs.usersapp.UserListRecycler$RecommendUser.onPostExecute(TabOne.java:300) 
      at lukazs.usersapp.UserListRecycler$RecommendUser.onPostExecute(TabOne.java:306) 
      at android.os.AsyncTask.finish(AsyncTask.java:631) 
      at android.os.AsyncTask.access$600(AsyncTask.java:177) 
      at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:5103) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:525) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 

Это мой onCreateView() метод:

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.userlistGUI, container, false); 
    recyclerView = (RecyclerView) rootView.findViewById(R.id.reUsers); 
    recyclerView.setHasFixedSize(true); 
    list = new ArrayList<UserInfo>(); 
    // Instantiate new adapter here 
    adapter = new MusicRecyclerAdapter(list); 
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); 
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    recyclerView.setLayoutManager(linearLayoutManager); 
    // Sets the adapter here 
    recyclerView.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 
    return rootView; 
} 

ОБНОВЛЕНО XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent" 
    android:id="@+id/rLayouts"> 
    <fragment 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/listFrag" 
     class="lukazs.usersapp.UserListRecycler"/> 
    <view 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     class="android.support.v4.view.ViewPager" 
     android:id="@+id/viewPager" 
     android:layout_alignParentStart="true" /> 
    <android.support.v7.widget.RecyclerView 
     android:id="@+id/usersList" 
     android:layout_width="match_parent" 
     android:layout_height="420dp" 
     android:layout_gravity="center_horizontal|top" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentTop="true"></android.support.v7.widget.RecyclerView> 
</RelativeLayout> 
+0

снимите отсоедините и прикрепите. Просто используйте замену. – Aizen

+0

Но он разбивается на 'fragment.getFragmentManager(). FindFragmentByTag (" TabOne ") ;.' !!!! Он говорит, что фрагмент является нулевым, когда он не является –

+0

Это значение null, проверьте мой ответ – Aizen

ответ

0

Вместо того, чтобы отделить и присоединение фрагмента, вы должны либо иметь API в вашем фрагменте, который сообщает ему обновить его содержимое, или вы должны создать новый экземпляр фрагмента и повторно поместите существующий экземпляр в новый. Говорить фрагмент, чтобы обновить себя, очевидно, более эффективно, чем уничтожить и создать новый фрагмент.

+0

Как сделать это? Извините, что я не знаком с разработкой Android. –

+0

Если все, что вы хотите сделать, это обновить содержимое вашего recyclerview, то просто вызовите recyclerView.notifyDataSetChanged() в методе отзываFragment. Вам также нужно будет уведомить ваш адаптер о том, что изменилось. – Francesc

+0

Вы не можете сделать 'notifyDataSetChanged()' на 'recyclerview' !!! –

1
Fragment fragment = new WhatEverFragmentClassYouHave(); 

Вы установили для своего fragment значение null, поэтому у вас есть нулевое исключение.

Если вы собираетесь отсоединить, а затем прикрепить что-нибудь. Просто позвоните replace(), если вы знаете, как его использовать.

<fragment 
       android:id="@+id/article_fragment" 

       android:layout_weight="2" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       class="com.example.android.fragments.ArticleFragment" 
/> 

Для Refresh

public void recallFragment(){ 
     Fragment fragment = new WhatEverFragmentClass(); 

     getFragmentManager().beginTransaction().replace(R.id.article_fragment,fragment,"MyFragmentTag").commit(); 

    } 


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

    return rootView; 
} 

@Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 



recyclerView = (RecyclerView) rootView.findViewById(R.id.reUsers); 
     recyclerView.setHasFixedSize(true); 
     list = new ArrayList<UserInfo>(); 
     // Instantiate new adapter here 
     adapter = new MusicRecyclerAdapter(list); 
     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); 
     linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
     recyclerView.setLayoutManager(linearLayoutManager); 
     // Sets the adapter here 
     recyclerView.setAdapter(adapter); 
     adapter.notifyDataSetChanged(); 

} 
+0

Как вы используете 'replace()'? Является ли мой метод правильным? –

+0

Человек все еще падает. Что мне делать> –

+0

Вам нужно будет снабдить его идентификатором, куда он должен идти. Например, в вашем XML-файле есть '<фрагмент id =" myFragment "><- пример, но есть тег фрагмента. 'replace (R.id.myFragment, фрагмент)' Поэтому он должен знать, где разместить фрагмент и заменить какой-либо фрагмент. – Aizen

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