JAVA ANDROID 04 (p) - custom adapter for photos

JAVA ANDROID 04 (p) - custom adapter for photos
ukryj menu
SPEC
aktualizacja: 2022-03-24 12:28:13

Scenariusz na dziś:

- nowa ścieżka wyświetlania zdjęć: MainActivity / NewGalleriesActivity / NewGalleryActivity
- nowy ekran NewGalleryActivity z ListView, umożliwiający:

--- podgląd zdjęcia w ListView
--- usunięcie zdjęcia przyciskiem w itemie listy
--- wyświetlenie informacji o pliku zdjęcia
--- testowe przejście do ekranu edycji zdjęcia


1. Custom ArrayAdapter


przećwiczymy tworzenie testowego adaptera, dokładnie jak poniżej

a) utwórz xml dla jednego wiersza w ListView - jak na poprzednich zajęciach

b) kliknięcie w button(y),

jeśli chcemy je odróżniać od siebie wewnątrz wiersza listy - to już wymaga utworzenia własnego ArrayAdaptera, czyli klasy dziedziczącej z klasy ArrayAdapter
w jaki sposób?
prawy klawisz w mój folder java/pakiet
potem New / Java class
podajemy nazwę: TestAdapter

podajemy z czego dziedziczy (superclass): ArrayAdapter i dostajemy


public class TestAdapter extends ArrayAdapter {
}kopiuj


potem alt + enter i
Create constructor matching super;


wybieramy konstruktor z trzema parametrami:
context:Context, resource: int, objects List<T>


w klasie TestAdaptera po konstruktorze dodajemy poniższe zmienne (podkreślenia są informacją, że zmienna jest prywatna w klasie)
które ustalamy w konstruktorze, aby z nich korzystać w kolejnych funkcjach

private ArrayList<String> _list;
private Context _context;
private int _resource;kopiuj


w konstruktorze Adaptera przypisujemy zmiennym wartość

this._list= objects;
this._context = context;
this._resource = resource;kopiuj



po konstruktorze piszemy piszemy: getView
potem Ctrl + spacja i dostajemy metodę zwracającą zawartość layoutu komórki którą stworzyliśmy w xml-u


@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    return super.getView(position, convertView, parent);
}kopiuj




c) inflater - klasa konwertująca xml na kod javy


z metody getView() usuwamy return i w jej ciele wpisujemy kod, który przetwarza xml na kod javy

LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);kopiuj
convertView = inflater.inflate(_resource, null);kopiuj


w poniższy sposób szukamy dowolnych kontrolek w layoucie xml, np ImageView




ImageView iv1 = (ImageView) convertView.findViewById(R.id.iv1);
iv1.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View view) {
      Log.d("XXX","klik w obrazek");
   }
});      
return convertView;




d) kolejna funkcja custom adaptera to getCount - zwraca wielkość załadowanej listy danych

po konstruktorze adaptera piszemy piszemy: getCount i uzyskujemy

@Override
public int getCount() {
   return _list.size();
}kopiuj


e) utworzenie obiektu klasy adaptera (w Activity) i przypisanie do ListView w Activity

TestAdapter adapter = new TestAdapter (
   AnyActivity.this,
   R.layout.list_row,
   list
);
listView1.setAdapter(adapter);kopiuj


2. testowanie działania Adaptera

w Activity tworzymy arraylist ze stringami

ArrayList<String> list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");kopiuj


tworzymy adapter jak wyżej i sprawdzamy czy w ekranie renderują się trzy przykładowe wiersze a,b,c

3. realna aplikacja

a) lista plików

do naszego Adaptera, który ma służyć do wyświetlania zdjęć zrobionych kamerą,
najlepiej przekazać listę obiektó klasy File, a nie tylko Stringi z nazwami plików
tworzymy więc:

ArrayList<File> list = new ArrayList();kopiuj

do adaptera przekazujemy list zawierający pliki przeczytane z odpowiedniego katalogu
a potem operujemy wewnątrz adaptera na przekazanej liście plików


b) wyświetlenie podglądu zdjęcia wewnątrz adaptera:

trzeba ze ścieżki utworzyć obiekt Uri, czyli zasób zrozumiały dla Androida
jest tak m.in. dlatego, że różne wersje telefonów android, mogą w różnych miejscach przechowywać pliki
zadaniem klasy Uri jest ustandaryzować to wszystko


Uri uri = Uri.fromFile(new File("image path"));
iv1.setImageURI(uri);kopiuj


c) usuwanie pliku i refresh listy

czyli poinformowanie adaptera, że lista czyli jego źródło danych się zmieniło;
w tym momencie ListView powinno się odświeżyć, czyli pokazać właściwy stan listy plików

list.get(position).delete();
list.remove(position);
notifyDataSetChanged();kopiuj



d) Uwaga do tego punktu:
Nowoczesne, wydajne rozwiązanie dla tworzenia list/gridów obrazków, opiera się na dość skomplikowanych w działaniu klasach RecyclerView, CardView i customowych Adapterach.
Wykonamy je w innej części projektu.