1

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?

rahul2234
  • 21
  • 3
  • Becz of this line CustomAdapter adapter = new CustomAdapter(SecondYearFragment.this, sub); use this instead of SecondYearFragment.this – Mirza Ahmed Baig May 17 '18 at 18:37

2 Answers2

1

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.

Levi Moreira
  • 11,917
  • 4
  • 32
  • 46
  • And Yes it is crashing the app saying null reference. So setting custom adapter on fragment doesn't work? – rahul2234 May 17 '18 at 19:08
1

Use CustomAdapter adapter = new CustomAdapter(getContext(), sub);

The syntax you are using is used to access the enclosing class instance in an anonymous class. ThirdYearFragment is not an enclosing class of SecondYearFragment that is why you're getting this error.

Abdul Wadood
  • 1,161
  • 1
  • 10
  • 18