【问题标题】:Android Spinner not populating with JSON data Volley ResponseAndroid Spinner 未填充 JSON 数据 Volley 响应
【发布时间】:2016-12-16 10:47:52
【问题描述】:

我正在使用 Multi Spinner 和 Android Volley 库来处理我的应用程序的网络请求,问题是我的微调器没有填充响应,即使我从服务器获取响应,响应也没有从响应中填充凌空向旋转器,请帮助... 我的代码在下面

   StringRequest stringRequest = new StringRequest(Request.Method.GET, IP.IP+"/api/users/view_group", new com.android.volley.Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                //Toast.makeText(Room_Config.this, response, Toast.LENGTH_SHORT).show();
              String   text=response;
                System.out.println(response);

                try {
                    JSONObject obj = new JSONObject(response);
                    String strMessage = (String) obj.get("message");
                    JSONArray jarray = new JSONArray(strMessage);
                    for (int i = 0; i < jarray.length(); i++) {
                        JSONObject obj1 = jarray.getJSONObject(i);
                        //id= (int) obj1.get("group_id");
                        list1.add((int) obj1.get("group_id"));
                        list.add((String) obj1.get("group_name"));
                        map.put((String) obj1.get("group_name"), (Integer) obj1.get("group_id"));}

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


            }
        }, new com.android.volley.Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                if (error instanceof TimeoutError) {
                    Toast.makeText(Room_Config.this,"Request Time-Out", Toast.LENGTH_SHORT).show();
                } else if (error instanceof NoConnectionError) {
                    Toast.makeText(Room_Config.this,"No Connection Found", Toast.LENGTH_SHORT).show();
                } else if (error instanceof ServerError) {
                    Toast.makeText(Room_Config.this,"Server Error", Toast.LENGTH_SHORT).show();
                } else if (error instanceof NetworkError) {
                    Toast.makeText(Room_Config.this,"Network Error", Toast.LENGTH_SHORT).show();
                } else if (error instanceof ParseError) {
                    Toast.makeText(Room_Config.this,"Parse Error", Toast.LENGTH_SHORT).show();
                }
            }
        });
        stringRequest.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 1,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        queue.add(stringRequest);

 System.out.println("Group Name List is" + list);
        System.out.println("\nGroup id  list is---> " + list1);
        et1 = (EditText) findViewById(R.id.et1);
        et2 = (EditText) findViewById(R.id.et2);
        et3 = (EditText) findViewById(R.id.et3);

        et1.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                if (s.toString().length()<3) {
                    if (!validateNo()) {
                        return;
                    }
                }else {
                    inputLayoutNo.setErrorEnabled(false);
                }
            }
        });

et2.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        if (!validateName()) {
            return;
        }
    }
});

et3.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        if (!validateDesc()) {
            return;
        }
    }
});

if (list.isEmpty()){ Toast.makeText(Room_Config.this,"Request Time-Out", Toast.LENGTH_SHORT).show();}


       // TreeMap<String, Boolean> items = new TreeMap<>();
        HashMap<String,Boolean> items=new HashMap<>();
        for (String item : list) {
            items.put(item, Boolean.FALSE);
        }
        MultiSpinner simpleSpinner = (MultiSpinner) findViewById(R.id.room_spinner);
        simpleSpinner.setItems(items, new MultiSpinner.MultiSpinnerListener() {

            @Override
            public void onItemsSelected(boolean[] selected) {
                mylist.clear();
                nlist.clear();
                // your operation with code...
                for (int i = 0; i < selected.length; i++) {
                    if (selected[i]) {
                        Log.i("TAG", i + " : " + list.get(i));
                        System.out.println("Selected Item is----->" + list.get(i));
                        mylist.add(list.get(i));
                        System.out.println("My List is\t" + mylist);

                    }


                }
                for (int j = 0; j < mylist.size(); j++) {
                    objh = map.get(mylist.get(j));
                    myIntArray = map.get(mylist.get(j));
                    nlist.add(myIntArray);
                    System.out.println("New Id List is-------->" + nlist);
                }


            }

        });

请帮忙.....

这是我使用的 Multispinner 类

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.util.AttributeSet;
import android.widget.ArrayAdapter;

import com.rey.material.widget.Spinner;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.TreeMap;

public class MultiSpinner extends Spinner implements OnMultiChoiceClickListener, OnCancelListener {

    private List<String> items;
    private boolean[] selected;
    private String defaultText = "Click to Select Group";
    private MultiSpinnerListener listener;

    public MultiSpinner(Context context) {
        super(context);
    }

    public MultiSpinner(Context arg0, AttributeSet arg1) {
        super(arg0, arg1);
    }

    public MultiSpinner(Context arg0, AttributeSet arg1, int arg2) {
        super(arg0, arg1, arg2);
    }

    @Override
    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
        selected[which] = isChecked;
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        // refresh text on spinner
        StringBuilder spinnerBuffer = new StringBuilder();
        for (int i = 0; i < items.size(); i++) {
            if (selected[i]) {
                spinnerBuffer.append(items.get(i));
                spinnerBuffer.append(", ");
            }
        }

        String spinnerText = "";
        spinnerText = spinnerBuffer.toString();
        if (spinnerText.length() > 2) {
            spinnerText = spinnerText.substring(0, spinnerText.length() - 2);
        } else {
            spinnerText = defaultText;
        }

        ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(),
                R.layout.textview_for_spinner,
                new String[]{spinnerText});
        setAdapter(adapter);
        if (selected.length > 0) {
            listener.onItemsSelected(selected);
        }

    }

    @Override
    public boolean performClick() {
        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
        builder.setTitle(defaultText);
        builder.setMultiChoiceItems(
                items.toArray(new CharSequence[items.size()]), selected, this);
        builder.setPositiveButton(android.R.string.ok,
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
        builder.setOnCancelListener(this);
        builder.show();
        return true;
    }

    /**
     * Sets items to this spinner.
     *  @param items    A HashMap where the keys are the values to display in the spinner
     *                 and the value the initial selected state of the key.
     * @param listener A MultiSpinnerListener.
     */
    public void setItems(HashMap<String, Boolean> items,
                         MultiSpinnerListener listener) {
        this.items = new ArrayList<>(items.keySet());
        this.listener = listener;

        List<Boolean> values = new ArrayList<>(items.values());
        selected = new boolean[values.size()];
        for (int i = 0; i < items.size(); i++) {
            selected[i] = values.get(i);
        }

        // all text on the spinner
        ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(),
                R.layout.textview_for_spinner, new String[]{defaultText});
        setAdapter(adapter);

        // Set Spinner Text
        onCancel(null);
    }

    public interface MultiSpinnerListener {
        void onItemsSelected(boolean[] selected);
    }


}

【问题讨论】:

  • 对应的php文件长什么样子?
  • @ChrisGong 我没有使用 php,只是使用 java
  • Adapter 传递给simpleSpinner
  • 在 Spinner 适配器上调用 notifyChange 方法

标签: java android json android-volley


【解决方案1】:

This libray中所述

// create spinner list elements
    ArrayAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
    adapter.add("Item1");
    adapter.add("Item2");
    adapter.add("Item3");
    adapter.add("Item4");
    adapter.add("Item5");

    // get spinner and set adapter
    spinner = (MultiSpinner) findViewById(R.id.spinnerMulti);
    spinner.setAdapter(adapter, false, onSelectedListener);

【讨论】:

    【解决方案2】:

    使用此代码解决您的问题

    StringRequest stringRequest = new StringRequest(Request.Method.GET, IP.IP+"/api/users/view_group", new com.android.volley.Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    //Toast.makeText(Room_Config.this, response, Toast.LENGTH_SHORT).show();
                  String   text=response;
                    System.out.println(response);
    
                    try {
                        JSONObject obj = new JSONObject(response);
                        String strMessage = (String) obj.get("message");
                        JSONArray jarray = new JSONArray(strMessage);
                        for (int i = 0; i < jarray.length(); i++) {
                            JSONObject obj1 = jarray.getJSONObject(i);
                            //id= (int) obj1.get("group_id");
                            list1.add((int) obj1.get("group_id"));
                            list.add((String) obj1.get("group_name"));
                            map.put((String) obj1.get("group_name"), (Integer) obj1.get("group_id"));}
    //call this method with your new data eg map
    setSpinnerData(map);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
    
    
                }
            }, new com.android.volley.Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    if (error instanceof TimeoutError) {
                        Toast.makeText(Room_Config.this,"Request Time-Out", Toast.LENGTH_SHORT).show();
                    } else if (error instanceof NoConnectionError) {
                        Toast.makeText(Room_Config.this,"No Connection Found", Toast.LENGTH_SHORT).show();
                    } else if (error instanceof ServerError) {
                        Toast.makeText(Room_Config.this,"Server Error", Toast.LENGTH_SHORT).show();
                    } else if (error instanceof NetworkError) {
                        Toast.makeText(Room_Config.this,"Network Error", Toast.LENGTH_SHORT).show();
                    } else if (error instanceof ParseError) {
                        Toast.makeText(Room_Config.this,"Parse Error", Toast.LENGTH_SHORT).show();
                    }
                }
            });
            stringRequest.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 1,
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
            queue.add(stringRequest);
    
     System.out.println("Group Name List is" + list);
            System.out.println("\nGroup id  list is---> " + list1);
            et1 = (EditText) findViewById(R.id.et1);
            et2 = (EditText) findViewById(R.id.et2);
            et3 = (EditText) findViewById(R.id.et3);
    
            et1.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
    
                }
    
                @Override
                public void afterTextChanged(Editable s) {
                    if (s.toString().length()<3) {
                        if (!validateNo()) {
                            return;
                        }
                    }else {
                        inputLayoutNo.setErrorEnabled(false);
                    }
                }
            });
    
    et2.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
        }
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
    
        }
    
        @Override
        public void afterTextChanged(Editable s) {
            if (!validateName()) {
                return;
            }
        }
    });
    
    et3.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
        }
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
    
        }
    
        @Override
        public void afterTextChanged(Editable s) {
            if (!validateDesc()) {
                return;
            }
        }
    });
    
    if (list.isEmpty()){ Toast.makeText(Room_Config.this,"Request Time-Out", Toast.LENGTH_SHORT).show();}
    
    
           // TreeMap<String, Boolean> items = new TreeMap<>();
            HashMap<String,Boolean> items=new HashMap<>();
            for (String item : list) {
                items.put(item, Boolean.FALSE);
            }
            MultiSpinner simpleSpinner = (MultiSpinner) findViewById(R.id.room_spinner);
            setSpinnerData(items);
    

    新方法

    public void setSpinnerData(TreeMap<String, Boolean> items){
    simpleSpinner.setItems(items, new MultiSpinner.MultiSpinnerListener() {
    
                @Override
                public void onItemsSelected(boolean[] selected) {
                    mylist.clear();
                    nlist.clear();
                    // your operation with code...
                    for (int i = 0; i < selected.length; i++) {
                        if (selected[i]) {
                            Log.i("TAG", i + " : " + list.get(i));
                            System.out.println("Selected Item is----->" + list.get(i));
                            mylist.add(list.get(i));
                            System.out.println("My List is\t" + mylist);
    
                        }
    
    
                    }
                    for (int j = 0; j < mylist.size(); j++) {
                        objh = map.get(mylist.get(j));
                        myIntArray = map.get(mylist.get(j));
                        nlist.add(myIntArray);
                        System.out.println("New Id List is-------->" + nlist);
                    }
    
    
                }
    
            });}
    

    【讨论】:

    • 我需要自己使用HashMap..可以吗..?
    • 是的,您可以,获取所有键或 map.values().size() 以返回适配器中的大小。如果您需要进一步的帮助,请告诉我
    • 为什么要退货。?除了将映射更改为哈希映射之外,代码中应该有哪些更改..?
    • 或者您可能需要扩展 MultiSpinner 以覆盖 setItems(Map, MultiSpinner.MultiSpinnerListener) 方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多