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
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ówtworzymy 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ówlist.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.