gpt4 book ai didi

java - 使用 radioButtons 更新 ListView 适配器输入

转载 作者:行者123 更新时间:2023-12-02 10:56:45 25 4
gpt4 key购买 nike

我的应用程序从服务器获取数据并将其显示在 ListView 中。我正在对数据进行排序,并且也想显示它们,所以我想使用 radioButtons 来更改 View 。对于每个按钮,都应将另一个内容加载到适配器显示的列表中。问题是没有 View 出现,不幸的是我的屏幕保持空白。如何正确加载它们并更改 onClick 的输入? (在本例中,我想使用单选按钮显示 contactList 和 contactListTwo)

这是我到目前为止的代码。我谈到的部分在底部:

public class CallsFragment extends Fragment{

private String TAG = MainActivity.class.getSimpleName();
private ListView lv;
private static String url = "xx";
int a = 1;
String title;
private BaseAdapter mContactsAdapter;
private RadioGroup rg;
RadioButton rb1;
RadioButton rb2;
RadioButton rb3;
private final List<HashMap<String, String>> mContactsListItems = new ArrayList<>();

ArrayList<HashMap<String, String>> contactList;
ArrayList<HashMap<String, String>> contactListTwo;

private static final int rb1id = 2;
private static final int rb2id = 1;
private static final int rb3id = 0;

public CallsFragment() {
// Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_calls, container, false);

contactList = new ArrayList<>();
contactListTwo = new ArrayList<>();

rg = (RadioGroup) view.findViewById(R.id.RGroup);
rb1 = (RadioButton) view.findViewById(R.id.radioButton5);
rb2 = (RadioButton) view.findViewById(R.id.radioButton4);
rb3 = (RadioButton) view.findViewById(R.id.radioButton6);

rb1.setId(rb1id);
rb2.setId(rb2id);
rb3.setId(rb3id);

((ListView) view.findViewById(R.id.list))
.setAdapter(mContactsAdapter);

return view;
}


private class GetContacts extends AsyncTask<Void, Void, Void> {

@Override
protected void onPreExecute () {
super.onPreExecute();
}

@Override
protected Void doInBackground (Void...arg0){
HttpHandler sh = new HttpHandler();

//request to url and getting response
String jsonStr = sh.makeServiceCall("https://creativecommons.tankerkoenig.de/json/list.php?lat=" + lat + "&lng=" + lon + "&rad=" + umkreis + "&sort=price&type="+ type +"&apikey=21f2ed18-88b1-5d26-34f3-28318713eaf4");

Log.e(TAG, "Response from url: " + jsonStr);

if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);

// Getting JSON Array node
JSONArray contacts = jsonObj.getJSONArray("stations");

// looping through All Contacts
for (int i = 0; i < contacts.length(); i++) {

JSONObject c = contacts.getJSONObject(i);

String id = c.getString("id");
String price = c.getString("price");

//tmp hash map for single contact
HashMap<String, String> contact = new HashMap<>();

// adding each child node to HashMap key => value
contact.put("id",id);
contact.put("price", price);

//adding contact to contact list
contactList.add(contact);
}

}

} catch (final JSONException e) {
Log.e(TAG, "Json parsing error: " + e.getMessage());
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
} else {
Log.e(TAG, "Couldn't get json from server.");
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {

}
});
}

return null;
}

@Override
protected void onPostExecute (Void result){
super.onPostExecute(result);
/**
* Updating parsed JSON data into ListView
* */
mContactsAdapter = new SimpleAdapter(
getActivity(), mContactListItems,
R.layout.list_item, new String[]{"price", "brand",
"dist", "street", "houseNumber", "postcode", "place"}, new int[]{R.id.stoff,
R.id.brand, R.id.dist, R.id.street, R.id.houseNumber, R.id.postCode, R.id.place});

mContactListItems.addAll(contactListTwo);
mContactsAdapter.notifyDataSetChanged();

rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
mContactsListItems.clear();

switch (checkedId) {
case R.id.radioButton4:
mContactsListItems.addAll(contactList);
break;
case R.id.radioButton5:
mContactsListItems.addAll(contactListTwo);
break;
}
//mark as changed, update list
mContactsAdapter.notifyDataSetChanged();

}
});

}
}

最佳答案

您正在将一个列表对象传递给适配器 (contactListTwo),但在检查的更改监听器 (mContactsListItems) 中更新另一个列表对象。这意味着您的更改对您的适配器完全不可见。

要修复此问题,请更改传递给适配器构造函数的列表引用:

new SimpleAdapter(..., mContactsListItems, ...);

我注意到您从未将初始项目设置到此列表中,因此您可能还需要调用例如首次创建适配器之前,mContactsListItems.addAll(contactListTwo)。这仅取决于您是否希望在用户更改单选按钮之前列表为空。

编辑

还有第二个问题:将适配器分配给 ListView 的方式。在您的 onCreate() 中,我看到这一行:

((ListView) view.findViewById(R.id.list))
.setAdapter(mContactsAdapter);

在此代码运行时,我没有看到 mContactsAdapter 的任何初始化,因此除非您省略了该代码,否则这将与编写 setAdapter 相同(空)

稍后,在onPostExecute() 中,您创建一个 适配器并将其分配给mContactsAdapter。然而,这实际上并不影响 ListView !如果重新分配适配器的变量,则需要重新设置适配器。

因此,您必须先初始化适配器,然后再在 onCreate() 中将其设置到 ListView 上(即使您尚未加载数据也可以这样做;适配器将只需为空),或者您必须在 onPostExecute() 方法中再次调用 setAdapter() 才能将此新适配器分配给您的 ListView 。

关于java - 使用 radioButtons 更新 ListView 适配器输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51673155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com