Iar0slav
Iar0slav

Reputation: 11

android fragment custom adapter

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

Answers (1)

mikeswright49
mikeswright49

Reputation: 3416

Ok the issue here is

  1. 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.

  2. 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

Related Questions