【发布时间】:2013-04-08 12:11:24
【问题描述】:
我试图让两个并排的 ListView 在某种程度上像 GridView 一样。我不使用 GridView 的原因是因为不支持交错外观。无论如何,到目前为止,我有以下代码:
编辑:
我按照@Sam 的建议做了,并使用了以下代码:
lv1.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (touchSource == null) {
touchSource = v;
}
if (v == touchSource) {
lv2.dispatchTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_UP) {
clickSource = v;
touchSource = null;
}
}
return false;
}
});
lv1.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if (parent == clickSource) {
//my own code here
}
}
});
lv1.setOnScrollListener(new OnScrollListener() {
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (view == clickSource) {
}
boolean loadMore = /* maybe add a padding */
firstVisibleItem + visibleItemCount + 10 >= totalItemCount;
if (loadMore) {
//add items, load more
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
});
lv2.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (touchSource == null) {
touchSource = v;
}
if (v == touchSource) {
lv1.dispatchTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_UP) {
clickSource = v;
touchSource = null;
}
}
return false;
}
});
lv2.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if (parent == clickSource) {
}
}
});
lv2.setOnScrollListener(new OnScrollListener() {
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (view == clickSource) {
}
boolean loadMore = /* maybe add a padding */
firstVisibleItem + visibleItemCount + 2 >= totalItemCount;
if (loadMore) {
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
});
我还在其中一个列表上使用 标题 来创建交错效果,我需要不惜一切代价保持这种交错。这主要是有效的(上面的代码),但它很多时候不同步。我发现这只是当我有小的短刷时。我不知道为什么,我找不到一个好的解决方案。在我看来,上述逻辑应该可行。
另外,为了以防万一,我使用 UniversalImageLoader 加载照片和一个简单的 EndlessScroll 逻辑来加载更多照片(直接调用 adapter.notifyDataSetChanged())。不过,这东西似乎不太相关。即使加载了照片,我仍然可以看到它不同步。
我想明确一点:如果我进行短滑动(有时只是一般重复滚动),我可以随意取消同步列表。
感谢任何帮助。谢谢。
编辑 2:
还没有找到好的解决方案。以下是我发现不太奏效的解决方案:
- 上述解决方案:不同步过于频繁
- Pinterest List View: 没有 OnScrollListener/onItemClick 区分
- StaggeredGridView: 没有 onScrollListener
- Stag Project: 没有 onItemClick 监听器
- Linear Layout Method: 没有 onItemClick 监听器
有什么想法吗?谢谢。
【问题讨论】:
-
显然 Pinterest 使用了这样的布局,如果您在 Stack Overflow 上搜索 "android pinterest",您可以找到各种方法。
-
是的,我意识到这一点。我也一直在研究这个。实际上,我从 Pinterest 样式网格的另一个答案github.com/vladexologija/PinterestListView 中获得了部分来源,但我认为它不能解决我区分与滚动相关的 onItemClicks 和 TouchEvents 的问题。
-
我从未使用过 Pinterest 应用程序,但当有人问:Android. Scrolling 2 listviews together 我想出了一个可能对您有所帮助的解决方案。 (它可以处理您想要的点击,但有时同步会中断......)
-
StaggeredGridView 具有良好的点击处理能力,看起来很符合您的要求。
-
我不能用这个实现滚动监听。感谢您的建议。
标签: java android android-listview scroll motionevent