Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何让JSONArray填充到ListActivity';s列表视图_Android_Listview - Fatal编程技术网

Android 如何让JSONArray填充到ListActivity';s列表视图

Android 如何让JSONArray填充到ListActivity';s列表视图,android,listview,Android,Listview,这是一个我无法找到好的解决方案的答案的帖子。我找了不少,找不到像样的东西。我不知道我使用的方法是否是最好的方法,但它是有效的,我觉得这是一个相当干净的解决方案 我们将在这里做一些假设 您知道什么是JSONArray,并且已经以某种方式用一些数据填充了JSONArray 这是填充到JSONArray中的JSON代码 您已经创建了一个包含ListView元素的ListActivity,并且已经创建了一个布局。如果您需要更多关于如何做到这一点的信息,您可以参考 好吧,这才是真正的魔力所在 pu

这是一个我无法找到好的解决方案的答案的帖子。我找了不少,找不到像样的东西。我不知道我使用的方法是否是最好的方法,但它是有效的,我觉得这是一个相当干净的解决方案

我们将在这里做一些假设

  • 您知道什么是JSONArray,并且已经以某种方式用一些数据填充了JSONArray
  • 这是填充到JSONArray中的JSON代码

  • 您已经创建了一个包含ListView元素的ListActivity,并且已经创建了一个布局。如果您需要更多关于如何做到这一点的信息,您可以参考
  • 好吧,这才是真正的魔力所在

        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Pretty much ignore this .. it won't have anything to do with the example.
        // Your setContentView should be your layout with your list element.
        setContentView(R.layout.server_selection);
    
        //psuedo code 
        //JArrayServers = JSONArray that has my data in it.
    
        //Create a blank ( for lack of better term ) ArrayAdapter
        ArrayAdapter<String> servers = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1);
    
        //Loop though my JSONArray
        for(Integer i=0; i< jArrayServers.length(); i++){
            try{
                //Get My JSONObject and grab the String Value that I want.
                String obj = jArrayServers.getJSONObject(i).getString("NAME");
    
                //Add the string to the list
                servers.add(obj);
            }catch(JSONException e){
    
            }
        }
        //Add my Adapter via the setListAdapter function.
        setListAdapter(servers);
    
        //Display the listView
        ListView lv = getListView();
        lv.setTextFilterEnabled(true);
    }
    
    public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    //请忽略这一点,这与示例没有任何关系。
    //setContentView应该是包含列表元素的布局。
    setContentView(R.layout.server_选择);
    //伪代码
    //JArrayServers=JSONArray,其中包含我的数据。
    //创建一个空白(缺少更好的术语)ArrayAdapter
    ArrayAdapter服务器=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1);
    //循环通过我的JSONArray
    对于(整数i=0;i
    我正在创建一个空白的ArrayAdapter。然后,我在数组中循环获取字符串,并在移动时将其插入适配器。最后,在循环结束时,我将通过setListAdapter()函数插入适配器


    我认为这很简单,但是需要大量的研究,从一个新手那里得出这个结论。我相信你们所有的专家都会有更好的方法。如果有,请把它贴在容易找到的地方

    另一种方法是创建自己的适配器类,扩展
    BaseAdapter
    。例如,如果每个
    列表视图
    行需要多条数据,这将非常有用。

    实现这一点的最佳方法实际上是滚动扩展BaseAdapter的自定义适配器。我为这个问题挣扎了一天,试图避免对JSONArray进行无意义的迭代,只是为了填充数组并在“正常”的ArrayAdapter中使用它。我的情况与您的情况非常相似,只是我希望填充一个微调器,而不是一个ListView。尽管如此,我还是会发布我找到的解决方案,因为它可能会对你或其他人有所帮助

    在活动课上:

    public void initSpinner(JSONArray jsonArray)
    {
         Spinner spinner = new Spinner(this);
         JSONArrayAdapter jsonArrayAdapter = new JSONArrayAdapter(this, countries, "Name");
         spinner.setAdapter(jsonArrayAdapter);
    }
    
    注意:我传递给适配器的字符串“name”有一个参数,它只是我希望在json数据中查找的键,在您的情况下,它可能是您要查找的任何键

    接下来,您需要滚动自己的微调器列表项,并将其包装在RelativeLayout中。我在一个名为spinner_item.xml的文件中这样做:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="5dip" >
    
    <TextView
        android:id="@+id/spinnerListItemName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:textColor="#000000"
        android:textSize="16dip" />
    
    <RadioButton
        android:id="@+id/spinnerRadioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        android:paddingRight="6dip"
        android:focusable="false"
        android:clickable="false" />
    
    <TextView
        android:id="@+id/spinnerListItemID"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible" />
    
    </RelativeLayout>
    
    }


    你有它,对我来说很有魅力,我知道在网上找到关于这个主题的信息是多么痛苦:)

    同意,你能举个例子吗。。问题更多的是,网上关于如何做这件事的信息很少,这就是我发布这篇文章的原因。如果您能花几分钟时间发布一个示例,我相信所有的观众都希望看到如何最好地实现它。
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="5dip" >
    
    <TextView
        android:id="@+id/spinnerListItemName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:textColor="#000000"
        android:textSize="16dip" />
    
    <RadioButton
        android:id="@+id/spinnerRadioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        android:paddingRight="6dip"
        android:focusable="false"
        android:clickable="false" />
    
    <TextView
        android:id="@+id/spinnerListItemID"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible" />
    
    </RelativeLayout>
    
    public class JSONArrayAdapter extends BaseAdapter implements OnTouchListener
    {
    
    private ViewGroup group;
    private JSONArray items;
    private String key;
    private Context context;
    private String selectedItemID;
    private int selectedItemPosition;
    
    public JSONArrayAdapter(Context ctx, JSONArray array, String k)
    {
        super();
        this.items = array;
        this.context = ctx;
        this.key = k;
        this.selectedItemPosition = -1;
    }
    
    public int getCount()
    {
        return items.length();
    }
    
    public Object getItem(int position)
    {
        return position;
    }
    
    public long getItemId(int position)
    {
        return position;
    }
    
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View view = convertView;
        group = parent;
    
        if (view == null)
        {
            LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = vi.inflate(R.layout.spinner_item, null);
            view.setOnTouchListener(this);
        }
    
        String itemText = null;
        String itemID = null;
    
        try
        {
            JSONObject jsonObject = items.getJSONObject(position);
            itemText = jsonObject.getString(key);
            itemID = jsonObject.getString("ID");
        }
        catch (JSONException e)
        {
    
        }
    
        if (itemText != null)
        {
            TextView name = (TextView) view.findViewById(R.id.spinnerListItemName);
            TextView id = (TextView) view.findViewById(R.id.spinnerListItemID);
            RadioButton button = (RadioButton) view.findViewById(R.id.spinnerRadioButton);
    
            if (name != null)
                name.setText(itemText);
    
            if (id != null)
            {
                id.setText(itemID);
                id.setHint(position + "");
            }
    
            if (id.getText().toString().equals(selectedItemID))
            {
                button.setSelected(true);
                button.setChecked(true);
            }
            else
            {
                button.setSelected(false);
                button.setChecked(false);
            }
        }
    
        if (selectedItemPosition == -1 && position == 0)
            this.setFirstChosen(view);
    
        return view;
    }
    
    private void setFirstChosen(View view)
    {
        RadioButton button = (RadioButton) view.findViewById(R.id.spinnerRadioButton);
        button.setSelected(true);
        button.setChecked(true);
    
        selectedItemID = ((TextView) view.findViewById(R.id.spinnerListItemID)).getText().toString();
        selectedItemPosition = Integer.parseInt(((TextView) view.findViewById(R.id.spinnerListItemID)).getHint().toString());
    }
    
    public boolean onTouch(View v, MotionEvent event)
    {
        RadioButton button = (RadioButton) v.findViewById(R.id.spinnerRadioButton);
    
        if (selectedItemPosition != -1)
        {
            View previousView = group.getChildAt(selectedItemPosition);
            if (previousView != null)
            {
                RadioButton previous = (RadioButton) previousView.findViewById(R.id.spinnerRadioButton);
                previous.setSelected(false);
                previous.setChecked(false);
            }
        }
    
        button.setSelected(true);
        button.setChecked(true);
        selectedItemID = ((TextView) v.findViewById(R.id.spinnerListItemID)).getText().toString();
        selectedItemPosition = Integer.parseInt(((TextView) v.findViewById(R.id.spinnerListItemID)).getHint().toString());
    
        return false;
    }