Sabre
Sabre

Reputation: 4183

How to use arrays in my custom adapter?

I have custom listview adapter to display two rows of data. I can set this data into String[] name = {some values};, but I can't create listview from arrays. Here is the code of activity:

public class ListAction extends Activity implements OnClickListener {

    String[] data = { "Sample User Data ", "Sample User Data ",
        "Sample User Data ", "Sample User Data ", "Sample User Data ",
        "Sample User Data ", "Sample User Data ", "Sample User Data ",
        "Sample User Data ", "Sample User Data ", "Sample User Data ",
        "Sample User Data ", "Sample User Data ", "Sample User Data ",
        "Sample User Data ", "Sample User Data " };
    String[] data2 = { "Sample User Data 2", "Sample User Data 2",
            "Sample User Data 2", "Sample User Data 2", "Sample User Data 2",
            "Sample User Data 2", "Sample User Data 2", "Sample User Data 2",
            "Sample User Data 2", "Sample User Data 2", "Sample User Data 2",
            "Sample User Data 2", "Sample User Data 2", "Sample User Data 2",
            "Sample User Data 2", "Sample User Data 2" };

    ListView myList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list);

        myList = (ListView) findViewById(R.id.listView);
        myList.setAdapter((ListAdapter) new MyCustomAdapter());
        myList.setCacheColorHint(0);

        myList.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> a, View v, int position,
                    long id) {
                String itemname = new Integer(position).toString();

                Intent intent = new Intent();
                intent.setClass(ListAction.this, ViewClient.class);

                Bundle b = new Bundle();
                b.putString("fileName", itemname);
                intent.putExtras(b);

                startActivity(intent);
            }
        });
    }

    class MyCustomAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return data.length;
        }

        @Override
        public String getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public int getItemViewType(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public int getViewTypeCount() {
            // TODO Auto-generated method stub
            return data.length;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = getLayoutInflater();
            View row;

            row = inflater.inflate(R.layout.list_item, parent, false);
            TextView textLabel = (TextView) row.findViewById(R.id.text);
            textLabel.setText(data[position]);

            TextView textLabel2 = (TextView) row.findViewById(R.id.text2);
            textLabel2.setText(data2[position]);

            return (row);
        }
    }
}

I want to fill listview with data from arrays, for example like this: String[] data = getResources().getStringArray(R.array.categories); but I only get NullPointer at this row. Please, help.


Log:

04-06 23:35:00.110: E/AndroidRuntime(11420): FATAL EXCEPTION: main
04-06 23:35:00.110: E/AndroidRuntime(11420): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example/com.example.ListAction}: java.lang.NullPointerException
04-06 23:35:00.110: E/AndroidRuntime(11420):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1573)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at android.os.Looper.loop(Looper.java:130)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at android.app.ActivityThread.main(ActivityThread.java:3687)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at java.lang.reflect.Method.invokeNative(Native Method)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at java.lang.reflect.Method.invoke(Method.java:507)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at dalvik.system.NativeStart.main(Native Method)
04-06 23:35:00.110: E/AndroidRuntime(11420): Caused by: java.lang.NullPointerException
04-06 23:35:00.110: E/AndroidRuntime(11420):    at android.content.ContextWrapper.getResources(ContextWrapper.java:80)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at com.example.ListAction.<init>(ListAction.java:25)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at java.lang.Class.newInstanceImpl(Native Method)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at java.lang.Class.newInstance(Class.java:1409)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
04-06 23:35:00.110: E/AndroidRuntime(11420):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1565)
04-06 23:35:00.110: E/AndroidRuntime(11420):    ... 11 more

25th row is String[] data = getResources().getStringArray(R.array.categories);

Upvotes: 0

Views: 1637

Answers (4)

znat
znat

Reputation: 13474

Make sure String[] data = getResources().getStringArray(R.array.categories); is in onCreate() after super.onCreate(). The context must be instantiated before you call its methods.

Upvotes: 1

MAC
MAC

Reputation: 15847

see this complete example given here....

http://android-example-code.blogspot.in/p/dynamic-custoized-list-view-in-android.html

enter image description here

Upvotes: 1

Danuofr
Danuofr

Reputation: 1710

You need to pass your array into your custom adapter or else it will not know the correct size and position will not work

Upvotes: 0

Shubhayu
Shubhayu

Reputation: 13552

You are not passing your arrays to the adapter. Pass it using a constructor or use an ArrayAdapter. Try this tutorial.

http://www.shubhayu.com/android/listview-with-arrayadapter-and-customized-items

Upvotes: 0

Related Questions