Zmiany funkcjonalności – #18

Postanowiłam w końcu wziąć się trochę za warstwę GUI i przyjrzałam się innym aplikacjom na adroida i zauważyłam zasadniczą różnicę w usuwaniu elementów i to pójdzie na pierwszy ogień

W aplikacjach takich jak gmail czy dropbox na zwykłym widoku listy nie mamy od razu checkboxów. Pojawiają się one dopiero po tym jak przytrzymamy element listy. Zatem zrobię tak samo 😉

Na początek wyłączam widoczność checkboxa w xml-u za pomocą atrybutu visibility:

<CheckBox
android:id="@+id/checkBox"
app:layout_widthPercent="10%"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/text1"
android:visibility="gone" />

view raw
multicheck_list.xml
hosted with ❤ by GitHub

Do adaptera podpiętego pod listview dodaję zmienną:

public boolean showCheckboxes = false;

I edytuję metodę getView, żeby pokazywała checkboxy w zależności od wartości zmiennej showCheckboxes:

@NonNull
@Override
public View getView(final int position, View convertView, @NonNull final ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
convertView = inflater.inflate(layoutResourceId, parent, false);
holder = new ViewHolder();
holder.titleNameView = (TextView) convertView.findViewById(R.id.text1);
holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.titleNameView.setText(filteredData[position].getName());
if (holder.checkBox != null) {
holder.checkBox.setVisibility(showCheckboxes ? View.VISIBLE : View.GONE);
if (showCheckboxes) {
holder.checkBox.setChecked(filteredData[position].isChecked());
holder.checkBox.setOnClickListener(getOnClickListener(position, (ListView) parent));
}
holder.titleNameView.setOnClickListener(getOnClickListener(position, (ListView) parent));
}
return convertView;
}

Tej zmiennej będę zmieniać wartość przy dłuższym przytrzymaniu elementu listy:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
adapter.showCheckboxes = !adapter.showCheckboxes;
adapter.notifyDataSetChanged();
return true;
}
});

Jeszcze tylko zmiana obsługi zdarzenia onClick w zależności od tego czy klikało się na tekst czy na checkboxa:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int viewId = view.getId();
if (viewId == R.id.text1) {
Ingredient ingredient = adapter.getItem(position);
final AlertDialog.Builder builder = getAlertBuilder(view, ingredientContract, ingredient);
builder.show();
} else if (viewId == R.id.checkBox) {
adapter.getItem(position).setChecked(!adapter.getItem(position).isChecked());
adapter.notifyDataSetChanged();
deleteButton.setVisibility(adapter.isAnyItemSelected() ? View.VISIBLE : View.INVISIBLE);
}
}
});

Pozostaje jeszcze przenieść te zmiany na drugi ekran, który działa na tej samej zasadzie. Następnie zajmę się tym żeby ikonka do usuwania elementów wyświetlała się na toolbarze, ale to już materiał na kolejny wpis 🙂

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: