如何从json数组(Android)检索数据?

问题描述 投票:1回答:1

我正在尝试使用url从json获取数据。 json没有问题。This is the json url我收到空点异常错误。我想问题出在我的getData()函数上。

我尝试使用硬编码的值,效果很好。

public class search_fragment extends Fragment {
String url;
String[] salonName;
String[] salonType;
String[] city;
String[] image;

//String[] salonName ={"A salon", "B salon"};
//String[] salonType = {"Female", "Female"};
//String[] city = {"Colombo", "KAndy"};


ListView lst;

View view;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable 
ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_search, container, false);
    lst = view.findViewById(R.id.salonList);

    ListViewAdapter listViewAdapter = new ListViewAdapter(getActivity(), 
    salonName, salonType, city, image);
    lst.setAdapter(listViewAdapter);

    return view;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getData();



}

void getData(){

    RequestQueue requestQueue = Volley.newRequestQueue(getContext());
    url = "https://newswiftsalon.000webhostapp.com/Salon.php";

    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url, new 
 Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {
            int length = response.length();
            salonName = new String[length];
            salonType = new String[length];
            city = new String[length];
            image = new String[length];
            for(int i = 0; i< response.length(); i++){
                try{
                    JSONObject salons = response.getJSONObject(i);
                    salonName[i] = salons.getString("salonName");
                    salonType[i] = salons.getString("salonType");
                    city[i] = salons.getString("City");
                    image[i] = salons.getString("image");



                } catch (JSONException e){
                    e.printStackTrace();
                }
            }
            Log.d("salon Name", salonName[1]);
        }



    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
    requestQueue.add(jsonArrayRequest);
}


}

适配器类

public class ListViewAdapter extends ArrayAdapter<String> {

private String[] salonName;
private String[] salonType;
private String[] city;
private String[] image;
private Activity context;


public ListViewAdapter(Activity context , String[] salonName, String[] 
salonType, String[] city, String[] image  ){
    super(context, R.layout.salon_list, salonName);
    this.context = context;
    this.salonName = salonName;
    this.salonType = salonType;
    this.city = city;
    this.image = image;

}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull 
ViewGroup parent) {

    View r = convertView;
    ViewHolder viewHolder = null;
    if(r==null){
        LayoutInflater layoutInflater = context.getLayoutInflater();
        r=layoutInflater.inflate(R.layout.salon_list, null, true);
        viewHolder=new ViewHolder(r);
        r.setTag(viewHolder);
    }
    else {
        viewHolder =(ViewHolder) r.getTag();

    }

    viewHolder.txtType.setText(salonType[position]);
    viewHolder.txtSalonName.setText(salonName[position]);
    viewHolder.txtCity.setText(city[position]);



    return r;


}
class ViewHolder
{
    TextView txtType;
    TextView txtSalonName;
    TextView txtCity;
    ImageView imageview;

    ViewHolder(View v){
        txtCity = v.findViewById(R.id.txt_city);
        txtSalonName = v.findViewById(R.id.txt_salon_name);
        txtType = v.findViewById(R.id.txt_type);
        imageview = v.findViewById(R.id.img_salon);
    }

}
}

这是错误

E/AndroidRuntime: FATAL EXCEPTION: main
Process: lk.nibm.swiftsalon, PID: 3485
java.lang.NullPointerException
    at java.util.Objects.requireNonNull(Objects.java:203)
    at java.util.Arrays$ArrayList.<init>(Arrays.java:3738)
    at java.util.Arrays.asList(Arrays.java:3725)
    at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:168)
    at lk.nibm.swiftsalon.ListViewAdapter.<init>(ListViewAdapter.java:30)
    at lk.nibm.swiftsalon.search_fragment.onCreateView(search_fragment.java:48)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
    at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
    at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
    at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
    at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
    at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
android android-json
1个回答
1
投票

尝试一下:

void getData(){

RequestQueue requestQueue = Volley.newRequestQueue(getContext());
url = "https://newswiftsalon.000webhostapp.com/Salon.php";

JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url, new 
 Response.Listener<JSONArray>() {
    @Override
    public void onResponse(JSONArray response) {
        int length = response.length();
        salonName = new String[length];
        salonType = new String[length];
        city = new String[length];
        image = new String[length];
        for(int i = 0; i< response.length(); i++){
            try{
                JSONObject salons = response.getJSONObject(i);
                salonName[i] = salons.getString("salonName");
                salonType[i] = salons.getString("salonType");
                city[i] = salons.getString("City");
                image[i] = salons.getString("image");



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

        Log.d("salon Name", salonName[1]);
        ListViewAdapter listViewAdapter = new ListViewAdapter(getActivity(), 
        salonName, salonType, city, image);
        lst.setAdapter(listViewAdapter);
    }



}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {

    }
});
requestQueue.add(jsonArrayRequest);
}

从onCreate中删除getData()方法调用,然后将其放入onCreateView中,如下所示:

lst = view.findViewById(R.id.salonList);
getData();
© www.soinside.com 2019 - 2024. All rights reserved.