В одном из моих прошлых проектов я реализовал «Карусель времени». Он основан на HorizontalScrollView
. Пользователь может выбрать время, прокручивая это представление. Значение времени рассчитывается из X-смещения HorizontalScrollView
.HorizontalScrollView: CustomAdapter с getView() не повторно использует convertView, как ListView
Я хотел разделить этот проект на GitHub, но в то время очистки кода я понял, некоторые плохой производительности вопрос.
HorizontalScrollView
заполнен обычным ArrayAdapter
. В getView()
используется Holder
для convertView
. Я думал, что это может работать как адаптер в пределах ListView
, поэтому только видимые элементы отображаются и повторно используются, если они будут уничтожены. Вместо этого, все предметы визуализируются !!! (в моем случае 1008!) Я добавляю их сам (# 1 в примере кода), но даже если я пытаюсь добавить меньше, логика из удаления (и утилизации) старых не работает или мне что-то не хватает?
Итак, мой основной вопрос: Что мне нужно изменить, чтобы сделать мой адаптер таким, как ListView
?
- Я нашел this so link и попытался перекрывая
remove
функцию, но это никогда не называют (как-то логика, потому что я только добавление) - Там хороший PagerAdapter example на GitHub, но почему-то я не могу перевести это
ArrayAdapter<String>
Любые мысли, ссылки приветствуются!
И, пожалуйста, не предлагайте вместо этого использовать ListView
. Мы решили использовать HorizontalScrollView
из-за обратных вызовов и того факта, что у нас уже есть ListView
в макете.
HorizontalScrollView
InfiniteTimeScrubberHorizontalView extends HorizontalScrollView{
...
public void setAdapter(Context context, TimeScrubberListAdapter mAdapter) {
this.mAdapter = mAdapter;
try {
fillViewWithAdapter(mAdapter);
} catch (ZeroChildException e) {
e.printStackTrace();
}
}
private void fillViewWithAdapter(TimeScrubberListAdapter mAdapter) {
//...
ViewGroup parent = (ViewGroup) getChildAt(0);
parent.removeAllViews();
for (int i = 0; i < mAdapter.getCount(); i++) {
//#1: Here: ALL views are added
parent.addView(mAdapter.getView(i, null, parent));
}
}
Adpater
public class TimeScrubberListAdapter extends ArrayAdapter<String> {
//...
private ArrayList<String> list; //list from 0:00,0:30...23:00,23:30
final static int MAXIMUM_DAYS = 21
@Override
public int getCount() {
return list.size() * MAXIMUM_DAYS;
}
@Override
public String getItem(int position) {
return list.get(position % list.size());
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
RelativeLayout layout;
if (convertView == null) {
layout = (RelativeLayout) View.inflate(context, layoutId, null);
holder = new Holder();
holder.title = (TextView) layout.findViewById(R.id.epg_item_text);
layout.setTag(holder);
} else {
layout = (RelativeLayout) convertView;
view = layout;
holder = (Holder) layout.getTag();
}
layout.setLayoutParams(mLP);
String timeValue = getItem(position);
holder.title.setText(timeValue);
return layout;
}
//...
@Override
public void remove(String object) {
//not called...some how logic, because i do not remove an item
super.remove(object);
}
Вы пытались использовать некоторые реализации HorizontalListView? –
Ну, в начале мы решили использовать 'ScrollView' вместо' HorizontalListView' ... но я попробую, если не найду решение для моей текущей проблемы – longilong
, возможно, попробуйте добавить что-то вроде: if (convertView == null && convertView.isVisible()). Обратите внимание, что это выстрел в темноте. Надеюсь, это поможет – AmaJayJB