使用 CustomAdapter 更新 GridView 中的 ImageView

Updating an ImageView inside a GridView using a CustomAdapter

我有问题

我遇到的问题是:

java.lang.NullPointerException: Attempt to invoke interface method 
'java.lang.Object java.util.Map.get(java.lang.Object)' on a null object reference

我想做的是将一个 ArrayList(包含一个 Hashmap)传递给一个自定义的 GridViewAdaptor,这样我就可以根据文件名将 ImageView 设置为某个电子邮件。这是我的 classes:

代码

ClaimFilesActivity.java

public class ClaimFilesActivity extends Activity {

ArrayList<LinkedHashMap<String, String>> oslist = new ArrayList<LinkedHashMap<String, String>>();

//URL to get JSON Array
private static String url = "xxx";
private static String title = "Folder";

//JSON Node Names
private static final String TAG_ARRAY_NAME = "results";
private static final String TAG_FOLDER_ID = "folder_id";
private static final String TAG_FOLDER_NAME = "folder_name";
private static final String TAG_NAME = "file_name";
private static final String TAG_FILENAME = "file_filename";

JSONArray android = null;
GridView gridView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_claim_folder);

    gridView = (GridView) findViewById(R.id.gridView);
    oslist = new ArrayList<LinkedHashMap<String, String>>();
    new JSONParse().execute();
    setTitle(title);

}

private class JSONParse extends AsyncTask<String, String, JSONObject> {
    private ProgressDialog dialog = new ProgressDialog(ClaimFilesActivity.this);

    @Override
    protected void onPreExecute() {
        this.dialog.setMessage("Loading Data. Please Wait...");
        this.dialog.show();
        ArrayList<LinkedHashMap<String, String>> oslist = new ArrayList<LinkedHashMap<String, String>>();
    }

    @Override
    protected JSONObject doInBackground(String... args) {

        JSONParser jParser = new JSONParser();

        // Getting JSON from URL
        JSONObject json = jParser.getJSONFromUrl(url);
        return json;
    }

    @Override
    protected void onPostExecute(JSONObject json) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        }
        try {
            // Getting JSON Array from URL
            android = json.getJSONArray(TAG_ARRAY_NAME);
            for (int i = 0; i < android.length(); i++) {
                JSONObject c = android.getJSONObject(i);

                // Storing  JSON items in Variables
                String folderID = c.getString(TAG_FOLDER_ID);
                String filename = c.getString(TAG_NAME);
                String ftitle = c.getString(TAG_FOLDER_NAME);
                String fFileName = c.getString(TAG_FILENAME);

                // Adding value HashMap key => value
                LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
                //part2 is the time part of the Date/Time String combo
                map.put(TAG_FOLDER_ID, folderID);
                map.put(TAG_NAME, filename);
                map.put(TAG_FOLDER_NAME, ftitle);
                oslist.add(map);

                gridView.setAdapter(new GridViewFilesAdapter(ClaimFilesActivity.this, oslist));
                gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    public void onItemClick(AdapterView<?> parent, View v,
                                            int position, long id) {
                        Toast.makeText(
                                getApplicationContext(),
                                ((TextView) v.findViewById(R.id.fileName))
                                        .getText(), Toast.LENGTH_SHORT).show();

                    }
                });

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }
}

}

GridViewFilesAdapter.java

public class GridViewFilesAdapter extends BaseAdapter {
private Context context;
ArrayList<LinkedHashMap<String, String>> dataList;

public GridViewFilesAdapter(Context context, ArrayList<LinkedHashMap<String, String>> oslist) {
    this.context = context;
    this.dataList = oslist;
}

public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View gridView;

    if (convertView == null) {

        gridView = new View(context);

        // get layout from mobile.xml
        gridView = inflater.inflate(R.layout.grid_row, null);

        // set value into textview
        TextView textView = (TextView) gridView
                .findViewById(R.id.fileName);
        textView.setText(((Map)getItem(position)).get("file_name").toString());
        // set image based on selected text
        ImageView imageView = (ImageView) gridView
                .findViewById(R.id.fileImg);


        if (((Map)getItem(position)).get("file_filename").toString().endsWith(".pdf")) {
            imageView.setImageResource(R.mipmap.ic_pdf_filetype);
        } else {
            imageView.setImageResource(R.mipmap.ic_docx_filetype);
        }

    } else {
        gridView = (View) convertView;
    }

    return gridView;
}

@Override
public int getCount() {
    return dataList.size();
}

@Override
public Object getItem(int position) {
    return null;
}

@Override
public long getItemId(int position) {
    return 0;
}

}

有人知道我的问题是什么吗?日志告诉我问题出在 GridViewFilesAdapter class 这一行:

textView.setText(((Map)getItem(position)).get("file_name").toString());

谢谢

编辑:LOGCAT:

07-27 16:18:29.661  11561-11561/com.tutecentral.navigationdrawer E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.tutecentral.navigationdrawer, PID: 11561
java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.Map.get(java.lang.Object)' on a null object reference
        at com.tutecentral.navigationdrawer.GridViewFilesAdapter.getView(GridViewFilesAdapter.java:44)
        at android.widget.AbsListView.obtainView(AbsListView.java:2347)
        at android.widget.GridView.onMeasure(GridView.java:1060)
        at android.view.View.measure(View.java:17547)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
        at android.view.View.measure(View.java:17547)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
        at android.view.View.measure(View.java:17547)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
        at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:447)
        at android.view.View.measure(View.java:17547)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2615)
        at android.view.View.measure(View.java:17547)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2015)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1173)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1379)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
        at android.view.Choreographer.doCallbacks(Choreographer.java:580)
        at android.view.Choreographer.doFrame(Choreographer.java:550)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

改变你的

@Override public Object getItem(int position) { return null }

@Override public Object getItem(int position) { return dataList.get(position); }

您不能 return null/integers 作为对象。