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" />

view raw
activity_main.xml
hosted with ❤ by GitHub

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>

view raw
route_list_item.xml
hosted with ❤ by GitHub

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());
}
}
}

view raw
MainActivity.java
hosted with ❤ by GitHub

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());
}
}
}

view raw
RoutesAdapter.java
hosted with ❤ by GitHub

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 {
()
}
}

view raw
RoutesAdapter.java
hosted with ❤ by GitHub

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

%d bloggers like this: