【问题标题】:I get a Null Reference on my Recycler View我在回收站视图中获得空引用
【发布时间】:2016-06-13 21:30:27
【问题描述】:

如果我的英语不完美,我很抱歉。

自 2 周以来我正在学习 Java 和 Android Studio,我正在尝试添加滑动选项卡,并在选项卡内添加一个 RecyclerView,其中 CardViews 作为具有名称和图片的行项。 我的滑动标签有效,我可以在标签中放置一个卡片视图,带有图片和名称。但是当我使用 RecyclerView 时,它不起作用并且出现错误。从昨天开始我就无法解决这个问题。

这是我的程序。

我的班级人

public class Person {
String name;
int photoId;

public Person(String name, int photoId) {
    this.name = name;
    this.photoId = photoId;
}


private List<Person> persons;

private void initializeData(){
    persons = new ArrayList<>();
    persons.add(new Person("Benjamin", R.drawable.team));
    persons.add(new Person("Thomas", R.drawable.haltere));
}
//GETTER
public String getName() {
    return this.name;
}

public int getPhoto() {
    return this.photoId;
}

我的班级适配器

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder>{

public static class PersonViewHolder extends RecyclerView.ViewHolder {
    CardView cv;
    TextView personName;
    ImageView personPhoto;

    PersonViewHolder(View itemView) {
        super(itemView);
        cv = (CardView)itemView.findViewById(R.id.cardView);
        personName = (TextView)itemView.findViewById(R.id.cardTitle);
        personPhoto = (ImageView)itemView.findViewById(R.id.cardPhoto);
    }
}

List<Person> persons;

public RVAdapter(List<Person> persons){
    this.persons = persons;
}

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

@Override
public PersonViewHolder onCreateViewHolder (ViewGroup viewGroup, int viewType) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cardview, viewGroup, false);
    return new PersonViewHolder(v);
}

@Override
public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
    personViewHolder.personName.setText(persons.get(i).name);
    personViewHolder.personPhoto.setImageResource(persons.get(i).photoId);
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

我的活动

public class ActivityHome extends AppCompatActivity {

// Declaring Your View and Variables

Toolbar toolbar;
ViewPager pager;
ViewPagerAdapter adapter;
SlidingTabLayout tabs;
CharSequence Titles[]={"1","2","3","4"};
int Numboftabs =4;

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

    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);

    RecyclerView rv = (RecyclerView)findViewById(R.id.my_recycler_view);
    ArrayList<Person> persons = new ArrayList<>();
    RVAdapter rAdapter = new RVAdapter(persons);
    rv.setAdapter(rAdapter);
    rv.setLayoutManager(layoutManager);
}

(后面有一些代码,但它只用于滑动标签,并且有效。)

我的 recycler_view.xml

<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/my_recycler_view"
xmlns:android="http://schemas.android.com/apk/res/android" />

我的activity_home.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"
tools:context=".MainActivity">

<include
    android:id="@+id/tool_bar"
    layout="@layout/tool_bar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    />

<Tab.SlidingTabLayout
    android:id="@+id/tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:elevation="2dp"
    android:background="@color/colorPrimary" />


<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:layout_weight="1"
    ></android.support.v4.view.ViewPager>

还有我的 cardview.xml

<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
app:cardBackgroundColor="#ffffff"
app:cardCornerRadius="5dp"
app:cardElevation="7dp">

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ActivityHome"
    android:background="#ffffff">


    <TextView
        android:id="@+id/cardTitle"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="15dp"
        android:text="Card Title"
        android:textColor="#000000"
        android:textSize="17sp" />

    <ImageView
        android:id="@+id/cardPhoto"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:layout_marginTop="50dp"
        android:src="@drawable/haltere"
        android:scaleType="center"
        />
</RelativeLayout>

我的错误:

Process: com.android.frutii.fitness5, PID:640                                                                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.frutii.fitness5/com.android.frutii.fitness5.ActivityHome}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2464)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2526)
at android.app.ActivityThread.access$800(ActivityThread.java:169)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5549)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference
at com.android.frutii.fitness5.ActivityHome.onCreate(ActivityHome.java:45)
at android.app.Activity.performCreate(Activity.java:5975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2526) 
at android.app.ActivityThread.access$800(ActivityThread.java:169) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421) 
at android.os.Handler.dispatchMessage(Handler.java:111) 
at android.os.Looper.loop(Looper.java:194) 
at android.app.ActivityThread.main(ActivityThread.java:5549) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759) 

我在互联网上阅读了很多答案,但无法摆脱这个错误。

【问题讨论】:

标签: java android android-studio android-recyclerview android-cardview


【解决方案1】:

Activity.findViewById() 方法是在使用setContentView() 设置的布局内搜索my_recycler_view。所以你应该将RecyclerView 移动到R.layout.activity_home 布局。

【讨论】:

    【解决方案2】:

    您的 RecyclerView ID 为 R.id.my_recycler_view 在 activity_home 布局中不存在。使用R.layout.recycler 作为setContentView(); 中的contentView 布局

    【讨论】:

      【解决方案3】:

      我移动了我的 RecyclerView.xml,我将代码放在了 activity_home.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"
      tools:context=".MainActivity">
      
      <include
          android:id="@+id/tool_bar"
          layout="@layout/tool_bar"
          android:layout_height="wrap_content"
          android:layout_width="match_parent"
          />
      
      <Tab.SlidingTabLayout
          android:id="@+id/tabs"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:elevation="2dp"
          android:background="@color/colorPrimary"/>
      
      
      
      <android.support.v4.view.ViewPager
          android:id="@+id/pager"
          android:layout_height="match_parent"
          android:layout_width="match_parent"
          android:layout_weight="1"
          >
      
          <android.support.v7.widget.RecyclerView
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:id="@+id/my_recycler_view"
              xmlns:android="http://schemas.android.com/apk/res/android" />
      </android.support.v4.view.ViewPager>
      

      现在我部分工作了,我有 4 个选项卡,我也有一个卡片视图,但只有一个 :( 为什么我的第二个不在这里?也许这不是好事,我不必往这个方向走。。?

      【讨论】:

      • 请为此创建单独的问题并添加对您想要实现的目标的描述。现在你知道了 NP 的原因,你原来的问题已经解决了。
      猜你喜欢
      • 2021-07-12
      • 2021-10-16
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 2016-01-24
      • 2019-11-05
      相关资源
      最近更新 更多