【问题标题】:How to get values from Internet and to a String[] array and pass it to a grid view in Android?如何从 Internet 和 String[] 数组中获取值并将其传递给 Android 中的网格视图?
【发布时间】:2014-01-12 20:03:03
【问题描述】:

我从 Internet 获取值并将数据从 GRID_DATA 数组放到网格视图中,两者都是单独工作的,而且工作正常。我将两者结合在一起,其中来自 JSONObject 的数据将向 JSON 数组添加值,因此 GRID_DATA 将获得 GRID 视图所需的字符串。但我得到了一些错误。

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Fragment;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;


public class QGFragment extends Fragment {

    GridView grdView;
     // This Data show in grid ( Used by adapter )
    String strurl;
    //URL to get JSON Array
    private static String url = "http://localhost/app/data.php";
    //JSON Node Names
    private static final String TAG_QP = "qp";

    private static final String TAG_NAME = "name";
    //private static final String TAG_VAL = "val";
    //private static final String TAG_NPICS = "nPics";
    JSONArray qp = null;

    static String[] GRID_DATA;

    public QGFragment(){}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_qg, container, false);

        grdView = (GridView)rootView.findViewById(R.id.gridview);

        new JSONParse().execute();

        // Instance of ImageAdapter Class

        grdView.setAdapter(  new GridAdapter( getActivity(), GRID_DATA ) );




        return rootView;
    }
    class GridAdapter extends BaseAdapter {

        private Context context;
        private final String[] gridValues;

        //Constructor to initialise values
        public GridAdapter(Context context, String[ ] gridValues) {

            this.context        = context;
            this.gridValues     = gridValues;
        }

        @Override
        public int getCount() {

            // Number of times getView method call depends upon gridValues.length
            return gridValues.length;
        }

        @Override
        public Object getItem(int position) {

            return null;
        }

        @Override
        public long getItemId(int position) {

            return 0;
        }


        // Number of times getView method call depends upon gridValues.length

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

            // LayoutInflator to call external grid_item.xml file

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

            View gridView;

            if (convertView == null) {

                gridView = new View(context);

                // get layout from grid_item.xml ( Defined Below )

                gridView = inflater.inflate( R.layout.grid_list , null);

                // set value into textview

                TextView textView = (TextView) gridView
                        .findViewById(R.id.icon_text);

                textView.setText(gridValues[position]);

                // set image based on selected text

                ImageView imageView = (ImageView) gridView
                        .findViewById(R.id.icon_image);


                    imageView.setImageResource(R.drawable.ic_launcher);

            } else {

               gridView = (View) convertView;
            }

            return gridView;
        }
    }
    private class JSONParse extends AsyncTask<String, String, JSONObject> {
         private ProgressDialog pDialog;
        @Override
           protected void onPreExecute() {
               super.onPreExecute();


               pDialog = new ProgressDialog(getActivity());
               pDialog.setMessage("Getting Data ...");
               pDialog.setIndeterminate(false);
               pDialog.setCancelable(true);
               pDialog.show();
        }
        @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) {
             pDialog.dismiss();
             try {


                    // Getting JSON Array
                    qp = json.getJSONArray(TAG_QP);

                    for(int i = 0 ; i < qp.length(); i++){
                        JSONObject c = qp.getJSONObject(i);

                        // Storing  JSON item in a Variable


                         String name = c.getString(TAG_NAME);
                         //String val = c.getString(TAG_VAL);
                         //String npics = c.getString(TAG_NPICS);

                         GRID_DATA[i] = name;


                        //Set JSON Data in TextView

                    };


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

         }

    } 


}

原木猫是:

12-24 20:53:06.702: W/dalvikvm(4304): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
12-24 20:53:06.743: E/AndroidRuntime(4304): FATAL EXCEPTION: main
12-24 20:53:06.743: E/AndroidRuntime(4304): java.lang.NullPointerException
12-24 20:53:06.743: E/AndroidRuntime(4304):     at com.qrodsintegrated.QGFragment$GridAdapter.getCount(QGFragment.java:74)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at android.widget.GridView.setAdapter(GridView.java:180)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at com.qrodsintegrated.QGFragment.onCreateView(QGFragment.java:51)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:795)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:998)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at android.app.BackStackRecord.run(BackStackRecord.java:622)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1330)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:417)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at android.os.Handler.handleCallback(Handler.java:605)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at android.os.Looper.loop(Looper.java:137)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at android.app.ActivityThread.main(ActivityThread.java:4340)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at java.lang.reflect.Method.invokeNative(Native Method)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at java.lang.reflect.Method.invoke(Method.java:511)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-24 20:53:06.743: E/AndroidRuntime(4304):     at dalvik.system.NativeStart.main(Native Method)
12-24 20:53:08.722: I/Process(4304): Sending signal. PID: 4304 SIG: 9

【问题讨论】:

  • localhost 是你的安卓设备。

标签: java android arrays json


【解决方案1】:

看起来GRID_DATA 从未被赋予值,因此当您尝试在QGFragment.java:74 访问它的成员(gridValues.length) 时,NullPointerException

您在GRID_DATA[i] = name; 处设置了数组中的一个项目,但实际上从未使用GRID_DATA = new String[]; 之类的东西创建数组

数组初始化

数组只是一个对象列表(在本例中为Strings)。每个对象都有一个地址,可以使用该列表中的[location] 访问。但是,如果您从一开始就没有创建该列表,那么访问该列表中不存在的 [location] 将无法正常工作。

【讨论】:

  • 什么意思? GRID_DATA[i] = 名称;那个值是正确的吗?当在片段上时,应用程序也开始没有响应
  • A NullPointerException 表示程序试图访问一个对象,但什么也没找到。
  • 表示没有为对象分配内存
  • @Ruch1234 没有。数组可以为空,但已为其分配内存。
  • 1.您应该始终检查空值。 2. 在 for 循环的右括号之后移动 onPostExecute 中的 setAdapter
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多