Reputation: 42854
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)
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
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
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
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