#android #kotlin #android-spinner #android-thread
#Android #kotlin #android-счетчик #android-поток
Вопрос:
Я загружаю список стран в счетчик, в нем около 225 элементов, каждый с изображением.
Я загружаю это во фрагменте. Проблема в том, что приложение зависает на 2-3 секунды, когда я добираюсь до этого фрагмента.
Я также пытался загрузить это в потоке, но это не помогло.
Ниже приведен мой код.
Код счетчика во фрагменте
var spinnerAdapter : CountriesAdapter?= null
val runnable= Runnable {
spinnerAdapter= CountriesAdapter(activity?.applicationContext, R.layout.country_component,
CountriesModel.getCountryDataList())
spinnerNationality?.setAdapter(spinnerAdapter)
}
val thread = Thread(runnable)
thread.start()
Пользовательский адаптер
public class MyAdapter extends ArrayAdapter {
Context context;
List<CountriesDTO> objects;
int textViewResourceId;
public MyAdapter(Context context,
int textViewResourceId,
List<CountriesDTO> objects) {
super(context, textViewResourceId, objects);
this.objects= objects;
this.context= context;
this.textViewResourceId= textViewResourceId;
}
public View getCustomView(int position, View convertView,
ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(textViewResourceId, parent, false);
TextView label = (TextView) row.findViewById(R.id.tvCountry);
ImageView ivFlag = row.findViewById(R.id.ivCountryFlag);
label.setText(objects.get(position).getCountryName());
Glide.with(context)
.load(objects.get(position).getCompleteFlagURL())
.into(ivFlag);
return row;
}
@Override
public View getDropDownView(int position, View convertView,
ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
}
Комментарии:
1. Я решил эту проблему с помощью SplashScreen, ожидая загрузки всего списка
2. Любой другой способ решить эту проблему
3. вы можете загружать 10 элементов списка одновременно, например, facebook или instagram .. просто посмотрите на процент прокрутки полосы прокрутки
Ответ №1:
Рассмотрим другой дизайн UX, a Spinner
не создан для отображения 225 элементов. Вы хотите использовать a RecyclerView
для такого количества элементов.
Самый простой вариант — перейти к отдельному Fragment
, где пользователь выбирает страну. Вы также можете использовать DialogFragment
. В качестве альтернативы вы можете показать a PopupWindow
с пользовательским представлением.
Редактировать: я вижу, вы не перерабатываете свои просмотры spinner, из-за чего ваш адаптер раздувает 225 просмотров. Однако с точки зрения UX вы все равно можете рассмотреть возможность использования отдельного фрагмента для одновременного отображения большего количества элементов.
Вы хотите переработать свои представления адаптера следующим образом:
public View getCustomView(int position, View convertView,
ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row;
if (convertView == null) {
// only inflate a new view when we don't recycle one
row = inflater.inflate(textViewResourceId, parent, false);
} else {
// recycle convertView
row = convertView
}
// these findViewById() calls are also slowing you down
TextView label = (TextView) row.findViewById(R.id.tvCountry);
ImageView ivFlag = row.findViewById(R.id.ivCountryFlag);
label.setText(objects.get(position).getCountryName());
Glide.with(context)
.load(objects.get(position).getCompleteFlagURL())
.into(ivFlag);
return row;
}