java - 自定义 GridView

标签 java android eclipse gridview

我有一个自定义的 GridView 适配器,它有两个参数。第一个用于项目名称,第二个用于 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)

自定义适配器类:

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 正确地提供数据。

Appart 表示,您的 getView 实现是错误的,因为您没有正确更新 View :您必须每次都设置值,而不仅仅是在您创建 View 时。

这是你的固定代码:

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

如果不为null,则检查URI解析是否正常:

try {
    Uri uri = Uri.parse(Imageid[position]);
    Log.d("picasso", uri.toString());
} catch (Exception ex) {
    ex.printStackTrace();
}

还可以考虑在您的列表适配器中实现 View 持有者模式,以提高性能并获得更流畅的响应。

关于java - 自定义 GridView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28505553/

相关文章:

java - 如何关闭 Windows 7 上的 headless (headless)图形环境

Android:将项目添加为库,在 Build Path>Libraries>Library Projects 中获取(丢失).jar 文件

c++ - 在 Vim 中调用层次结构 Eclipse 功能?

android - SimpleAdapter 每秒崩溃一次

android - Fragments 中的工具栏标题

java - 如何在 Spock 中返回 Long 的 stub 方法?

java - 获取文件资源的静态方式

java - 如何在 Junit 4 中自定义 TestSuite 测试?

java - 调用System.gc()时是否可以使用G1垃圾收集器

Android:Button.performClick 的可视化版本