Devrath
Devrath

Reputation: 42854

listview using arrayadapter in android

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)

Upvotes: 0

Views: 176

Answers (3)

Raghunandan
Raghunandan

Reputation: 133560

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);

Upvotes: 1

AnAndroid
AnAndroid

Reputation: 567

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.

Upvotes: 0

kalyan pvs
kalyan pvs

Reputation: 14590

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;
}

Upvotes: 2

Related Questions