Reputation: 11
I have some problems with using custom adapter in Android Fragment. Here is code. But before I used this code in activity and everything was Ok. I can't find where I make mistake during using Fragments.
package com.testapp.test.fragments;
import org.holoeverywhere.LayoutInflater;
import org.holoeverywhere.app.Fragment;
import com.testapp.test.R;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
public class LawDocFragment extends Fragment{
private static LawDocFragment instance;
public static LawDocFragment getInstance() {
if (LawDocFragment.instance == null) {
return new LawDocFragment();
}
return LawDocFragment.instance;
}
public LawDocFragment() {
LawDocFragment.instance = this;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
String[] zakonmenubig;
String[] zakonmenusmall;
Integer[] zakonmenuicon = { R.drawable.ic_menu_zakonu_pravila,
R.drawable.ic_menu_zakonu_strafu,
R.drawable.ic_menu_zakonu_doc,
R.drawable.ic_menu_zakonu_u77,
R.drawable.ic_menu_zakonu_u33,
R.drawable.ic_menu_zakonu_u400,
R.drawable.ic_menu_zakonu_p1103};
myAdapter zakonAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View LawDoc = inflater.inflate(R.layout.zakonbaza);
ListView zakonmenulist = (ListView)LawDoc.findViewById(R.id.zakonmenulist);
zakonAdapter = new myAdapter();
zakonmenulist.setAdapter(zakonAdapter);
zakonmenubig = getResources().getStringArray(R.array.zakonmenubig);
zakonmenusmall = getResources().getStringArray(R.array.zakonmenusmall);
return LawDoc;
}
//start myAdapter
public class myAdapter extends BaseAdapter {
private LayoutInflater mLayoutInflater;
public myAdapter(Context ctx) {
mLayoutInflater = LayoutInflater.from(ctx);
}
public int getCount() {
return zakonmenubig.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public String getString(int position) {
return zakonmenubig[position] + " (" + zakonmenusmall[position] + ")";
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
convertView = mLayoutInflater.inflate(R.layout.list_zakonbaza, null);
ImageView image = (ImageView) convertView.findViewById(R.id.icon);
image.setImageResource(zakonmenuicon[position]);
TextView sign = (TextView) convertView.findViewById(R.id.zakonmenuitem);
sign.setText(zakonmenubig[position]);
TextView date = (TextView) convertView.findViewById(R.id.zakonmenuitemsmall);
date.setText(zakonmenusmall[position]);
return convertView;
}
} // end myAdapter
}
Now Eclipse show me error "The constructor LawDocFragment.myAdapter() is undefined" in line
zakonAdapter = new myAdapter();
if I will change to
zakonAdapter = new myAdapter(getActivity());
I will get this EXCEPTION
12-27 00:39:25.297: E/AndroidRuntime(652): FATAL EXCEPTION: main
12-27 00:39:25.297: E/AndroidRuntime(652): java.lang.NullPointerException
12-27 00:39:25.297: E/AndroidRuntime(652): at com.testapp.test.fragments.fragments.LawDocFragment$myAdapter.getCount(LawDocFragment.java:72)
12-27 00:39:25.297: E/AndroidRuntime(652): at android.widget.ListView.setAdapter(ListView.java:436)
12-27 00:39:25.297: E/AndroidRuntime(652): at com.testapp.test.fragments.fragments.LawDocFragment.onCreateView(LawDocFragment.java:55)
12-27 00:39:25.297: E/AndroidRuntime(652): at android.support.v4.app._HoloFragment.onCreateView(_HoloFragment.java:177)
12-27 00:39:25.297: E/AndroidRuntime(652): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
12-27 00:39:25.297: E/AndroidRuntime(652): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
12-27 00:39:25.297: E/AndroidRuntime(652): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
12-27 00:39:25.297: E/AndroidRuntime(652): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
12-27 00:39:25.297: E/AndroidRuntime(652): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
12-27 00:39:25.297: E/AndroidRuntime(652): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
12-27 00:39:25.297: E/AndroidRuntime(652): at android.os.Handler.handleCallback(Handler.java:587)
12-27 00:39:25.297: E/AndroidRuntime(652): at android.os.Handler.dispatchMessage(Handler.java:92)
12-27 00:39:25.297: E/AndroidRuntime(652): at android.os.Looper.loop(Looper.java:123)
12-27 00:39:25.297: E/AndroidRuntime(652): at android.app.ActivityThread.main(ActivityThread.java:4627)
12-27 00:39:25.297: E/AndroidRuntime(652): at java.lang.reflect.Method.invokeNative(Native Method)
12-27 00:39:25.297: E/AndroidRuntime(652): at java.lang.reflect.Method.invoke(Method.java:521)
12-27 00:39:25.297: E/AndroidRuntime(652): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-27 00:39:25.297: E/AndroidRuntime(652): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-27 00:39:25.297: E/AndroidRuntime(652): at dalvik.system.NativeStart.main(Native Method)
in line "LawDocFragment.java:72" I have this code
return zakonmenubig.length;
and in line "LawDocFragment.java:55" I have
zakonmenulist.setAdapter(zakonAdapter);
I think something wrong with class myAdapter but what... and why in simple activity everything is Ok..
I found this issue and try to work with code but still nothing
Upvotes: 0
Views: 2579
Reputation: 3416
Ok the issue here is
Having the blank constructor is correct in showing an error as there is no constructor like that in your adapter class. So either create a Constructor with no arguments (bad idea), or just pass in the context.
Your null pointer occurs because
zakonmenubig
is not defined yet when you are creating the adapter, instead create those elements before your adapter like this:
zakonmenubig = getResources().getStringArray(R.array.zakonmenubig);
zakonmenusmall = getResources().getStringArray(R.array.zakonmenusmall);
ListView zakonmenulist = (ListView)LawDoc.findViewById(R.id.zakonmenulist);
zakonAdapter = new myAdapter();
zakonmenulist.setAdapter(zakonAdapter);
As now your zakonmenubig will be initialized.
Upvotes: 1