Вы создаете адаптер после получения ответа на ValueEventListener
:
CustomListAdapter adapter = new CustomListAdapter(ViewDatabase.this , R.layout.custom_list , mList);
ListView mListView= findViewById(R.id.listview);
mListView.setAdapter(adapter);
Вместо этого установите адаптер, например, на ViewDatabase
в пределах onCreate
и установите цвет на основеэто начальное состояние.
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view_database_layout);
mListView = findViewById(R.id.listview);
CustomListAdapter adapter = new CustomListAdapter(this);
mListView.setAdapter(adapter);
//[...]
}
И вместо создания адаптера обновите его:
private void showData(DataSnapshot dataSnapshot) {
//[...]
if (mListView.getAdapter() instanceof CustomListAdapter) {
((CustomListAdapter)mListView.getAdapter()).updateList(array);
}
}
Вы также можете заменить ArrayAdapter на BaseAdapter в качестве расширенного класса:
public class CustomListAdapter extends BaseAdapter {
private static final int HERO_COUNT = 12;
private Context context;
private List<String> items;
public CustomListAdapter(Context context) {
this.context = context;
items = new ArrayList<>();
}
@Override
public int getCount() {
return HERO_COUNT;
}
@Override
public String getItem(int position) {
if (position >= 0 && position < items.size()) {
return items.get(position);
}
return "";
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View v, ViewGroup parent) {
View mView = v;
if (mView == null) {
LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mView = vi.inflate(R.layout.custom_list, null, false);
}
//Bind view content here
//TODO associate holder to tag
return mView;
}
public void updateList(List<String> updatedItems) {
items.clear();
items.addAll(updatedItems);
notifyDataSetChanged();
}
}
}
РЕДАКТИРОВАТЬ:
Чтобы иметь цвет фона по умолчанию в списке, который будет изменяться при получении значений, вы можете установить цвет по умолчанию в основном макете:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tvUserInfo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="User Information"
android:textAlignment="center"
android:textColor="@color/colorPrimaryDark"
android:textSize="25sp"/>
<ListView
android:id="@+id/listview"
android:background="@color/empty_color"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
</LinearLayout>
И затем измените его при получении значений:
private void showData(DataSnapshot dataSnapshot) {
//[...]
if (mListView.getAdapter() instanceof CustomListAdapter) {
((CustomListAdapter)mListView.getAdapter()).updateList(array);
listView.setBackgroundColor(ContextCompat.getColor(listView.getContext(), R.color.loaded_color));
}
}
Если вы хотите изменить цвет строки, вам нужно будет изменить макет строки в getView, когдастрока пуста.
РЕДАКТИРОВАТЬ 2 Указано, где вносить изменения в представление