自定义网格视图
custom Grid View
我有一个获取 2 个参数的自定义网格视图适配器。第一个用于项目名称,第二个用于 img url 。并使用 Picasso library 加载图像。但是当我 运行 它并发送参数时它不起作用。
谢谢你的帮助 ;
日志:
02-13 17:40:14.964: E/AndroidRuntime(1342): FATAL EXCEPTION: main
02-13 17:40:14.964: E/AndroidRuntime(1342): Process: com.plusnet.tashrifat, PID: 1342
02-13 17:40:14.964: E/AndroidRuntime(1342): java.lang.NullPointerException: uriString
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.net.Uri$StringUri.<init>(Uri.java:467)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.net.Uri$StringUri.<init>(Uri.java:457)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.net.Uri.parse(Uri.java:429)
02-13 17:40:14.964: E/AndroidRuntime(1342): at plusnet.tashrifat.adapter.CustomGrid.getView(CustomGrid.java:55)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.AbsListView.obtainView(AbsListView.java:2255)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.GridView.makeAndAddView(GridView.java:1345)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.GridView.makeRow(GridView.java:345)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.GridView.fillDown(GridView.java:287)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.GridView.fillFromTop(GridView.java:421)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.GridView.layoutChildren(GridView.java:1233)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.AbsListView.onLayout(AbsListView.java:2087)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.View.layout(View.java:14817)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.View.layout(View.java:14817)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.View.layout(View.java:14817)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:678)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.View.layout(View.java:14817)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.View.layout(View.java:14817)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-13 17:40:14.964: E/AndroidRuntime(1342): at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.View.layout(View.java:14817)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.View.layout(View.java:14817)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1983)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1740)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.Choreographer.doCallbacks(Choreographer.java:574)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.Choreographer.doFrame(Choreographer.java:544)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.os.Handler.handleCallback(Handler.java:733)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.os.Handler.dispatchMessage(Handler.java:95)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.os.Looper.loop(Looper.java:136)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.app.ActivityThread.main(ActivityThread.java:5001)
02-13 17:40:14.964: E/AndroidRuntime(1342): at java.lang.reflect.Method.invokeNative(Native Method)
02-13 17:40:14.964: E/AndroidRuntime(1342): at java.lang.reflect.Method.invoke(Method.java:515)
02-13 17:40:14.964: E/AndroidRuntime(1342): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
02-13 17:40:14.964: E/AndroidRuntime(1342): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
02-13 17:40:14.964: E/AndroidRuntime(1342): at dalvik.system.NativeStart.main(Native Method)
自定义适配器 class:
public class CustomGrid extends BaseAdapter {
private Context mContext;
private final String[] name;
private final String[] Imageid;
public CustomGrid(Context c, String[] web, String[] Imageid) {
mContext = c;
this.Imageid = Imageid;
this.name = web;
}
public int getCount() {
// TODO Auto-generated method stub
return name.length;
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View grid;
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
grid = new View(mContext);
grid = inflater.inflate(R.layout.grid_single, null);
TextView textView = (TextView) grid.findViewById(R.id.grid_text);
ImageView imageView = (ImageView) grid
.findViewById(R.id.grid_image);
textView.setText(name[position]);
Picasso.with(mContext).load(Uri.parse(Imageid[position]))
.error(R.drawable.ic_launcher).into(imageView);
Log.d("picasso", Imageid[position]);
} else {
grid = (View) convertView;
}
return grid;
}
}
您的跟踪显示 "java.lang.NullPointerException: uriString",因此请检查您是否使用 Log 甚至 Toast 正确地提供数据。
显然,您的 getView 实现是错误的,因为您没有正确更新视图:您必须每次都设置值,而不仅仅是在您创建视图时。
这是您的固定密码:
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View grid;
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
grid = new View(mContext);
grid = inflater.inflate(R.layout.grid_single, null);
} else {
grid = (View) convertView;
}
// Refresh view
TextView textView = (TextView) grid.findViewById(R.id.grid_text);
ImageView imageView = (ImageView) grid.findViewById(R.id.grid_image);
textView.setText(name[position]);
Picasso.with(mContext).load(Uri.parse(Imageid[position])).error(R.drawable.ic_launcher).into(imageView);
Log.d("picasso", Imageid[position]);
return grid;
}
--- 编辑 ----------------------
检查打印的值:
Log.d("picasso", Imageid[position]);
如果不为空,则检查URI解析是否正常:
try {
Uri uri = Uri.parse(Imageid[position]);
Log.d("picasso", uri.toString());
} catch (Exception ex) {
ex.printStackTrace();
}
还可以考虑在您的列表适配器中实施视图持有者模式,以提高性能并获得更流畅的响应。
Uri.parse(Imageid[position]) 抛出空指针异常,在尝试解析之前检查 Imageid[position] 处的数据以确保它不为空。
我有一个获取 2 个参数的自定义网格视图适配器。第一个用于项目名称,第二个用于 img url 。并使用 Picasso library 加载图像。但是当我 运行 它并发送参数时它不起作用。 谢谢你的帮助 ; 日志:
02-13 17:40:14.964: E/AndroidRuntime(1342): FATAL EXCEPTION: main
02-13 17:40:14.964: E/AndroidRuntime(1342): Process: com.plusnet.tashrifat, PID: 1342
02-13 17:40:14.964: E/AndroidRuntime(1342): java.lang.NullPointerException: uriString
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.net.Uri$StringUri.<init>(Uri.java:467)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.net.Uri$StringUri.<init>(Uri.java:457)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.net.Uri.parse(Uri.java:429)
02-13 17:40:14.964: E/AndroidRuntime(1342): at plusnet.tashrifat.adapter.CustomGrid.getView(CustomGrid.java:55)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.AbsListView.obtainView(AbsListView.java:2255)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.GridView.makeAndAddView(GridView.java:1345)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.GridView.makeRow(GridView.java:345)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.GridView.fillDown(GridView.java:287)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.GridView.fillFromTop(GridView.java:421)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.GridView.layoutChildren(GridView.java:1233)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.AbsListView.onLayout(AbsListView.java:2087)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.View.layout(View.java:14817)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.View.layout(View.java:14817)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.View.layout(View.java:14817)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:678)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.View.layout(View.java:14817)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.View.layout(View.java:14817)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-13 17:40:14.964: E/AndroidRuntime(1342): at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.View.layout(View.java:14817)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.View.layout(View.java:14817)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1983)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1740)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.Choreographer.doCallbacks(Choreographer.java:574)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.Choreographer.doFrame(Choreographer.java:544)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.os.Handler.handleCallback(Handler.java:733)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.os.Handler.dispatchMessage(Handler.java:95)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.os.Looper.loop(Looper.java:136)
02-13 17:40:14.964: E/AndroidRuntime(1342): at android.app.ActivityThread.main(ActivityThread.java:5001)
02-13 17:40:14.964: E/AndroidRuntime(1342): at java.lang.reflect.Method.invokeNative(Native Method)
02-13 17:40:14.964: E/AndroidRuntime(1342): at java.lang.reflect.Method.invoke(Method.java:515)
02-13 17:40:14.964: E/AndroidRuntime(1342): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
02-13 17:40:14.964: E/AndroidRuntime(1342): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
02-13 17:40:14.964: E/AndroidRuntime(1342): at dalvik.system.NativeStart.main(Native Method)
自定义适配器 class:
public class CustomGrid extends BaseAdapter {
private Context mContext;
private final String[] name;
private final String[] Imageid;
public CustomGrid(Context c, String[] web, String[] Imageid) {
mContext = c;
this.Imageid = Imageid;
this.name = web;
}
public int getCount() {
// TODO Auto-generated method stub
return name.length;
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View grid;
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
grid = new View(mContext);
grid = inflater.inflate(R.layout.grid_single, null);
TextView textView = (TextView) grid.findViewById(R.id.grid_text);
ImageView imageView = (ImageView) grid
.findViewById(R.id.grid_image);
textView.setText(name[position]);
Picasso.with(mContext).load(Uri.parse(Imageid[position]))
.error(R.drawable.ic_launcher).into(imageView);
Log.d("picasso", Imageid[position]);
} else {
grid = (View) convertView;
}
return grid;
}
}
您的跟踪显示 "java.lang.NullPointerException: uriString",因此请检查您是否使用 Log 甚至 Toast 正确地提供数据。
显然,您的 getView 实现是错误的,因为您没有正确更新视图:您必须每次都设置值,而不仅仅是在您创建视图时。
这是您的固定密码:
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View grid;
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
grid = new View(mContext);
grid = inflater.inflate(R.layout.grid_single, null);
} else {
grid = (View) convertView;
}
// Refresh view
TextView textView = (TextView) grid.findViewById(R.id.grid_text);
ImageView imageView = (ImageView) grid.findViewById(R.id.grid_image);
textView.setText(name[position]);
Picasso.with(mContext).load(Uri.parse(Imageid[position])).error(R.drawable.ic_launcher).into(imageView);
Log.d("picasso", Imageid[position]);
return grid;
}
--- 编辑 ----------------------
检查打印的值:
Log.d("picasso", Imageid[position]);
如果不为空,则检查URI解析是否正常:
try {
Uri uri = Uri.parse(Imageid[position]);
Log.d("picasso", uri.toString());
} catch (Exception ex) {
ex.printStackTrace();
}
还可以考虑在您的列表适配器中实施视图持有者模式,以提高性能并获得更流畅的响应。
Uri.parse(Imageid[position]) 抛出空指针异常,在尝试解析之前检查 Imageid[position] 处的数据以确保它不为空。