Ich habe diese Übung viel zu lange festgefahren.Erstellen eines benutzerdefinierten ArrayAdapter und Füllen einer ListView mit einem angeforderten Json mit Volley
Ich habe einen Teil des Codes gegeben und ich musste den Rest davon schreiben.
Zuerst bekam ich eine VolleyManager-Klasse, die mit einigen Volley-Werkzeugen hilft (wie Hinzufügen zur Anforderungswarteschlange). Dann eine andere Gson-Klasse, die beim Parsen des angeforderten JSON hilft.
Dies ist der Code für die UserListFragment, wo zwei Schaltflächen vorhanden sind. Eine zum Auffüllen der Liste, eine zum Löschen der Liste und die Liste selbst unter diesen beiden Schaltflächen.
public class UserListFragment extends Fragment {
private static final String USERS_URL = "https://raw.githubusercontent.com/bengui/volleytest/master/json/users.json";
private static final String TAG = UserListFragment.class.getSimpleName();
private View view;
private ListAdapter listAdapter;
private Button requestButton;
private Button cleanButton;
private ListView listView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_user_list, null);
// UI Elements
requestButton = (Button) view.findViewById(R.id.request_btn);
listView = (ListView) view.findViewById(R.id.listview_users);
requestButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listAdapter = new ListAdapter(view.getContext());
listView.setAdapter(listAdapter);
}
});
cleanButton = (Button) view.findViewById(R.id.clean_btn);
cleanButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listView.setAdapter(null);
}
});
return view;
}
Dies ist der personalisierte Adapter, den ich gemacht habe, um die Elemente auf der Liste zu füllen.
public class ListAdapter extends ArrayAdapter {
VolleyManager volleyManager;
List<User> list;
public ListAdapter(Context context){
super(context,0);
volleyManager = VolleyManager.getInstance(getActivity());
requestButton.setEnabled(false);
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(
USERS_URL,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
list = parseUserList(response.toString());
requestButton.setEnabled(true);
notifyDataSetChanged();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error){
Log.d(TAG, "JSON response error : " + error.getMessage());
requestButton.setEnabled(true);
}
}
);
volleyManager.addToRequestQueue(jsonArrayRequest);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View listItemView = convertView;
if (null == convertView) {
listItemView = layoutInflater.inflate(
R.layout.fragment_list_item,
parent,
false);
}
// Pick an element of the list and fill the UI textViews.
User user = list.get(position);
TextView nombre = (TextView) listItemView.findViewById(R.id.user_name);
TextView apellido = (TextView) listItemView.findViewById(R.id.user_last_name);
TextView edad = (TextView) listItemView.findViewById(R.id.user_age);
// Update views
nombre.setText(user.getName());
apellido.setText(user.getLastName());
edad.setText(user.getAge());
return listItemView;
}
}
/**
* Parses a users json array into a users list.
*
* @param jsonArray
*
* @return Users list
*/
private List<User> parseUserList(String jsonArray) {
Gson gson = new Gson();
// Declares the list type
Type listType = new TypeToken<List<User>>() {}.getType();
List<User> userList = gson.fromJson(jsonArray, listType);
return userList;
}
}
Ich bin mir nicht sicher, warum das nicht funktioniert. Vielleicht verstehe ich nicht vollständig, wie Adapter funktionieren, und ich mache einen falschen Anruf auf dem Button Click Listener?
Ich habe versucht, dies für über eine Woche herauszufinden. Etwas Fortschritt gemacht! aber immer noch kann es nicht funktionieren.
Jede Eingabe ist willkommen.
bearbeiten: Vergessen Sie die .xmls
Dies ist das Layout für das Fragment.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_user_list"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/request_btn"
android:text="@string/request_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/clean_btn"
android:text="@string/clean_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<ListView
android:id="@+id/listview_users"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
Dies ist das Layout für die Listview-Elemente.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/user_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/user_last_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/user_age"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
Was genau ist das Problem? Zeigt es nicht die Liste? – Dave
Ja, zeigt nichts auf dem Display an. Die Daten werden jedoch abgerufen. –
Haben Sie überprüft, dass getView aufgerufen wird, nachdem Ihre Listenvariable ausgefüllt wurde? – Dave