我有以下代码使ListView看起来像一个垂直图库
public class VerticalGallery extends ListView {
private View currentDisplayingView;
private int currentPosition;
public VerticalGallery(Context context, List<Page> pages) {
super(context);
setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
currentDisplayingView = view;
currentPosition = position;
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
setAdapter(new PageAdapter(context, pages));
setCacheColorHint(Color.TRANSPARENT);
}
public boolean onTouchEvent(MotionEvent evt) {
if (currentDisplayingView != null && currentDisplayingView.onTouchEvent(evt))
return true;
PageAdapter adapter = (PageAdapter) getAdapter();
if (currentPosition == adapter.list.size() - 1)
return false;
// TODO: Handle events and swipe somewhere
return super.onTouchEvent(evt);
}
public class PageAdapter extends BaseAdapter {
private Context context;
private List<Page> list;
public PageAdapter(Context c, List<Page> pages) {
context = c;
list = pages;
}
public int getCount() {
return list.size();
}
public Page getItem(int position) {
return list.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View view = getItem(position).generateView(context);
view.setLayoutParams(new ListView.LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
return view;
}
}
}
但是我还需要模拟一些行为:
onItemSelected
事件:
我需要这些因为我将事件分派到当前视图,并且只有当currentView在touchEvent上返回false时才让ListView
滚动,我不需要完全相同的ItemSelected事件,这可能类似。任何让我这样做的组件也会是一个有用的答案。
编辑: 实际上,我用这个解决方案Using Animation to swipe views解决了这个问题,但我会把这个问题保持开放。
答案 0 :(得分:0)
how to implement both ontouch and also onfling in a same listview?
阅读此问题接受了有关GestureListener类实现的答案。
将MyGestureListener类作为当前内部的类或将ListView对象传递给MyGestureListener类的构造函数。
在onFling()方法中测量初始和最终触摸之间的差异,如
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if(e1.getY() > e2.getY()) //1
{
int pos=(int)Math.floor(listView.getLastVisiblePosition/2);//2
if(pos < listView.getLastVisiblePosition())
listView.smoothScrollToPosition(pos--);//3
else
listView.smoothScrollToPosition(listView.getLastVisiblePosition());
}
else
{
int pos=(int)Math.floor(listView.getLastVisiblePosition/2);
if(pos < listView.getLastVisiblePosition && pos > listView.getFirstVisiblePosition())
listView.smoothScrollToPosition(pos++);
else
listView.smoothScrollToPosition(listView.getFirstVisiblePosition());
}
}
如果e1.getY() > e2.getY()
表示用户向下推进。差异e2.getY() - e1.getY()
是否定的。
假设当前位置是中间位置。
向下移动一个位置。
此代码未经过测试,是对第3个问题的回复。我只是指着你的想法。
答案 1 :(得分:0)
在我研究的过程中,我开发了这个自定义ScrollView,它可以进行分页。
public class ScrollViewVertical扩展ScrollView { 私有布尔分页;
public ScrollViewVertical(Context context) {
super(context);
}
public boolean onTouchEvent(MotionEvent evt) {
if (evt.getAction() == MotionEvent.ACTION_UP)
if (isPaging()){
centralizeContent();
return true;
}
return super.onTouchEvent(evt);
}
private void centralizeContent() {
int currentY = getScrollY() + getHeight() / 2;
ViewGroup content = (ViewGroup) getChildAt(0);
for (int i = 0; i < content.getChildCount(); i++) {
View child = content.getChildAt(i);
System.out.println(BoundsUtils.from(child));
if (child.getTop() < currentY && child.getBottom() > currentY) {
smoothScrollTo(0, child.getTop());
break;
}
}
}
}