Search code examples
javaandroidcustom-adapter

Not an enclosing class error


I'm trying to set the adapter but its giving me the error not an enclosing class in my onCreateView method on below line.

CustomAdapter adapter = new CustomAdapter(SecondYearFragment.this, sub);      

Here is my Actvity.xml

<android.support.constraint.ConstraintLayout 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:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/content_main">

</FrameLayout>

<android.support.design.widget.BottomNavigationView
    android:id="@+id/navigation"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="0dp"
    android:layout_marginStart="0dp"
    android:background="?android:attr/windowBackground"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:menu="@menu/navigation" />

And here is the fragment_third_year.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"
tools:context=".SecondYearFragment">

<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/listviewthird"/></RelativeLayout>

Here is the sec_year_dept.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">


<ImageView
    android:id="@+id/image_below"
    android:layout_width="match_parent"
    android:layout_height="150dp"
    android:src="@drawable/background_1" />

<TextView
    android:id="@+id/dept_name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:paddingBottom="@dimen/text_padding_top_bottom"
    android:paddingLeft="@dimen/text_padding_left_right"
    android:paddingRight="@dimen/text_padding_left_right"
    android:paddingTop="@dimen/text_padding_top_bottom"
    android:text="@string/app_name"
    android:textSize="@dimen/text_size"
    android:textStyle="bold" /></RelativeLayout>

Here is the ThirdYearFragment class

public class ThirdYearFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

ListView mListview;
String[] sub = {"random1", "random2", "random3", };

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;

private OnFragmentInteractionListener mListener;

public ThirdYearFragment() {
    // Required empty public constructor
}

public static ThirdYearFragment newInstance(String param1, String param2) {
    ThirdYearFragment fragment = new ThirdYearFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

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


    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_third_year, container, true);

    ListView listView = view.findViewById(R.id.listviewsecond);
    CustomAdapter adapter = new CustomAdapter(SecondYearFragment.this, sub);
    listView.setAdapter(adapter);
    return view;
} }

And here is my custom adapter

public  class CustomAdapter extends ArrayAdapter<String> {
String[] subjects;
Context mContext;

public CustomAdapter(@NonNull Context context, String[] subjects) {
    super(context, R.layout.sec_year_dept);
    this.subjects = subjects;
    this.mContext = context;
}

@Override
public int getCount() {
    return subjects.length;   //returns the size of the list
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    ViewHolder mViewHolder = new ViewHolder();
    if(convertView == null) {
        LayoutInflater mInflator = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = mInflator.inflate(R.layout.sec_year_dept, parent, false);
        mViewHolder.mSubjects = (TextView) convertView.findViewById(R.id.dept_name);
        mViewHolder.mSubjects.setText(subjects[position]);
        convertView.setTag(mViewHolder);
    }else {
        mViewHolder = (ViewHolder) convertView.getTag();
    }
    return convertView;
}
static class ViewHolder {
    TextView mSubjects;
}}

Can someone please explain me what is going on and what am i missing?


Solution

  • Try this:

    CustomAdapter adapter = new CustomAdapter(this.getContext(), sub); 
    

    You were reference a fragment that isn't instantiated in the current fragment SecondYearFragment. So it won't have a context yet.

    Also, fragments are not contexts so it wouldn't work even if it was instantiated.