JAVA ANDROID 09 (p) - RecyclerView, CardView, Volley, Picasso

JAVA ANDROID 09 (p) - RecyclerView, CardView, Volley, Picasso
ukryj menu
SPEC
aktualizacja: 2022-05-23 09:17:23

1. pamiętamy o permission INTERNET

2. RecyclerView i CardView

w pliku build gradle (module app)

implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'androidx.cardview:cardview:1.0.0'kopiuj


potem sync

3. Recyclerview w Activity

w głównym RelativeLayout

<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>kopiuj




4. item z Cardview w pliku item.xml

w Relativelayout nowo stworzonego item.xml wstaw

<androidx.cardview.widget.CardView
    android:layout_width="match_parent"
kopiuj
    android:layout_height="match_parent" />

wewnątrz dwa pola txt i imageview


5. klasa Javy przechowująca dane o zdjęciu

poniższe punkty 5,6,7 są zrealizowane na prostym przykładzie:

public class Item {

    private String a;
    private String b;

// dodaj konstruktor i gettery do powyższych zmiennych

}kopiuj


6. RecyclerAdapter - główna część projektu

dodaj klasę RecAdapter
dziedziczącą z RecyclerView.Adapter


po utworzeniu dopisz w klasie zamiast extends RecyclerView.Adapter

extends RecyclerView.Adapter<RecAdapter.ViewHolder>kopiuj

teraz program wymaga utworzenia klasy ViewHolder, wykonaj taką, klasa tworzy się na końcu klasy adaptera

potem generate implement methods:

onCreateViewHolder
onBindViewHolder
getItemCountkopiuj


do klasy adaptera dodaj konstruktor przyjmujący listę (ArrayList) renderowanych elementów

private List<Item> list;
    
public RecAdapter(List<Item> list) {
   this.list = list;
}kopiuj


do klasy ViewHolder dodaj konstruktor (alt enter)

w klasie ViewHolder pola txt na wyświetlane dane z ArrayList

private TextView aTxt;
private TextView bTxt;kopiuj


potem w konstruktorze klasy ViewHolderkopiuj

aTxt = itemView.findViewById(R.id.aTxt);
bTxt = itemView.findViewById(R.id.bTxt);kopiuj


w metodzie onCreateViewHolder klasy adaptera pobieramy layout z item.xml

View v = LayoutInflater.from(parent.getContext())
      .inflate(R.layout.item, parent, false);
return new ViewHolder(v);kopiuj


w metodzie onBindViewHolder klasy adaptera dobieramy się do pól txt, tutaj też później ustawimy obrazki z sieci

Item listItem = list.get(position);kopiuj

     
holder.aTxt.setText(listItem.getA());
holder.bTxt.setText(listItem.getB()); kopiuj
 

w metodzie getItemCount klasy adaptera

return list.size(); kopiuj

7. testowanie działania w Activity

w klasie

private ArrayList<Item> list = new ArrayList<>();
private RecyclerView recyclerView;
private RecAdapter adapter;
private RecyclerView.LayoutManager layoutManager;kopiuj


w onCreate

recyclerView = findViewById(R.id.recyclerView);kopiuj

list.add(new Item("a", "d"));
list.add(new Item("b", "e"));
list.add(new Item("c", "f"));kopiuj


potem

layoutManager = new LinearLayoutManager(MainActivity.this);
recyclerView.setLayoutManager(layoutManager);kopiuj

  
i
  
adapter = new RecAdapter(list);
recyclerView.setAdapter(adapter);
kopiuj

UWAGA: Na tym etapie RecyclerView powinien wyświetlać testowe dane w dwu polach txt


8. Volley - biblioteka do JSON-a

zmiany w gradle (module app) jak poprzednio

implementation 'com.android.volley:volley:1.2.1'


9. dane json

url jsona pobierz z użyciem swojej aplikacji webowej

oczekiwany format danych:

[
   {"name":"1652624957293.png","url":"/files/1652624957293.png","creationTime":1653059788877,"size":51981},
   {"name":"1652625148074.png","url":"/files/1652625148074.png","creationTime":1653059788928,"size":51981},
   {"name":"1652625262640.png","url":"/files/1652625262640.png","creationTime":1653059788952,"size":51981}
]kopiuj




request do serwera z uzyciem Volleya jak poprzednio

       
JsonArrayRequest jsonRequest = new JsonArrayRequest(
                Request.Method.GET,
                "url",
                null,
                response -> {
                    Log.d("xxx", "response: " + response)

                    for (int i = 0; i < response.length(); i++) {

                        JSONObject responseObj = response.getJSONObject(i);

                        Item listItem = new Item(
                                "czas zapisu: " + obj.getString("url"),
                                "wielkość zdjęcia: " + obj.getString("size")

                        );
                        list.add(listItem);

                    }

                    recyclerAdapter = new RecAdapter(list, context);
                    recyclerView.setAdapter(recyclerAdapter);


                },
                error -> {

                    Log.d("xxx", "error" + error.getMessage());
                }
);
kopiuj



10. Picasso - biblioteka do ładowania zdjęć


zmiany w gradle (module app) jak poprzednio

implementation 'com.squareup.picasso:picasso:2.71828'kopiuj

gdzie przeczytać zdjęcia z sieci?

w adapterze w metodzie onBindViewHolder, po polach tekstowych

Picasso
   .get()
   .load("adres http dowolnego image")
   .into(holder.imageView);kopiuj