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

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 e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

This site uses Akismet to reduce spam. Learn how your comment data is processed.