Odjazd – rasowy klient – #03

Przerwa międzyświąteczna sprzyja powstawaniu kodu. Udało mi się zamienić prowizorycznego klienta na takiego bardziej profesjonalnego.

 

Postanowiłam wykorzystać to, czego uczę się na szkoleniu Udacity – RecyclerView z ViewHolderem 🙂

W tym momencie mój layout activity_main.xml trochę się zmienił, bo zamiast pojedynczego textView do wyświetlenia JSON-a ma teraz RecyclerView:


<android.support.v7.widget.RecyclerView
android:id="@+id/route_list_rv"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

który to przyjął do siebie już konkretne pola, które będę wyświetlać i wygląda teraz tak:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/text_view_height"
android:layout_marginStart="@dimen/margin">
<TextView
android:id="@+id/bus_tv"
android:layout_width="@dimen/bus_column_size"
android:layout_height="match_parent" />
<TextView
android:id="@+id/leave_tv"
android:layout_width="@dimen/column_size"
android:layout_height="match_parent" />
<TextView
android:id="@+id/on_the_spot_tv"
android:layout_width="@dimen/column_size"
android:layout_height="match_parent" />
<TextView
android:id="@+id/transfer_tv"
android:layout_width="@dimen/column_size"
android:layout_height="match_parent" />
</LinearLayout>

Zasilanie adaptera danymi i podpinanie go do RecyclerView odbywa się w metodzie onPostExecute w AsyncTasku:


protected void onPostExecute(String s) {
super.onPostExecute(s);
if (s != null) {
try {
JSONArray scheduleJsonList = new JSONArray(s);
RoutesAdapter mAdapter = new RoutesAdapter(scheduleJsonList);
mRoutesList.setAdapter(mAdapter);
} catch (JSONException e) {
Log.e(TAG, e.getMessage());
}
}
}

A sam ViewHolder trzymający pola wygląda następująco:


class RouteViewHolder extends RecyclerView.ViewHolder {
TextView busTextView = null;
TextView leaveTextView = null;
TextView onTheSpotTextView = null;
TextView transferTextView = null;
RouteViewHolder(View itemView) {
super(itemView);
busTextView = itemView.findViewById(R.id.bus_tv);
leaveTextView = itemView.findViewById(R.id.leave_tv);
onTheSpotTextView = itemView.findViewById(R.id.on_the_spot_tv);
transferTextView = itemView.findViewById(R.id.transfer_tv);
}
void bind(int listIndex) {
try {
JSONObject routeObject = (JSONObject) mItems.get(listIndex);
busTextView.setText(routeObject.getJSONArray("bus").join(" | ").replaceAll("\"", ""));
leaveTextView.setText(routeObject.get("leave").toString());
onTheSpotTextView.setText(routeObject.get("on_the_spot").toString());
if (routeObject.has("transfer")) {
transferTextView.setText(routeObject.get("transfer").toString());
} else {
transferTextView.setText("");
}
} catch (JSONException e) {
Log.e(TAG, e.getMessage());
}
}
}

Ostatnim puzzlem w tej układance jest sam RecyclerView:


public class RoutesAdapter extends RecyclerView.Adapter<RoutesAdapter.RouteViewHolder> {
private static final String TAG = RoutesAdapter.class.getSimpleName();
private JSONArray mItems;
RoutesAdapter(JSONArray routes) {
mItems = routes;
}
@Override
public RouteViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
Context context = viewGroup.getContext();
int layoutIdForListItem = R.layout.route_list_item;
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(layoutIdForListItem, viewGroup, false);
return new RouteViewHolder(view);
}
@Override
public void onBindViewHolder(RouteViewHolder holder, int position) {
holder.bind(position);
}
@Override
public int getItemCount() {
return mItems.length();
}
class RouteViewHolder extends RecyclerView.ViewHolder {
(…)
}
}

W efekcie pozbyłam się smutnego JSON-a, a zyskałam przejściowo smutną tabelkę:

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

This site uses Akismet to reduce spam. Learn how your comment data is processed.