我正在为我的公司制作电子书阅读应用程序;我们使用一个库来动态回流屏幕布局到我提供的自定义视图。
我想要一个让用户通过手指滑动从一个屏幕移动到另一个屏幕的显示器。我正在使用我自己的自定义适配器支持的android.widget.Gallery子类;适配器的getView()负责与库通信并为每个请求的页面生成一个View。
我的问题是,Gallery希望知道视图的总数,并在View数组中获得其当前位置的索引,但是我们使用的库使得无法知道。因为它进行动态回流,构成书籍的“屏幕”总数取决于设备的屏幕尺寸,当前字体大小,屏幕方向等 - 没有办法事先知道它。我们也可以跳到书中的位置;当它这样做时,无法从一开始就知道有多少'屏幕'(没有回到开始并且一次将页面推进到同一个地方),因此无法获得位置索引进入图库视图。
我目前的解决方案是在我的适配器的getView()调用中处理Gallery的'end'作为特殊条件:如果它触及Gallery的开头,但我知道有更多页面可用,我强制Gallery更改它当前位置。这是PageAdapter.getView()的一个例子:
public View getView(int position, View convertView, ViewGroup parent)
{
...
if( 0 == position ) {
// The adapter thinks we're at screen 0; verify that we really are
int i = 0;
// previousScreen() returns true as long as it could move
// to another screen; after this loop, i will equal the
// number of additional screens before our current position
while( m_book.previousScreen() ) {
i++;
}
PageFlipper pf = (PageFlipper) parent;
// Remember the last REAL position we dealt with.
// The +1 to mActualPosition is a hack--for some reason,
// PageFlipper.leftResync() needs it to work correctly.
m_lastRequestedPosition = i;
pf.mActualPosition = i + 1;
pf.mNeedsLeftResync = true;
// Do a fixup so we're on the right screen
while( i-- > 0 ) {
m_book.nextScreen();
}
}
...
m_view = new PageView(m_book);
return m_view;
}
以下是我在Gallery子类中的使用方法:
public class PageFlipper extends Gallery {
...
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
// Triggers a call to PageAdapter.getView()
super.onScroll(e1, e2, distanceX, distanceY);
// Adapter getView() may have marked us out of sync
this.checkLeftResync();
return true;
}
...
private void checkLeftResync() {
if( mNeedsLeftResync ) {
setSelection(mActualPosition, false);
mActualPosition = 0;
mNeedsLeftResync = false;
}
}
}
然而,我的解决方案不可靠,并且感觉直觉错误。我真正想要的是外观和感觉就像一个画廊小部件,但从不跟踪任何位置;相反,它总是会询问适配器是否有新视图可用并且行为正常。有没有人看到像这样的问题的解决方案?
BTW,我见过的最接近的是this project on Google apps,但它似乎期望一组静态的,预先分配的视图。提前感谢任何建议!