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
相关产品推荐
相关产品推荐

