You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中通过Intent传递String[]至ImageAdapter类报错求助

问题分析与解决方案

嘿,刚看了你的代码,马上就能发现几个关键问题,咱们一步步来解决:

首先得明确:ImageAdapter是BaseAdapter,不是Activity类,它根本没有getIntent()方法,你写的Bundle bundle = getIntent().getExtras();这行代码肯定会直接报错——这是核心问题。另外Intent是用来启动Activity/Service这类Android组件的,不是给Adapter传数据的,Adapter的数据应该通过构造方法或者setter方法传递。还有你的MainActivity里漏掉了加载布局的代码,这会导致GridView找不到,触发空指针异常。

下面是具体的代码修正方案:

1. 修正MainActivity

先补上布局加载,然后在异步请求拿到数组后,直接把数据传给ImageAdapter并绑定到GridView:

public class MainActivity extends AppCompatActivity {
    public static final String URL_LOGIN= "http://10.0.2.2/e-stitch/fatchimg.php?apicall=shirt";
    private GridView gridview; // 把GridView提为成员变量,方便在回调里访问

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); // 必须先加载布局,替换成你实际的布局文件名
        gridview = (GridView) findViewById(R.id.gridview); // 现在能正确找到GridView了
        userLogin();
    }

    private void userLogin() {
        StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_LOGIN,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONObject obj = new JSONObject(response);
                            if (!obj.getBoolean("error")) {
                                JSONArray arrJson = obj.getJSONArray("user");
                                String[] arr = new String[arrJson.length()];
                                for(int i = 0; i < arrJson.length(); i++) {
                                    arr[i] = arrJson.getString(i);
                                }
                                // 直接创建Adapter并传入数据,绑定到GridView
                                ImageAdapter adapter = new ImageAdapter(MainActivity.this, arr);
                                gridview.setAdapter(adapter);
                                // 这里可以补上Item点击事件
                                gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                                    @Override
                                    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                                        // 比如跳转到大图页面
                                        // Intent i = new Intent(MainActivity.this, FullImageActivity.class);
                                        // i.putExtra("imageUrl", arr[position]);
                                        // startActivity(i);
                                    }
                                });
                            } else {
                                Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show();
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                            Toast.makeText(getApplicationContext(), "数据解析出错啦", Toast.LENGTH_SHORT).show();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(getApplicationContext(), "网络请求失败:" + error.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("shirt", "shirt");
                return params;
            }
        };
        VolleySingleton.getInstance(this).addToRequestQueue(stringRequest);
    }
}

2. 修正ImageAdapter

删掉错误的Intent相关代码,通过构造方法接收Context和图片数组,初始化必要变量:

public class ImageAdapter extends BaseAdapter {
    private Context mContext;
    private String[] mThumbIds;
    private int imageTotal;

    // 修改构造方法,直接接收Context和图片链接数组
    public ImageAdapter(Context c, String[] thumbIds) {
        mContext = c;
        this.mThumbIds = thumbIds;
        this.imageTotal = thumbIds.length; // 直接初始化图片总数
    }

    @Override
    public int getCount() {
        return imageTotal;
    }

    @Override
    public String getItem(int position) {
        return mThumbIds[position];
    }

    @Override
    public long getItemId(int position) {
        return position; // 返回position更合理,不要固定返回0
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(480, 480));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        } else {
            imageView = (ImageView) convertView;
        }
        String url = getItem(position);
        // 注意:Picasso的with方法已过时,建议改用Picasso.get()
        Picasso.get()
                .load(url)
                .placeholder(R.drawable.loader)
                .fit()
                .centerCrop()
                .into(imageView);
        return imageView;
    }
}

额外小提示

  • 确保你的布局文件(比如activity_main.xml)里确实有id为gridview的GridView组件;
  • 记得在AndroidManifest.xml里添加网络权限:<uses-permission android:name="android.permission.INTERNET" />;
  • 如果你的Picasso版本比较新,with(mContext)已经被废弃,用Picasso.get()才是正确的写法。

这样修改后,就能把数据库拿到的图片链接数组正确传递给ImageAdapter,GridView也能正常加载显示图片啦~

内容的提问来源于stack exchange,提问作者M Izhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:44:43