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