1

Все, что я пытаюсь сделать, это создать recyclerview внутри tablayout. Я попытался настроить адаптер в основном действии, а также использовать фрагмент im в tablayout, но в любом случае im все еще получаю эту ошибку.Nullpointerexception on RecyclerView

java.lang.RuntimeException: не удалось запустить Activity ComponentInfo {knightsrealms.managment_app/knightsrealms.managment_app.Dashboard}: java.lang.NullPointerException: попытка вызвать виртуальный метод void android.support.v7.widget.RecyclerView.setAdapter (android.support.v7.widget.RecyclerView $ Adapter)»на ссылку на объект нулевой

package knightsrealms.managment_app; 

import android.support.design.widget.TabLayout; 
import android.support.v4.content.ContextCompat; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 

import java.util.ArrayList; 
import java.util.Calendar; 

public class Dashboard extends AppCompatActivity { 

private TabLayout tabLayout; 
private ViewPager viewPager; 
private ViewPageAdapter viewPagerAdapter; 
ArrayList<knightsrealms.managment_app.Calendar> contacts = new    ArrayList<knightsrealms.managment_app.Calendar>(5); 

@Override protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_dashboard); 
    tabLayout = (TabLayout) findViewById(R.id.tabs); 
    viewPager = (ViewPager) findViewById(R.id.viewpager); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar); 
    viewPagerAdapter = new ViewPageAdapter(getSupportFragmentManager()); 
    viewPager.setAdapter(viewPagerAdapter); 
    final LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    setSupportActionBar(toolbar); 



    final TabLayout.Tab messages = tabLayout.newTab(); 
    final TabLayout.Tab dashboard = tabLayout.newTab(); 

    messages.setText("Messages"); 
    dashboard.setText("Dashboard"); 

    tabLayout.addTab(dashboard, 0); 
    tabLayout.addTab(messages, 1); 

    tabLayout.setTabTextColors(ContextCompat.getColorStateList(this, R.color.tab_selector)); 
    tabLayout.setSelectedTabIndicatorColor(ContextCompat.getColor(this, R.color.indicator)); 
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      viewPager.setCurrentItem(tab.getPosition()); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 

     } 
    }); 

    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
      RecyclerView rvContacts = (RecyclerView)findViewById(R.id.rvcal); 


    contacts.add(0, new knightsrealms.managment_app.Calendar("Number 1",true)); 
    contacts.add(1, new knightsrealms.managment_app.Calendar("Number 2",true)); 
    CalendarAdapter adapter = new CalendarAdapter(contacts); 


    rvContacts.setAdapter(adapter); 
    rvContacts.setLayoutManager(new LinearLayoutManager(this)); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.dashboard_menu, menu); 
    return true; 
} 

void selectPage(int pageIndex){ 
    tabLayout.setScrollPosition(pageIndex,0f,true); 
    viewPager.setCurrentItem(pageIndex); 
} 
} 

это мой адаптер

package knightsrealms.managment_app; 

import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.TextView; 

import java.util.List; 

public class CalendarAdapter extends  RecyclerView.Adapter<CalendarAdapter.ViewHolder> { 

    // Provide a direct reference to each of the views within a data item 
    // Used to cache the views within the item layout for fast access 
    public static class ViewHolder extends RecyclerView.ViewHolder { 
     // Your holder should contain a member variable 
     // for any view that will be set as you render a row 
     public TextView nameTextView; 
     public Button messageButton; 

     // We also create a constructor that accepts the entire item row 
     // and does the view lookups to find each subview 
     public ViewHolder(View itemView) { 
      // Stores the itemView in a public final member variable that can be used 
      // to access the context from any ViewHolder instance. 
      super(itemView); 

      nameTextView = (TextView) itemView.findViewById(R.id.contact_name); 
      messageButton = (Button) itemView.findViewById(R.id.message_button); 
     } 

    } 

private List<Calendar> mContacts; 

    // Pass in the contact array into the constructor 
    public CalendarAdapter(List<Calendar> contacts) { 
    mContacts = contacts; 
    } 

// Usually involves inflating a layout from XML and returning the holder 
@Override 
public CalendarAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    Context context = parent.getContext(); 
    LayoutInflater inflater = LayoutInflater.from(context); 

    // Inflate the custom layout 
    View contactView = inflater.inflate(R.layout.recyclercell, parent, false); 

    // Return a new holder instance 
    ViewHolder viewHolder = new ViewHolder(contactView); 
    return viewHolder; 
} 

// Involves populating data into the item through holder 
@Override 
public void onBindViewHolder(CalendarAdapter.ViewHolder viewHolder, int position) { 
    // Get the data model based on position 
    Calendar contact = mContacts.get(position); 

    // Set item views based on the data model 
    TextView textView = viewHolder.nameTextView; 
    textView.setText(contact.getName()); 

    Button button = viewHolder.messageButton; 

    if (contact.isOnline()) { 
     button.setText("Message"); 
     button.setEnabled(true); 
    } 
    else { 
     button.setText("Offline"); 
     button.setEnabled(false); 
    } 

} 

// Return the total count of items 
@Override 
public int getItemCount() { 
    return mContacts.size(); 
} 
} 

Этот код для фрагмента, который находится внутри tablayout

<android.support.v7.widget.RecyclerView 
android:id="@+id/rvcal" 
android:layout_width="match_parent" 
android:layout_height="match_parent" /> 

</RelativeLayout> 

И это основная деятельность XML

<RelativeLayout 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" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 

<include 
android:id="@+id/tool_bar" 
layout="@layout/tool_bar" 
></include> 

<android.support.design.widget.TabLayout 
android:id="@+id/tabs" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:background="@color/colorPrimary" 
android:layout_below="@+id/tool_bar" 
android:layout_alignParentLeft="true" 
android:layout_alignParentStart="true" 
app:tabIndicatorHeight="3dp"/> 

<android.support.v4.view.ViewPager 
android:id="@+id/viewpager" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_below="@+id/tabs" 
/> 

</RelativeLayout> 

любое понимание/помощь в это очень признателен спасибо!

+0

эта строка 'viewPager.setAdapter (viewPagerAdapter);' производит причину ошибки ViewPager равна нулю , Пожалуйста, поделитесь своим xml, чтобы мы могли видеть, что вы там делали и где ошибка. – Vucko

+0

@Vucko Я только что обновил вопрос с помощью xml – XvKnightvX

+0

, вы говорите, что этот xml является 'main_activity.xml', но в вашей деятельности' Dashboard' вы делаете 'setContentView (R.layout.activity_dashboard);'. Я думаю, возможно, вы пытаетесь получить доступ к viewpager в неправильном действии. Вы можете это проверить? Что такое MainActivity, и что такое Dasboard? – Vucko

ответ

1

у вас уже попробовать в:

tabLayout.setupWithViewPager(viewPager); 

Ну, потому что recyclerView в вашем фрагменте XML не в вашей деятельности XML, таким образом recyclerView является возвращение нуль. Ok, так что ваш код почти готов, но вам нужно больше 2 вещи:

  • во-первых, это класс, который расширяет FragmentPagerAdapter для ViewPager, я не знаю, если ваш класс ViewPageAdapter уже делают это, но давайте предположим, что вы еще этого не сделали.
  • второй, является фрагментом для вашего FragmentPagerAdapter.

Оке Начнём:

  1. в вашей панели мониторинга деятельности, создать статический класс скажем ViewPagerAdapter:

    static class ViewPagerAdapter extends FragmentPagerAdapter { 
    
        private final List<Fragment> fragmentList = new ArrayList<>(); 
        private final List<String> fragmentTitleList = new ArrayList<>(); 
    
        public ViewPagerAdapter(FragmentManager fm) { 
        super(fm); 
        } 
    
        public void addFragment(Fragment fragment, String title){ 
        fragmentList.add(fragment); 
        fragmentTitleList.add(title); 
        } 
    
        @Override 
        public Fragment getItem(int position) { 
        return fragmentList.get(position); 
        } 
    
        @Override 
        public int getCount() { 
        return fragmentList.size(); 
        } 
    
        @Override 
        public CharSequence getPageTitle(int position) { 
        return fragmentTitleList.get(position); 
        } 
    } 
    
  2. Создание FragmentContacts для FragmentPagerAdapter, в этом фрагменте вы должны управлять ваш RecyclerView и его адаптер не входят в Activity.

    public class FragmentContacts extends Fragment { 
        ArrayList<knightsrealms.managment_app.Calendar> contacts = new ArrayList<knightsrealms.managment_app.Calendar>(5); 
    
        @Nullable 
        @Override 
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
         View rootView = (View) inflater.inflate(R.layout.your_fragment_xml, container, false); 
    
         contacts.add(0, new knightsrealms.managment_app.Calendar("Number 1",true)); 
         contacts.add(1, new knightsrealms.managment_app.Calendar("Number 2",true)); 
         CalendarAdapter adapter = new CalendarAdapter(contacts); 
    
         RecyclerView rvContacts = (RecyclerView) rootView.findViewById(R.id.rvcal); 
         rvContacts.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); 
         rvContacts.setAdapter(adapter); 
    
         return rootView; 
        } 
    
    } 
    
  3. И наконец, обратно в Dashboard деятельности, в OnCreate, пусконаладку ваш ViewPager:

    @Override protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_dashboard); 
        Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar); 
    
        viewPager = (ViewPager) findViewById(R.id.viewpager); 
        viewPagerAdapter = new ViewPageAdapter(getSupportFragmentManager()); 
        viewPagerAdapter.addFragment(new FragmentContacts(),"Messages"); 
        viewPagerAdapter.addFragment(new FragmentContacts(),"Dashboard"); 
        viewPager.setAdapter(viewPagerAdapter); 
    
        tabLayout = (TabLayout) findViewById(R.id.tabs); 
        tabLayout.setupWithViewPager(viewPager); 
        viewPager.setCurrentItem(0); 
    } 
    
+0

Где именно я это положил?Я пробовал до и после набора вызова адаптера, но тот же результат – XvKnightvX

+0

wait Я редактирую свой ответ прямо сейчас .. :) Я еще не могу добавить комментарий, когда я впервые отправлю этот ответ – faruk