在我过去的一个项目中,我实现了“时间选择器轮播”。它基于一个HorizontalScrollView
。用户可以在滚动该视图时选择时间。时间值是根据 X 偏移计算的HorizontalScrollView
.
我想在 github 上分享这个项目,但是在清理代码时我意识到一些表现不佳 issue.
The HorizontalScrollView
填充了自定义ArrayAdapter
. The getView()
uses a Holder
为了convertView
。我认为它可以作为一个适配器ListView
,因此只有可见项目才会被渲染并重用(如果它们将被销毁)。反而,所有项目均已渲染! (在我的例子中是 1008!)我自己添加它们(代码示例中的#1),但即使我尝试添加较少的内容,删除(和回收)旧的逻辑也不起作用,或者我错过了什么?
所以我的基本问题是:我必须改变什么才能使我的适配器表现得像ListView
?
- I found 这个所以链接 https://stackoverflow.com/questions/19020114/how-to-implement-view-recycling-mechanism-for-pager-adapter并尝试覆盖
remove
函数,但这永远不会被调用(不知何故逻辑,因为我只是添加)
- 有一个好的寻呼机适配器示例 https://gist.github.com/wang2bo2/4551304在 github 上,但不知何故我无法将其翻译为
ArrayAdapter<String>
欢迎任何想法、链接!
并且请不要建议使用ListView
反而。我们决定使用HorizontalScrollView
因为回调以及我们已经有一个ListView
在布局中。
水平滚动视图
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);
}