【问题标题】:Json parsing In Gridview is not WorkingGridview中的Json解析不起作用
【发布时间】:2014-07-26 01:31:18
【问题描述】:

我想在网格视图中显示我的用户(带有图像)我的 jSON 在数组中给我正确的响应

但解析 Json 数据后未显示在网格视图中

我的 Log Cat 没有给我任何错误 只是显示

06-05 12:21:12.269: I/Choreographer(4047): Skipped 1134 frames!  The application may be doing too much work on its main thread.

这是我的活动

public class MeetPeople extends Activity {

private ProgressDialog pDialog;
private GridView gridView;
//private GridViewAdapter customGridAdapter;
// URL to get contacts JSON
private static String url = "http://www.get2love.webitexperts.com/nearbyusers";

// JSON Node names
private static final String TAG_CONTACTS = "";
private static final String TAG_ID = "User_Id";
private static final String TAG_NAME = "User_Full_Name";
private static final String TAG_IMAGE = "User_Image";


// contacts JSONArray
JSONArray contacts = null;

// Hashmap for ListView
ArrayList<HashMap<String, String>> contactList;
GridViewAdapter customGridAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.meetpeople);
    //requestWindowFeature(Window.FEATURE_NO_TITLE);

    contactList = new ArrayList<HashMap<String, String>>();
    // Calling async task to get json
            new GetContacts().execute();
    //ListView lv = getListView();
    gridView = (GridView) findViewById(R.id.gridView);
    customGridAdapter = new GridViewAdapter(this, R.layout.row_grid, contactList);
    gridView.setAdapter(customGridAdapter);

    gridView.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View v,int position, long id) {
                        Toast.makeText(MeetPeople.this, position + "#Selected",Toast.LENGTH_SHORT).show();
                    }

                });

}

/**
 * Async task class to get json by making HTTP call
 * */
private class GetContacts extends AsyncTask<Void, Void, ArrayList<HashMap<String, String>>> {
    ArrayList<HashMap<String, String>>  contact_List = new ArrayList<HashMap<String, String>>();
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Showing progress dialog
        pDialog = new ProgressDialog(MeetPeople.this);
        pDialog.setMessage("Please wait...");
        pDialog.setCancelable(false);
        pDialog.show();

    }

    @Override
    protected ArrayList<HashMap<String, String>> doInBackground(Void... arg0) {
        List<NameValuePair> params = new ArrayList<NameValuePair>();

         UserModel user = (UserModel) getIntent().getSerializableExtra("User");
        String ID=String.valueOf(user.getUser_Id());
        String DST=String.valueOf(100);
        params.add(new BasicNameValuePair("id",ID));
        params.add(new BasicNameValuePair("distance", DST));
        // Creating service handler class instance
        ServiceHandler sh = new ServiceHandler();

        // Making a request to url and getting response
        String jsonStr = sh.makeServiceCall(url, ServiceHandler.POST, params);

        Log.d("Response: ", "> " + jsonStr);

        if (jsonStr != null) {
            try {
                JSONArray contacts = new JSONArray(jsonStr);

                // Getting JSON Array node


                // looping through All Contacts
                for (int i = 0; i < contacts.length(); i++) {
                    JSONObject c = contacts.getJSONObject(i);

                    String User_Id = c.getString(TAG_ID);
                    String User_Full_Name = c.getString(TAG_NAME);
                    String User_Image=c.getString(TAG_IMAGE);


                    // Phone node is JSON Object


                    // tmp hashmap for single contact

                    HashMap<String, String> contact = new HashMap<String, String>();

                    // adding each child node to HashMap key => value
                    contact.put(TAG_ID, User_Id);
                    contact.put(TAG_NAME, User_Full_Name);
                    contact.put(TAG_IMAGE, User_Image);


                    // adding contact to contact list
                    contact_List.add(contact);

                }
                return contact_List;
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            Log.e("ServiceHandler", "Couldn't get any data from the url");
        }

        return null;
    }

    @Override
    protected void onPostExecute(final ArrayList<HashMap<String, String>> result) {
        super.onPostExecute(result);
        // Dismiss the progress dialog
        if (pDialog.isShowing())
            pDialog.dismiss();
        contact_List=result;
        gridView = (GridView) findViewById(R.id.gridView);
        customGridAdapter = new GridViewAdapter(MeetPeople.this, R.layout.row_grid, contactList);
        gridView.setAdapter(customGridAdapter);
    /*runOnUiThread( new Runnable() {
        public void run() {
            contactList=result;

        }
    });*/

        /**
         * Updating parsed JSON data into ListView
         * */
        /*ListAdapter adapter = new SimpleAdapter(
                MeetPeople.this, contactList,
                R.layout.row_grid, new String[] { TAG_NAME
                        }, new int[] { R.id.name });

        setAdapter(customGridAdapter);*/
    }

}

}

这是我的 GridViewAdaptor

public class GridViewAdapter extends BaseAdapter {
private Context context;
private int layoutResourceId;
private ArrayList<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();

public GridViewAdapter(Context context, int layoutResourceId,ArrayList<HashMap<String, String>> data) {
   // super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    ViewHolder holder = null;

    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder();
        holder.imageTitle = (TextView) row.findViewById(R.id.text);
        holder.image = (ImageView) row.findViewById(R.id.image);
        row.setTag(holder);
    } else {
        holder = (ViewHolder) row.getTag();
    }

  //  ImageItem item = data.get(position);
    holder.imageTitle.setText(getItem(position, "TAG_NAME"));
    holder.image.setImageBitmap(getImage(position));
    return row;
}

static class ViewHolder {
    TextView imageTitle;
    ImageView image;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return 0;
}

public String getItem(int arg0,String key) {

    return data.get(arg0).get(key);
}
 public Bitmap getImage(int pos){
String  url = data.get(pos).get("TAG_IMAGE");
 MemoryCache memoryCache=new MemoryCache();
 Bitmap bitmap=memoryCache.get(url);
 if(bitmap!=null)
    // imageView.setImageBitmap(bitmap);
     return bitmap;
 else
 {
   // queuePhoto(url, imageView);
   //  imageView.setImageResource(loader);
 }
return null;


}
@Override
public long getItemId(int arg0) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return null;
}
 }

这是我的日志猫

06-05 12:20:47.039: D/StrictMode(4047):     at dalvik.system.NativeStart.main(Native Method)
06-05 12:20:53.799: D/Response:(4047): >     [{"User_Id":"49","User_Full_Name":"meet","User_Image":""},{"User_Id":"50","User_Full_Name":"meet","User_Image":"http:\/\/www.get2love.webitexperts.com\/profile_images\/1400754860profile.jpg"},{"User_Id":"51","User_Full_Name":"meet","User_Image":"http:\/\/www.get2love.webitexperts.com\/profile_images\/1400756097profile.jpg"},{"User_Id":"71","User_Full_Name":"hh","User_Image":"http:\/\/www.get2love.webitexperts.com\/profile_images\/1401479271profile.jpg"},{"User_Id":"72","User_Full_Name":"hh","User_Image":"http:\/\/www.get2love.webitexperts.com\/profile_images\/1401479340profile.jpg"},{"User_Id":"73","User_Full_Name":"lkjh","User_Image":"http:\/\/www.get2love.webitexperts.com\/profile_images\/1401479662profile.jpg"},{"User_Id":"76","User_Full_Name":"jhon","User_Image":"http:\/\/www.get2love.webitexperts.com\/profile_images\/1401714195profile.jpg"},{"User_Id":"79","User_Full_Name":"sammy","User_Image":"http:\/\/www.get2love.webitexperts.com\/profile_images\/1401889294profile.jpg"}]
 06-05 12:21:12.269: I/Choreographer(4047): Skipped 1134 frames!  The application may be doing too much work on its main thread.
 06-05 12:21:38.829: I/Choreographer(4047): Skipped 1533 frames!  The application may be doing too much work on its main thread.

谁能解决我想在 GridView (UserImage) 中显示这些响应的问题

请提前谢谢

我在代码中编辑后的新 logcat....根据 ansewer

06-05 13:22:22.849: E/Trace(8790): error opening trace file: No such file or directory (2)
06-05 13:23:41.839: E/Buffer Error(8790): Error converting result java.lang.NullPointerException

06-05 13:23:41.839: E/JSON Parser(8790): 解析数据时出错 org.json.JSONException: 在字符 0 处输入结束 06-05 13:23:51.759:E/AndroidRuntime(8790):致命异常:AsyncTask #1 06-05 13:23:51.759: E/AndroidRuntime(8790): java.lang.RuntimeException: 执行 doInBackground() 时发生错误 06-05 13:23:51.759: E/AndroidRuntime(8790): 在 android.os.AsyncTask$3.done(AsyncTask.java:299) 06-05 13:23:51.759: E/AndroidRuntime(8790): 在 java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 06-05 13:23:51.759: E/AndroidRuntime(8790): 在 java.util.concurrent.FutureTask.setException(FutureTask.java:124) 06-05 13:23:51.759: E/AndroidRuntime(8790): 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 06-05 13:23:51.759: E/AndroidRuntime(8790): 在 java.util.concurrent.FutureTask.run(FutureTask.java:137) 06-05 13:23:51.759: E/AndroidRuntime(8790): 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 06-05 13:23:51.759: E/AndroidRuntime(8790): 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 06-05 13:23:51.759: E/AndroidRuntime(8790): 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 06-05 13:23:51.759: E/AndroidRuntime(8790): 在 java.lang.Thread.run(Thread.java:856) 06-05 13:23:51.759:E/AndroidRuntime(8790):原因:java.lang.NullPointerException 06-05 13:23:51.759: E/AndroidRuntime(8790): 在 com.example.phonebook.MainActivity$loginAccess.doInBackground(MainActivity.java:149) 06-05 13:23:51.759: E/AndroidRuntime(8790): at com.example.phonebook.MainActivity$loginAccess.doInBackground(MainActivity.java:1) 06-05 13:23:51.759: E/AndroidRuntime(8790): 在 android.os.AsyncTask$2.call(AsyncTask.java:287) 06-05 13:23:51.759: E/AndroidRuntime(8790): 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 06-05 13:23:51.759: E/AndroidRuntime(8790): ... 还有 5 个 06-05 13:23:52.309: E/WindowManager(8790): 活动 com.example.phonebook.MainActivity 泄露了最初添加在这里的窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@420415a0 06-05 13:23:52.309: E/WindowManager(8790): android.view.WindowLeaked: Activity com.example.phonebook.MainActivity 泄露了窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@420415a0最初添加在这里 06-05 13:23:52.309: E/WindowManager(8790): 在 android.view.ViewRootImpl.(ViewRootImpl.java:374) 06-05 13:23:52.309: E/WindowManager(8790): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:292) 06-05 13:23:52.309: E/WindowManager(8790): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224) 06-05 13:23:52.309: E/WindowManager(8790): 在 android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149) 06-05 13:23:52.309: E/WindowManager(8790): 在 android.view.Window$LocalWindowManager.addView(Window.java:547) 06-05 13:23:52.309: E/WindowManager(8790): 在 android.app.Dialog.show(Dialog.java:277) 06-05 13:23:52.309: E/WindowManager(8790): at com.example.phonebook.MainActivity$loginAccess.onPreExecute(MainActivity.java:139) 06-05 13:23:52.309: E/WindowManager(8790): 在 android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586) 06-05 13:23:52.309: E/WindowManager(8790): 在 android.os.AsyncTask.execute(AsyncTask.java:534) 06-05 13:23:52.309: E/WindowManager(8790): at com.example.phonebook.MainActivity$2.onClick(MainActivity.java:112) 06-05 13:23:52.309: E/WindowManager(8790): 在 android.view.View.performClick(View.java:4084) 06-05 13:23:52.309: E/WindowManager(8790): 在 android.view.View$PerformClick.run(View.java:16987) 06-05 13:23:52.309: E/WindowManager(8790): 在 android.os.Handler.handleCallback(Handler.java:615) 06-05 13:23:52.309: E/WindowManager(8790): 在 android.os.Handler.dispatchMessage(Handler.java:92) 06-05 13:23:52.309: E/WindowManager(8790): 在 android.os.Looper.loop(Looper.java:137) 06-05 13:23:52.309: E/WindowManager(8790): 在 android.app.ActivityThread.main(ActivityThread.java:4794) 06-05 13:23:52.309: E/WindowManager(8790): 在 java.lang.reflect.Method.invokeNative(Native Method) 06-05 13:23:52.309: E/WindowManager(8790): 在 java.lang.reflect.Method.invoke(Method.java:511) 06-05 13:23:52.309: E/WindowManager(8790): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 06-05 13:23:52.309: E/WindowManager(8790): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 06-05 13:23:52.309: E/WindowManager(8790): at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android json gridview


    【解决方案1】:

    回到原来的代码,它设置了一个带有空联系人列表的网格适配器。那应该摆脱空指针异常。在您的 GridViewAdapter.java 和以下代码中添加一个名为 callNotifyDataChanged 的​​方法。

    public void callNotifyDataChanged() {
        notifyDataSetChanged();
    }
    

    在GetContacts.onPostExecute方法中,重新设置适配器后调用。

    @Override
    protected void onPostExecute(final ArrayList<HashMap<String, String>> result) {
        super.onPostExecute(result);
    ....
    ....
    
    
    
    customGridAdapter.callNotifyDataChanged() ;
    

    理想情况下,您不必重新创建适配器并重新设置它。您应该只更改适配器中的数据并重用相同的适配器。但首先,试试我的建议,看看它是否有效。

    祝你好运

    【讨论】:

    • 有一点。看起来您在解析时实际上得到了 JSONException。如果在解析和准备联系人列表时出现问题,此代码将无济于事。您可能想在 json 解析代码中放置一个断点并找出到底发生了什么。
    • 06-05 13:53:41.901: E/Trace(20080): 打开跟踪文件时出错:没有这样的文件或目录 (2) 06-05 13:54:31.641: E/Trace( 20627):打开跟踪文件时出错:没有这样的文件或目录(2)在调试后不显示..在LogCat中显示此错误..@Raghu
    • 我在结果中得到了正确的响应。{所有用户)
    • 但是您可以清楚地看到您的日志中的错误。 “解析数据 org.json.JSONException 时出错:字符 0 处的输入结束”。做一件事。您已经在打印从服务器获取的内容。为什么不在循环遍历 JSONArray 时打印每个 JSONObject。在 for (int i = 0; i
    • 你可以发布你的解释吗?其实我是新人,我很困惑......所以plzzzz
    【解决方案2】:

    删除

    customGridAdapter = new GridViewAdapter(this, R.layout.row_grid, contactList);
    gridView.setAdapter(customGridAdapter);
    

    来自onCreate(Bundle savedInstanceState) {。和

    gridView = (GridView) findViewById(R.id.gridView);
    

    来自onPostExecute(..) 除了在之前初始化gridView = (GridView) findViewById(R.id.gridView);

    new GetContacts().execute();
    

    【讨论】:

    • 感谢您的回复,但在删除此应用程序后停止..给我错误..由空指针引起
    • 空指针异常的原因是因为你现在给gridview设置了一个空网格适配器。我认为您最初的问题是您没有使用 notifyDataSetChanged 让视图知道有新数据。在gridview中设置好适配器后,调用notifyDataSetChanged。
    • @user3709878...执行此操作后无法正常工作..出现很多错误如何在评论中显示 Logcat?
    • @Raghu Bro 你能解释一下并提供代码吗
    • @user3384985 . 这样做后不工作.. 给出很多错误如何在评论中显示 Logcat ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多