0

laden, um genauer zu sein Ich habe eine Aktivität, die eine tablayout enthält jede Registerkarte sollte im Grunde laden ein eigenständiges Fragment mit einem Recycler anzeigen und ich will dieAnwendung abgestürzt beim Versuch, Json mit Retrofit zu einem RecyclerView in einem Fragment in einem tablayout

public class RestaurantLogoView extends AppCompatActivity implements LiteFragment.OnFragmentInteractionListener, RegularFragment.OnFragmentInteractionListener, View.OnClickListener { 
    private static final String TAG = "RestaurantLogoView"; 
     public static ProgressDialog progressDialog; 
    //TODO 
    public static View.OnClickListener myOnClickListener; 

    private String chosenArea; 
    TextView locationTv; 

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


     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     ViewPager mViewPager = (ViewPager) findViewById(R.id.container); 
     TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(mViewPager); 
     SectionsPagerAdapter pagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(),getApplicationContext()); 
     //remove this if you still didnt get data in the fragment 
     mViewPager.setAdapter(pagerAdapter); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(view -> Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
       .setAction("Action", null).show()); 

     locationTv = (TextView) findViewById(R.id.location_tv); 
     chosenArea = (String) getIntent().getSerializableExtra("Object"); 
     locationTv.setText(chosenArea); 
     locationTv.setOnClickListener(this); 
    } 

    @Override 
    public void onFragmentInteraction(Uri uri) { 
     //TODO i added this lately not sure what its supposed to do but consider removing it 
    } 

    /** 
    * Called when a view has been clicked. 
    * 
    * @param v The view that was clicked. 
    */ 

// 
// 
// @Override 
// public boolean onCreateOptionsMenu(Menu menu) { 
//  getMenuInflater().inflate(R.menu.menu_restaurant_main_view, menu); 
//  return true; 
// } 
    @Override 
    public void onClick(View v) { 
     if (v == locationTv) { 
      Intent o = new Intent(getApplicationContext(), AreaList.class); 
      startActivity(o); 
      finish(); 
     } else { 
      Toast.makeText(getApplicationContext(), "What do you want to eat today?", Toast.LENGTH_LONG).show(); 
     } 
    } 

    private class SectionsPagerAdapter extends FragmentStatePagerAdapter { 

     String tabTitles[] = {getString(R.string.regular), getString(R.string.lite)}; 
     Context context; 


     SectionsPagerAdapter(FragmentManager fm, Context context) { 
      super(fm); 
      this.context = context; 
     } 


     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
        new RegularFragment(); 
        return RegularFragment.newInstance(TAG, position); 
       case 1: 
        new LiteFragment(); 
        return LiteFragment.newInstance(TAG, position); 

       default: 
        return null; 
      } 
     } 

     @Override 
     public int getCount() { 
      return tabTitles.length; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      // Generate title based on item position 
      return tabTitles[position]; 
     } 

    } 

} 
` 

Dies ist das erste Fragment, das in meinen ersten Registern angezeigt werden soll

public class RegularFragment extends Fragment { 

    OnFragmentInteractionListener mListener; 

    // TODO: Rename parameter arguments, choose names that match 
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
    public static final String REGULAR_PARAM1 = "lite"; 
    View RootView; 
    List<RestaurantModel> regularRestaurants; 
    private RecyclerView recyclerView; 
    RecyclerViewAdapter adapter; 
    private Call<RestaurantElKbeer> callbackCall; 
    private String TAG = "RegularFragment"; 
    //new 
    public static final String ARG_PAGE = "ARG_PAGE"; 

    private int mPage; 

    public RegularFragment() { 
    } 

    // TODO: Rename and change types and number of parameters 
    public static Fragment newInstance(String param, int position) { 

     //TODO it might be important i didnt know why i created it 
     Fragment fragment = new RegularFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(param, position); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     regularRestaurants = requestRegularList(); 
     mPage = getArguments().getInt(ARG_PAGE); 

    } 

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

     //new 
     RootView = inflater.inflate(R.layout.fragment_regular, container, false); 
     recyclerView = (RecyclerView) RootView.findViewById(R.id.recyclerView); 
     recyclerView.setHasFixedSize(true); 
     initializeAdapter(); 
     LinearLayoutManager llm = new LinearLayoutManager(this.getContext()); 
     recyclerView.setLayoutManager(llm); 
     return RootView; 
    } 

    private void initializeAdapter() { 
     adapter = new RecyclerViewAdapter(getActivity(), regularRestaurants); 
     recyclerView.setAdapter(adapter); 
    } 

    // TODO: Rename method, update argument and hook method into UI event 
    public void onButtonPressed(Uri uri) { 
     if (mListener != null) { 
      mListener.onFragmentInteraction(uri); 
     } 
    } 

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


    private List<RestaurantModel> requestRegularList() { 
     List<RestaurantModel> myRestaurantsList = new ArrayList<>(); 
     RestAdapter restAdapter = new RestAdapter(); 
     API api = restAdapter.getApi(); 
     // URL: https://betaweb.jeebley.com/services_new/services.php?action=search&langId=1&countryId=21&cuisineType=1&cuisineId=all&areaId=1&delvType=1 

     Call<RestaurantElKbeer> call = api.getRestaurants("search", "1", "21", "all", "1", "1"); 
     call.enqueue(new Callback<RestaurantElKbeer>() { 
      @Override 
      public void onResponse(@NonNull Call<RestaurantElKbeer> call, @NonNull Response<RestaurantElKbeer> response) { 
       if (response.isSuccessful()) { 
        ArrayList<String> names = new ArrayList<String>(); 
        RestaurantElKbeer restaurantResponse = response.body(); 
        List<RestaurantModel> list = restaurantResponse.getRestaurantModel(); 
       if(list != null && !list.isEmpty()){ 
        for (int i = 0; i < list.size(); i++) { 
         String name; 
         name = list.get(i).getRName(); 
         names.add(name); 
         Log.i(TAG, "onResponse: " + names.get(i)); 
        } 

       } 
       else 
        { 
         Log.i(TAG, "onResponse(regular): RestaurantModelList is null"); 
        } 
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(getContext(), list); 
        recyclerView.setAdapter(adapter); 
        recyclerView.setOnClickListener(v -> { 
         Intent i = new Intent(getContext(), ChooseYourLanguage.class); 
         i.putExtra("Object", getId()); 
         startActivityForResult(i, 0); 
        }); 
       } 
      } 

      @Override 
      public void onFailure(@NonNull Call<RestaurantElKbeer> call, Throwable t) { 
       Log.i(TAG, "onFailure: failed RegularFragmentCall"); 
      } 
     }); 
     return myRestaurantsList; 
    } 


    interface OnFragmentInteractionListener { 
     // TODO: Update argument type and name 
     void onFragmentInteraction(Uri uri); 
    } 

    /** 
    * Initialize the contents of the Fragment host's standard options menu. You 
    * should place your menu items in to <var>menu</var>. For this method 
    * to be called, you must have first called {@link #setHasOptionsMenu}. See 
    * {@link RestaurantLogoView#onCreateOptionsMenu(Menu) Activity.onCreateOptionsMenu} 
    * for more information. 
    * 
    * @param menu  The options menu in which you place your items. 
    * @param inflater 
    * @see #setHasOptionsMenu 
    * @see #onPrepareOptionsMenu 
    * @see #onOptionsItemSelected 
    */ 
    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
    } 

    @Override 
    public void setHasOptionsMenu(boolean hasMenu) { 
     super.setHasOptionsMenu(hasMenu); 
    } 
} 
: Daten aus dem API Retrofit abzurufenden
so ist dies die Aktivität in den recyclerView Basen auf Benutzeraktion geladen werden

Und das ist mein RecyclerViewAdapter

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { 
    private List<RestaurantModel> items; 
    private Context ctx; 

    public RecyclerViewAdapter(Context context, List<RestaurantModel> items) { 
     this.ctx = context; 
     this.items=items; 
    } 


    private OnItemClickListener mOnItemClickListener; 
    private SharedPref sharedPref; 

    public interface OnItemClickListener { 
     void onItemClick(View view, RestaurantModel obj, int position); 
    } 

    public void setOnItemClickListener(final OnItemClickListener mItemClickListener) { 
     this.mOnItemClickListener = mItemClickListener; 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 

     CardView cv; 
     TextView title; 
     TextView description; 
     ImageView imageView; 

     ViewHolder(View itemView) { 
      super(itemView); 
      cv = (CardView) itemView.findViewById(R.id.restaurant_card_view); 
      title = (TextView) itemView.findViewById(R.id.restaurantName_section_label); 
      description = (TextView) itemView.findViewById(R.id.section_label2); 
      imageView = (ImageView) itemView.findViewById(R.id.restaurantImageView); 
     } 
    } 


    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.restaurant_card_layout, parent, false); 
     return new ViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position, List<Object> payloads) { 
     super.onBindViewHolder(holder, position, payloads); 
     RestaurantModel p = (RestaurantModel) payloads.get(position); 
     holder.title.setText(p.getRName()); 
     if (!p.getDelvType().equals("1")) { 
      holder.description.setText(p.getJDeliveryTime() + " " + p.getRMinOrderAmt() + " " + p.getJDeliveryCharge()); 
     } else { 
      holder.description.setText(p.getRDeliveryTime() + " " + p.getRMinOrderAmt() + " " + p.getRDeliveryCharge()); 
      holder.imageView.setImageResource(R.mipmap.ic_launcher); 
     } 
     holder.cv.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.i("RecyclerViewAdapter", "onClick: replace with intent to send Restaurant data"); 
      } 
     }); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder,int position) { 

     final RestaurantModel p = items.get(position); 
     holder.title.setText(p.getRName()); 
     if (!p.getDelvType().equals("1")) { 
      holder.description.setText(p.getJDeliveryTime() + " " + p.getRMinOrderAmt() + " " + p.getJDeliveryCharge()); 
     } else { 
      holder.description.setText(p.getRDeliveryTime() + " " + p.getRMinOrderAmt() + " " + p.getRDeliveryCharge()); 

     } 
     holder.cv.setOnClickListener(view -> { 
       mOnItemClickListener.onItemClick(view, p, position); 

     }); 
    } 


    @Override 
    public int getItemCount() { 
     return items.size(); 
    } 

    public interface OnLoadMoreListener { 
     void onLoadMore(int current_page); 
    } 
} 

Diese Ausnahme ist, ich bin

**

06-06 00 bekommen: 11: 05.215 10.571 bis 10.571/com.jeebley. jeebley E/AndroidRuntime: FATALE AUSNAHME: Haupt Prozess: com.jeebley.jeebley, PID: 10571 java.lang.NullPointerException: Versuch, Schnittstelle Methode 'int java.util.List.size()' auf eine Null-Objekt-Referenz aufzurufen bei com.jeebley.jeebley.adapters.RecyclerViewAdapter.getItemCount (RecyclerViewAdapter.java:109) bei android.support.v7.widget.RecyclerView.dispatchLayoutStep1 (RecyclerView.java:3493) bei android.support.v7.widget.RecyclerView .dispatchLayout (RecyclerView.java:3310) bei android.support.v7.widget.RecyclerView.onLayout (RecyclerView.java:3844) bei android.view.View.layout (View.java:17687) bei android.view .ViewGroup.layout (ViewGroup.java:5631) bei android.widget.RelativeLayout.onLayout (RelativeLayout.java:1079) bei android.view.View.layout (View.java:17687) bei android.view.ViewGroup .layout (Vi ewGroup.java:5631) bei android.support.v4.view.ViewPager.onLayout (ViewPager.java:1795) bei android.view.View.layout (View.java:17687) bei android.view.ViewGroup. Layout (ViewGroup.java:5631) bei android.support.design.widget.HeaderScrollingViewBehavior.layoutChild (HeaderScrollingViewBehavior.java:131) bei android.support.design.widget.ViewOffsetBehavior.onLayoutChild (ViewOffsetBehavior.java:42) bei android.support.design.widget.AppBarLayout $ ScrollingViewBehavior.onLayoutChild (AppBarLayout.java:1391) bei android.support.design.widget.CoordinatorLayout.onLayout (CoordinatorLayout.java:870) bei android.view. View.layout (View.java:17687) bei android.view.ViewGroup.layout (ViewGroup.java:5631) bei android.widget.FrameLayout.layoutChildren (FrameLayout.java:325) bei android.widget.FrameLayout. onLayout (FrameLayout.java:261) bei android.view.View.layout (View.java:17687) bei android.view.ViewGroup.layout (ViewGroup.java:5631) bei android.widget.LinearLayout.setChildFrame (LinearLayout.java:1762) bei android.widget.LinearLayout.layoutVertical (LinearLayout.java:1606) bei android.widget.LinearLayout.onLayout (LinearLayout.java:1515) bei android.view.View.layout (View.java: 17687) bei android.view.ViewGroup.layout (ViewGroup.java:5631) bei android.widget.FrameLayout.layoutChildren (FrameLayout.java:325) bei android.widget.FrameLayout.onLayout (FrameLayout.java: 261) bei android.view.View.layout (View.java:17687) bei android.view.ViewGroup.layout (ViewGroup.java:5631) bei android.widget.LinearLayout.setChildFrame (LinearLayout.java:1762) bei android.widget.LinearLayout.layoutVertical (LinearLayout.java:1606) bei android.widget.LinearLayout.onLayout (LinearLayout.java:1515) bei android.view.View.layout (View.java:17687) bei android.view.ViewGroup.layout (ViewGroup.java:5631) bei android.widget.FrameLayout.layoutChildren (FrameLayout.java:325) bei android.widget.FrameLayout.onLayout (FrameLayout.java:261) bei com.android.internal.policy.DecorView.onLayout (DecorView.java:774) bei android.view.View.layout (View.java:17687) bei android.view.ViewGroup.layout (ViewGroup.java:5631) bei android.view.ViewRootImpl.performLayout (ViewRootImpl.java:2511) bei android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2226) bei android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1364) bei android.view.ViewRootImpl $ TraversalRunnable.run (ViewRootImpl.java:6763) bei android.view.Choreographer $ CallbackRecord.run (Choreographer.java:923) bei android.view.Choreographer.doCallbacks (Choreographer.java: 735) bei android.view.Choreographer.doFrame (Choreographer.java:667) bei android.view.Choreographer $ FrameDisplayEventReceiver.run (Choreographer.java:909) bei android.os.Handler.handleCallback (Handler.java: 761) bei android.os.Handler.dispatchMessage (Handler.java:98) bei android.os.Looper.loop (Looper.java:156) bei android.app.ActivityThread.main (Activit yThread.java:6524) bei java.lang.reflect.Method.invoke (native Methode) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java: 941) bei com.android.internal .os.ZygoteInit.main (ZygoteInit.java:831) 06-06 00: 11: 05.238 10571-10571/com.jeebley.jeebley I/Prozess: Senden des Signals. PID: 10571 SIG: 9

**

Antwort

0

Dies ist, was Sie tun:

List<RestaurantModel> list = restaurantResponse.getRestaurantModel(); 
for (int i = 0; i < list.size(); i++) { 
    String name; 
    name = list.get(i).getRName(); 
    names.add(name); 
    Log.i(TAG, "onResponse: " + names.get(i)); 
} 

Soweit ich in der Fehler Spur, Ihr Problem, dass die Liste null zu sehen ist wenn Sie für die Größe fragen, so sollten Sie fragen, ob die Liste nicht null ist vor:

... 
List<RestaurantModel> list = restaurantResponse.getRestaurantModel(); 
if(list != null && !list.isEmpty()){ 
    for (int i = 0; i < list.size(); i++) { 
     String name; 
     name = list.get(i).getRName(); 
     names.add(name); 
     Log.i(TAG, "onResponse: " + names.get(i)); 
    } 
} 
... 

EDIT:

In Ihrem Adapter, ändern diese Methode:

@Override 
public int getItemCount() { 
    return items!=null ? items.size() : 0; 
} 

Die Methode getItemCount() vor dem Array Initialisierung innerhalb des Adapters Lebenszyklus aufgerufen wird. Aus diesem Grund müssen Sie überprüfen, ob Ihre Liste null ist oder nicht, um npe zu vermeiden.

+0

im Grunde war ich nur hier testen, aber was ich wirklich tun möchte, ist das Restaurant Name, Beschreibung und Mindestbestellwert zu laden, die ich von der api erhalten wird, so dass in beiden Fällen die Daten nicht angezeigt wird, und Ich bin mir nicht sicher, warum oder in welchem ​​Prozess der Absturz passiert und das Debuggen ist nur so irritierend ich weiß nicht die meisten Schritte –

+0

Ich habe die If-Bedingung, um den Null-Zustand zu überprüfen, und ich aktualisierte die neue Ausnahme geworfen werden kann Bitte schauen Sie es sich an –

0

Zuerst prüfen Sie, ob restaurantResponse.getRestaurantModel() null zurückgibt.

List<RestaurantModel> list = restaurantResponse.getRestaurantModel(); 
if(list == null){ 
    enter code here 
} 
+0

ja Mann ich tat so und aktualisierte die Ausnahme, die über –

+0

geworfen wurde, ich aktualisierte auch den Code oben können Sie bitte einen Blick in meine Recycler-Ansicht-Adapter auch vielleicht mache ich etwas falsch, aber ich kann ' Ich verstehe es nicht –

Verwandte Themen