使用 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 作为对象。
我有问题
我遇到的问题是:
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 作为对象。