I'm a newbie to Fragments
and custom ListView
adapters. Can anyone give me a hand please?
I've got my Fragment
where I have my ListView
public class RecordingListFragment extends Fragment implements OnItemClickListener {
ListView mListView;
TextView emptyView;
Button options, delete,edit;
ArrayList<String> recordings = null;
RecordingsListAdapter mAdapter;
public RecordingListFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.recording_list_fragment, container,false);
options = (Button) rootView.findViewById(R.id.options);
edit = (Button) rootView.findViewById(R.id.edit);
delete = (Button) rootView.findViewById(R.id.delete);
mListView = (ListView) rootView.findViewById(R.id.list);
emptyView = (TextView) rootView.findViewById(R.id.empty);
mAdapter = new RecordingsListAdapter(this, recordings);
mListView.setAdapter(mAdapter);
mListView.setEmptyView(emptyView);
mListView.setOnItemClickListener(this);
return rootView;
}
}
and my xml for it
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android1="http://schemas.android.com/apk/res/android"
android:id="@+id/recording_list_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical">
<RelativeLayout
android:layout_height="50dp"
android:layout_width="match_parent"
android:orientation="horizontal"
android:background="@drawable/title" >
<TextView
android1:id="@+id/title"
android1:layout_width="wrap_content"
android1:layout_height="50dp"
android1:layout_alignParentTop="true"
android1:layout_centerHorizontal="true"
android1:layout_marginStart="80dp"
android1:gravity="center"
android1:text="@string/app_name"
android1:textAlignment="center"
android1:textColor="#000000"
android1:textStyle="bold" />
</RelativeLayout>
<FrameLayout
android:layout_height="wrap_content"
android:layout_width="match_parent">
<ListView
android:id="@+id/list"
android:animateLayoutChanges="true"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<!-- android:divider="@null"-->
<TextView
android:id="@+id/empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/empty_list_text"
android:paddingLeft="30dp"
android:paddingRight="30dp"
android:paddingTop="180dp" />
</FrameLayout>
</LinearLayout>
and I've got my custom list item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal" >
<CheckedTextView
android:id="@+id/textView"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorSingle"
android:paddingLeft="6dip"
android:paddingRight="6dip"
android:textColor="#000000"
/>
</LinearLayout>
and finally, my Adapter
public class RecordingsListAdapter extends BaseAdapter {
Context ctx;
LayoutInflater lInflater;
ArrayList<String> recordings;
RecordingsListAdapter(Context context, ArrayList<String> products) {
ctx = context;
recordings = products;
lInflater = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public RecordingsListAdapter(RecordingListFragment recordingListFragment,
ArrayList<String> recordings) {
// TODO Auto-generated constructor stub
}
@Override
public int getCount() {
return recordings.size();
}
@Override
public Object getItem(int position) {
return recordings.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.custom_list_item, parent, false);
}
return view;
}
}
and when I run this, I get this null pointer
11-26 11:00:45.352: E/AndroidRuntime(10191): java.lang.RuntimeException: Unable to start activity ComponentInfo{d/recordings.RecordingsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.ActivityThread.access$800(ActivityThread.java:144)
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.os.Handler.dispatchMessage(Handler.java:102)
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.os.Looper.loop(Looper.java:135)
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.ActivityThread.main(ActivityThread.java:5221)
11-26 11:00:45.352: E/AndroidRuntime(10191): at java.lang.reflect.Method.invoke(Native Method)
11-26 11:00:45.352: E/AndroidRuntime(10191): at java.lang.reflect.Method.invoke(Method.java:372)
11-26 11:00:45.352: E/AndroidRuntime(10191): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
11-26 11:00:45.352: E/AndroidRuntime(10191): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
11-26 11:00:45.352: E/AndroidRuntime(10191): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
11-26 11:00:45.352: E/AndroidRuntime(10191): at recordings.RecordingsListAdapter.getCount(RecordingsListAdapter.java:36)
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.widget.ListView.setAdapter(ListView.java:487)
11-26 11:00:45.352: E/AndroidRuntime(10191): at recordings.RecordingListFragment.onCreateView(RecordingListFragment.java:47)
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.Fragment.performCreateView(Fragment.java:2053)
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894)
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.BackStackRecord.run(BackStackRecord.java:833)
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.Activity.performStart(Activity.java:5948)
11-26 11:00:45.352: E/AndroidRuntime(10191): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
11-26 11:00:45.352: E/AndroidRuntime(10191): ... 10 more
Thank you in advance!!!
You should initialize yours recordings. You are passing to adapter null
ArrayList<String> recordings = null; //You are passing this null
This issue is due to ArrayList variable not being instantiated. Need to declare "recordings" variable like following, that should solve the issue;
ArrayList<String> recordings = new ArrayList<String>();
this calls default constructor and assigns empty string to the recordings variable so that it is not null anymore.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With