overscroll listview底部不能正常工作
问题描述:
编辑︰最近再次努力,并得到它的工作,所以不需要一个答案了。 linkoverscroll listview底部不能正常工作
我做了一个超级滚动列表视图和一切工作,除非你用方向垫/轨迹球滚动超出最后一项。当用手指在屏幕上滚动时,即使使用超出列表中第一项的d-pad/trackball进行滚动,所有检查顶部和底部的超滚动工作......但不是底部。这就是为什么它吓坏了我,因为其他检查所有的工作...我没有发布整个活动因为它非常大,我只是发布我认为是necesarry。所有的检查都在OverscrollListview类中完成。
活动:
package com.somepackage;
public class SomeActivity extends ListActivity
{
private OverscrollListview mNotesList;
protected void onCreate(Bundle savedInstanceState)
{
mNotesList = (OverscrollListview) findViewById(android.R.id.list);
/* just a view in xml that can be sized so that the header and footer are always
the height of the complete screen no matter what device it runs on ...
*/
header = LayoutInflater.from(this).inflate(R.layout.listview_overscrollview, null);
header.findViewById(R.id.overscroll)
.setMinimumHeight(getWindowManager()
.getDefaultDisplay()
.getHeight());
mNotesList.addHeaderView(header, null, false);
mNotesList.addFooterView(header, null, false);
mNotesList.setOnScrollListener(mNotesList);
mNotesList.setAdapter(mainadapter);
populateNotesList();
}
...
}
public void populateNotesList()
{
...
// whenever the listview gets populated, these values need to be 0 again
mNotesList.item = mNotesList.itemOffset = 0;
}
的overscrollview类:
package com.somepackage;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.Toast;
public class OverscrollListview extends ListView implements OnScrollListener
{
public int item = 0, itemOffset = 0, first = 0, count = 0, total = 0;
private int currentScrollState = OnScrollListener.SCROLL_STATE_IDLE;
private Handler mHandler = new Handler();
private Toast toast;
private View listitem;
public OverscrollListview(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
toast = Toast.makeText(context, "", Toast.LENGTH_LONG);
}
public OverscrollListview(Context context, AttributeSet attrs)
{
super(context, attrs);
toast = Toast.makeText(context, "", Toast.LENGTH_LONG);
}
public OverscrollListview(Context context)
{
super(context);
toast = Toast.makeText(context, "", Toast.LENGTH_SHORT);
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
first = firstVisibleItem;
count = visibleItemCount;
total = totalItemCount;
mHandler.postDelayed(checkListviewTopAndBottom, 100);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
{
currentScrollState = scrollState;
mHandler.postDelayed(checkListviewTopAndBottom, 100);
}
private final Runnable checkListviewTopAndBottom = new Runnable()
{
@Override
public void run() {
toast.setText("first="+first+"\ncount="+count+"\nlast="+getLastVisiblePosition()+"\ntotal="+total+"\nitem="+item);
toast.show();
if (getCount() <= 2) return; // do nothing, listview has no items, only header & footer
if (currentScrollState != OnScrollListener.SCROLL_STATE_IDLE) return; // do nothing, still scrolling
if (getFirstVisiblePosition() < 1) {
setSelectionFromTop(1, getDividerHeight());
return;
}
if (getLastVisiblePosition() == getCount()-getHeaderViewsCount()) {
if (item == 0) {
if (getFirstVisiblePosition() < 1) {
item = 1;
itemOffset = getDividerHeight();
} else {
item = getCount()-getHeaderViewsCount();
listitem = getChildAt(item);
if (listitem != null) {
itemOffset = getHeight()-listitem.getHeight()+getDividerHeight();
} else {
itemOffset = getHeight()+getDividerHeight();
}
}
}
//toast.setText("LastVisPos()==getCount()-1\nitem="+item+"\nitemOffset="+itemOffset);
//toast.show();
if (item == getCount()-getHeaderViewsCount() || (item == 1 && getFirstVisiblePosition() < 1)) {
setSelectionFromTop(item, itemOffset);
}
}
}
};
}
虽然它的大部分工作,我可以忍受,我会很感激,如果有人能看到什么错的Cuz它的只是buggin'我...
谢谢。
答
这不是你的主要问题的答案,只是想留下一些笔记。
页眉/页脚的高度可以这样设置:
public class OverscrollListview extends ListView implements OnScrollListener
{
// ...
@Override
protected void layoutChildren() {
View v = findViewById(R.id.HEADER_VIEW_ID);
ViewGroup.LayoutParams lp = v.getLayoutParams();
lp.height = getHeight();
v.setLayoutParams(lp);
v = findViewById(R.id.FOOTER_VIEW_ID);
v.setLayoutParams(lp);
super.layoutChildren();
}
}
看来,这是更方便的方法。通过这种方式,页眉/页脚的高度可以设置为其LsitView的高度。
+0
谢谢我没有考虑它因为我的listview覆盖整个屏幕,但这将是伟大的,当它不。 – Larphoid
你能解决这个问题吗? – Prizoff
是的,毕竟它工作...如果你想尝试它在这里[链接](https://github.com/Larphoid/android-Overscroll-ListView) – Larphoid
非常感谢!我会试试看。 – Prizoff