I am creating an application that pulls data from a firebase database and presents it to the user in a custom listview. I want to make it so that in a list item, if the textview contains the word "Unavailable", the user shouldn't be unable to select that list item. How can I achieve this dynamically ?
Java Code:
@Override
public void onStart()
{
super.onStart();
Query query = FirebaseDatabase.getInstance().getReference().child("TimeSlots").orderByChild("id");
FirebaseListOptions<BookingTimes> options = new FirebaseListOptions.Builder<BookingTimes>()
.setLayout(R.layout.time_list_layout_adapter)
.setLifecycleOwner(getActivity())
.setQuery(query, BookingTimes.class)
.build();
adapter = new FirebaseListAdapter(options)
{
@Override
protected void populateView(View v, Object model, int position)
{
timeTextV = v.findViewById(R.id.timeTV);
availabilityTextv = v.findViewById(R.id.availabilityTV);
BookingTimes bookingTimes = (BookingTimes) model;
timeTextV.setText(bookingTimes.getTime());
availabilityTextv.setText(bookingTimes.getAvailability());
/*if (availabilityTextv.getText().toString().equals("Unavailable"))
{
availabilityTextv.setEnabled(false);
}*/ //<==== doesn't work
}
@Override
public boolean areAllItemsEnabled()
{
return false;
}
@Override
public boolean isEnabled(int position)
{
/*if(position == 3)
{
return false;
} //<== this works, but how do i do it dynamically based on value?*/
/*if(availabilityTextv.getText().toString().equals("Unavailable"))
{
getItem(position);
return false;
}*/ //<== doesn't work
return super.isEnabled(position);
}
};
listView.setAdapter(adapter);
Custom List View:
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
app:cardCornerRadius="5dp"
app:cardElevation="10dp"
app:cardBackgroundColor="@color/transparent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/timeTV"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingStart="8dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:textSize="25sp"
tools:ignore="RtlSymmetry" />
<TextView
android:id="@+id/availabilityTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:paddingEnd="8dp"
android:paddingBottom="5dp"
android:textSize="25sp"
tools:ignore="RtlSymmetry" />
</LinearLayout>
</androidx.cardview.widget.CardView>
BookingTimes class:
public class BookingTimes
{
private String time;
private String availability;
public BookingTimes()
{
}
public BookingTimes(String Time, String Availability)
{
this.time = Time;
this.availability = Availability;
}
public String getTime()
{
return time;
}
public void setTime(String Time)
{
this.time = Time;
}
public String getAvailability()
{
return availability;
}
public void setAvailability(String Availability)
{
this.availability = Availability;
}
}
Database:
Application:
You'd have to use the item availability directly in isEnabled(int)
.
new FirebaseListAdapter<BookingTimes>(options)
{
...
@Override
public boolean isEnabled(int position)
{
return getItem(position).getAvailability().equals("Unavailable");
}
}
Also keep in mind that FirebaseListAdapter
has a generic parameter type. Also make sure to not views like timeTextV
or availabilityTextv
, preferably with the view holder pattern.