javaandroidbaseadaptercustom-adapter

My App crashes after using a Custom Adapter


There is no error showing in the Java file or resources file. This app builds and installs on my device but when I run it, it shows nothing and crashes. What can I do? Here is all of the code and the error message from Logcat when I open the app from my device:

Error Message:

2020-11-13 16:09:33.634 26684-26684/com.example.android.playmanplay E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android.playmanplay, PID: 26684
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
    at com.example.android.playmanplay.CustomAdapter.getView(CustomAdapter.java:52)
    at android.widget.AbsListView.obtainView(AbsListView.java:2408)
    at android.widget.ListView.makeAndAddView(ListView.java:2126)
    at android.widget.ListView.fillDown(ListView.java:851)
    at android.widget.ListView.fillDown(ListView.java:833)
    at android.widget.ListView.fillFromTop(ListView.java:921)
    at android.widget.ListView.layoutChildren(ListView.java:1900)
    at android.widget.AbsListView.onLayout(AbsListView.java:2204)
    at android.view.View.layout(View.java:20699)
    at android.view.ViewGroup.layout(ViewGroup.java:6198)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
    at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1801)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1567)
    at android.view.View.layout(View.java:20699)
    at android.view.ViewGroup.layout(ViewGroup.java:6198)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:20699)
    at android.view.ViewGroup.layout(ViewGroup.java:6198)
    at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:446)
    at android.view.View.layout(View.java:20699)
    at android.view.ViewGroup.layout(ViewGroup.java:6198)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:20699)
    at android.view.ViewGroup.layout(ViewGroup.java:6198)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
    at android.view.View.layout(View.java:20699)
    at android.view.ViewGroup.layout(ViewGroup.java:6198)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at com.android.internal.policy.DecorView.onLayout(DecorView.java:757)
    at android.view.View.layout(View.java:20699)
    at android.view.ViewGroup.layout(ViewGroup.java:6198)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2872)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2399)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1534)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7421)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1092)
    at android.view.Choreographer.doCallbacks(Choreographer.java:888)
    at android.view.Choreographer.doFrame(Choreographer.java:819)
    at android.view.Choreographer$FrameHandler.handleMessage(Choreographer.java:991)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:201)
    at android.app.ActivityThread.main(ActivityThread.java:6810)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

MainActivity.java:

package com.example.android.playmanplay;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    
private ListView listview;
    private String[] countryNames;
     int[] flags = {R.drawable.afghanistan,R.drawable.bangladesh,R.drawable.bhutan,R.drawable.brazil,R.drawable.canada,
            R.drawable.china,R.drawable.denmark,R.drawable.egypt,R.drawable.france,R.drawable.ghana,R.drawable.haiti,
            R.drawable.iran,R.drawable.iran,R.drawable.japan,R.drawable.kenya,R.drawable.norway,R.drawable.netherlands,
            R.drawable.oman,R.drawable.pakistan,R.drawable.pakistan,R.drawable.russia,R.drawable.slovakia,R.drawable.srilanka,
            R.drawable.tajikistan,R.drawable.uzbekistn,R.drawable.wales,R.drawable.zimbabwe};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        countryNames = getResources().getStringArray(R.array.name_list);
        listview = findViewById(R.id.list_vew);
        //ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.text_setter,R.id.text_view,countryNames);

         CustomAdapter adapter = new CustomAdapter(this,countryNames,flags);
         listview.setAdapter(adapter);


    }
}

CustomAdapter.java:

package com.example.android.playmanplay;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

public class CustomAdapter extends BaseAdapter  {
    int[]flags;
    String[]countryNames;
    Context context;
    private LayoutInflater inflater;

    CustomAdapter(Context context, String[] countryNames,int[] flags){
        this.context = context;
        this.countryNames = countryNames;
        this.flags = flags;

    }
    @Override
    public int getCount() {

        return countryNames.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        if(convertView == null){
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = this.inflater.inflate(R.layout.text_setter,parent,false);
        }
        else{
            view = convertView;

        }
        ImageView imageView = convertView.findViewById(R.id.imageview);
        TextView textView = convertView.findViewById(R.id.text_view);

        imageView.setImageResource(flags[position]);
        textView.setText(countryNames[position]);
        return (view);
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#3D5AFE"
    tools:context=".MainActivity">

   <ListView
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:divider="@color/teal_200"
       android:dividerHeight="2dp"
       android:id="@+id/list_vew"
       />

</LinearLayout>

text_setter.xml

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

    <LinearLayout
        android:weightSum="4"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:orientation="horizontal"
        >

        <ImageView
            android:id="@+id/imageview"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:contentDescription="@string/flag_of_country"
            android:src="@drawable/afghanistan" />
        <LinearLayout
            android:layout_weight="3"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:orientation="vertical">


    <TextView
        android:layout_width="match_parent"
        android:layout_marginTop="5dp"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="@string/bangladesh"
        android:gravity="center_horizontal"
        android:textStyle="bold"
        android:id="@+id/text_view" />



    <TextView
        android:id="@+id/textviewdown"
        android:layout_marginTop="5dp"
        android:gravity="center_horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello"
        android:textAppearance="?android:attr/textAppearanceSmall"/>

        </LinearLayout>

    </LinearLayout>

</LinearLayout>

Solution

  • You are trying to set size with an appearance:

    <TextView
            android:id="@+id/textviewdown"
            android:layout_marginTop="5dp"
            android:gravity="center_horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/hello"
            android:textSize="?android:attr/textAppearanceSmall"/>
    

    This is your view that is throwing an UnsupportedOperationException . Remove the text size and add android:textAppearance="?android:attr/textAppearanceSmall