0

I am trying to display a list of elements in listview


I have also used holder design pattern for efficiency of listview 

MainActivity.java

public class MainActivity extends Activity {
    ListView LV;

    String[] TITLE;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Bring the data from the resources to Java
        Resources res=getResources();//To Bring it use the resources references

        TITLE=res.getStringArray(R.array.title);

        LV=(ListView) findViewById(R.id.listView_id);

        AdapterClass myAdapter=new AdapterClass(this,TITLE);//declare the custom adapter
        LV.setAdapter(myAdapter);//set the adapter
    }
}

AdapterClass.java

public class AdapterClass extends ArrayAdapter<String>{

    Context cxt; String[] titleArray;
    public AdapterClass(Context c, String[] tITLE) {
        // TODO Auto-generated constructor stub
        super(c, R.layout.single_item, R.id.title_textView_id, tITLE);
        this.titleArray=tITLE;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        View row=convertView;
        MyViewHolder holder=null;
        if(row==null)
        {
            LayoutInflater inflater=(LayoutInflater) cxt.getSystemService(cxt.LAYOUT_INFLATER_SERVICE);
            row=inflater.inflate(R.layout.single_item, parent, false);
            holder=new MyViewHolder(row);
            row.setTag(holder);
        }
        else
        {
            holder=(MyViewHolder) row.getTag();
        }

        holder.myTitle.setText(titleArray[position]);
        return row;
    }



}

MyViewHolder.java

public class MyViewHolder {

    TextView myTitle;

    MyViewHolder(View row)
    {
        myTitle=(TextView) row.findViewById(R.id.title_textView_id);
    }


}

log::

12-31 11:03:17.070: E/AndroidRuntime(313): FATAL EXCEPTION: main
12-31 11:03:17.070: E/AndroidRuntime(313): java.lang.NullPointerException
12-31 11:03:17.070: E/AndroidRuntime(313):  at com.example.listviewpractice.AdapterClass.getView(AdapterClass.java:29)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.widget.AbsListView.obtainView(AbsListView.java:1315)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1198)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.widget.ListView.onMeasure(ListView.java:1109)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.view.View.measure(View.java:8171)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.widget.RelativeLayout.measureChild(RelativeLayout.java:563)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:378)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.view.View.measure(View.java:8171)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.view.View.measure(View.java:8171)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:526)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.view.View.measure(View.java:8171)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.view.View.measure(View.java:8171)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.view.ViewRoot.performTraversals(ViewRoot.java:801)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.os.Looper.loop(Looper.java:123)
12-31 11:03:17.070: E/AndroidRuntime(313):  at android.app.ActivityThread.main(ActivityThread.java:4627)
12-31 11:03:17.070: E/AndroidRuntime(313):  at java.lang.reflect.Method.invokeNative(Native Method)
12-31 11:03:17.070: E/AndroidRuntime(313):  at java.lang.reflect.Method.invoke(Method.java:521)
12-31 11:03:17.070: E/AndroidRuntime(313):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-31 11:03:17.070: E/AndroidRuntime(313):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-31 11:03:17.070: E/AndroidRuntime(313):  at dalvik.system.NativeStart.main(Native Method)

{Edit} - Wrt- Raghunandan answer

AdapterClass.java

public class AdapterClass extends ArrayAdapter<String>{

    Context cxt; String[] titleArray;

    LayoutInflater mInflater;

    public AdapterClass(Context c, String[] tITLE) {
        // TODO Auto-generated constructor stub
        super(c, R.layout.single_item, R.id.title_textView_id, tITLE);
        this.titleArray=tITLE;
        this.cxt=c;
         mInflater = LayoutInflater.from(c);


    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        View row=convertView;
        MyViewHolder holder=null;
        if(row==null)
        {

            row=mInflater.inflate(R.layout.single_item, parent, false);
            holder.myTitle =(TextView) row.findViewById(R.id.title_textView_id);
            //holder=new MyViewHolder(row);
            row.setTag(holder);
        }
        else
        {
            holder=(MyViewHolder) row.getTag();
        }

        holder.myTitle.setText(titleArray[position]);
        return row;
    }



}

MyViewHolder.java

public class MyViewHolder {

    TextView myTitle;



}

Log::

12-31 11:33:07.360: E/AndroidRuntime(504): FATAL EXCEPTION: main
12-31 11:33:07.360: E/AndroidRuntime(504): java.lang.NullPointerException
12-31 11:33:07.360: E/AndroidRuntime(504):  at com.example.listviewpractice.AdapterClass.getView(AdapterClass.java:39)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.widget.AbsListView.obtainView(AbsListView.java:1315)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1198)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.widget.ListView.onMeasure(ListView.java:1109)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.view.View.measure(View.java:8171)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.widget.RelativeLayout.measureChild(RelativeLayout.java:563)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:378)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.view.View.measure(View.java:8171)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.view.View.measure(View.java:8171)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:526)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.view.View.measure(View.java:8171)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.view.View.measure(View.java:8171)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.view.ViewRoot.performTraversals(ViewRoot.java:801)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.os.Looper.loop(Looper.java:123)
12-31 11:33:07.360: E/AndroidRuntime(504):  at android.app.ActivityThread.main(ActivityThread.java:4627)
12-31 11:33:07.360: E/AndroidRuntime(504):  at java.lang.reflect.Method.invokeNative(Native Method)
12-31 11:33:07.360: E/AndroidRuntime(504):  at java.lang.reflect.Method.invoke(Method.java:521)
12-31 11:33:07.360: E/AndroidRuntime(504):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-31 11:33:07.360: E/AndroidRuntime(504):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-31 11:33:07.360: E/AndroidRuntime(504):  at dalvik.system.NativeStart.main(Native Method)
2
  • 2
    You're missing the whole point of the ViewHolder pattern. Its benefit is that you don't have to traverse through the view hierarchy and find the specific view. You can just save a reference to it. Look up how the ViewHolder pattern actually works. Commented Dec 31, 2013 at 5:42
  • hey see my further edit. context is not initialized as kalyan pointed out. Initialize the infalter in the constructor itself Commented Dec 31, 2013 at 5:58

3 Answers 3

2

Context cxt;

is not initialized any where in your code..

so this line throws exception..

LayoutInflater inflater=(LayoutInflater) cxt.getSystemService(cxt.LAYOUT_INFLATER_SERVICE);

init in the constructor like..

 public AdapterClass(Context c, String[] tITLE) {
    // TODO Auto-generated constructor stub
    super(c, R.layout.single_item, R.id.title_textView_id, tITLE);
    this.titleArray=tITLE;
    cxt=c;
}
Sign up to request clarification or add additional context in comments.

3 Comments

its initialized in Holder class.
i actually missed the context part. I edited by looking at your post
@Raghunandan ok..based on your comment i have checked again..thank you for mentioning it..
1

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

 if(row==null)
    {
        LayoutInflater inflater=(LayoutInflater) cxt.getSystemService(cxt.LAYOUT_INFLATER_SERVICE);
        row=inflater.inflate(R.layout.single_item, parent, false);
        holder=new MyViewHolder(row);
        holder.myTitle =(TextView) row.findViewById(R.id.textviewidhere); // initialize
        row.setTag(holder);
    }

And Change to

static class MyViewHolder { 
TextView myTitle;
}

And

String[] titleArray;
 LayoutInflater mInflater
    public AdapterClass(Context c, String[] tITLE) {
        // TODO Auto-generated constructor stub
        super(c, R.layout.single_item, R.id.title_textView_id, tITLE);
        this.titleArray=tITLE;
        mInflater = LayoutInflater.from(c);  
    }

Then use mInflater in getView. You can remove this

LayoutInflater inflater=(LayoutInflater) cxt.getSystemService(cxt.LAYOUT_INFLATER_SERVICE)

And use

row=mInflater.inflate(R.layout.single_item, parent, false);

Edit:1

row=mInflater.inflate(R.layout.single_item, parent, false);
holder=new MyViewHolder(row);
holder.myTitle =(TextView) row.findViewById(R.id.title_textView_id);

4 Comments

@ Raghunandan .... please see the edit ... i reflected all the changes in your answer ... Im also looking answer of @AnAndroid .... how that why null pointer exception occuring ?
@NewBie that is not right coz you use setTag and getTag. Is the id of textview in the xml the same as the one you referred here and you have to uncomment initialization of view holder in the if part
@NewBie check the edit 1 in my post. first you need to initilaize view holder. then use the same to initialize myTitle
@NewBie upvote kalyan's answer as he also pointed out context was not initialized and he did it first
0

actually problem is that you didn't initialize view holder in 'else condition', you only initialize it in 'if condition', then if code go through the 'else condition' then without getting initialization of view holder it gives nullpointerexception.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.