Dhrumil Mayur Mehta
Dhrumil Mayur Mehta

Reputation: 459

Android application crashes due to RecyclerView

I am trying to add a simple RecyclerView in my Mainscreen Activity with each view containing names of fruits. Before the addition of RecyclerView code, my app worked well. But after adding RecyclerView code, it started crashing. After some debugging, I came to know that my app crashes when I set the RecyclerView adapter to my recyclerView object. In this statement precisely: list_container.setAdapter(list_container_adapter);

Please help where I might be going wrong. Below is the complete code provided.

Mainscreen.java:

public class MainScreen extends AppCompatActivity {


private RecyclerView list_container;
private RecyclerView.Adapter list_container_adapter;
private RecyclerView.LayoutManager list_container_layout_manager;
private String[] fruits = {"Apple","Mango","Banana","Orange","Grapes","Cherry","Grapes","Pineapple","Stawberry","Litchi",
"Custard Apple","Plum","Peaches","Dragonfruit","Chickoo","Sweet Lime"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_screen);
    Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
    toolbar.setTitle("");
    setSupportActionBar(toolbar);
    myView = findViewById(R.id.my_view);
    list_container = (RecyclerView)findViewById(R.id.list_container);
    list_container.setHasFixedSize(true);
    list_container_layout_manager = new LinearLayoutManager(this);
    list_container.setLayoutManager(list_container_layout_manager);
    list_container_adapter = new ListContainerAdapter(MainScreen.this,fruits);
    list_container.setAdapter(list_container_adapter);
}
}

ListContainerAdapter.java:

public class ListContainerAdapter extends RecyclerView.Adapter<ListContainerAdapter.MyViewHolder> {
private String[] mDataset;
private Context context;
public static class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView mTextView;
    public MyViewHolder(TextView v) {
        super(v);
        mTextView = (TextView) v.findViewById(R.id.texttemp);
    }
}

public ListContainerAdapter(Context context, String[] myDataset) {
    this.context = context;
    mDataset = myDataset;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType) {

    TextView v = (TextView) LayoutInflater.from(parent.getContext())
            .inflate(R.layout.list_container_element, parent, true);

    MyViewHolder vh = new MyViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    holder.mTextView.setText(mDataset[position]);

}

@Override
public int getItemCount() {
    return mDataset.length;
}
}

build.gradle:

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.bismuth.deadline"
        minSdkVersion 21
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation 'com.android.support:support-v4:27.1.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    implementation 'com.android.support:recyclerview-v7:27.1.1'
    implementation 'com.android.support:design:27.1.1'
}

Stacktrace

06-27 02:34:07.906 2711-2711/com.bismuth.deadline E/AndroidRuntime: 
FATAL EXCEPTION: main Process: com.bismuth.deadline, PID: 2711 
java.lang.ClassCastException: android.support.v7.widget.RecyclerView 
cannot be cast to android.widget.TextView at com.bismuth.deadline.ListContainerAdapter.onCreateViewHolder(ListContainerAdapter.java:30) at com.bismuth.deadline.ListContainerAdapter.onCreateViewHolder(ListContainerAdapter.java:9)

list_container_element.xml:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:paddingTop="20dp"
        android:paddingBottom="20dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:textSize="25dp"
        android:id="@+id/texttemp"
        android:gravity="center" />
</LinearLayout>

Upvotes: 1

Views: 1435

Answers (2)

Tosin John
Tosin John

Reputation: 524

Your are casting a Layout into a TextView wrongly, your onCreateViewHolder should look like this:

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

  View v = LayoutInflater.from(parent.getContext())
        .inflate(R.layout.list_container_element, parent, true);

  MyViewHolder vh = new MyViewHolder(v);
  return vh;
}

Then MyViewHolder constructor should accept a View instead of TextView:

public MyViewHolder(View v) {
    super(v);
    mTextView = (TextView) v.findViewById(R.id.texttemp);
}

Upvotes: 1

Barns
Barns

Reputation: 4848

Should actually be:

public MyViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType) {

    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.list_container_element, parent, true);

    return new MyViewHolder(v);
}

In your code you are casting the View into a TextView.

public MyViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType) {

    TextView v = (TextView) LayoutInflater.from(parent.getContext())
            .inflate(R.layout.list_container_element, parent, true);

    MyViewHolder vh = new MyViewHolder(v);
    return vh;
}

You might also check to see it you need to pass false as a parameter for attachToRoot in the inflate() method instead .

Upvotes: 2

Related Questions