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'我...

谢谢。

+0

你能解决这个问题吗? – Prizoff

+1

是的,毕竟它工作...如果你想尝试它在这里[链接](https://github.com/Larphoid/android-Overscroll-ListView) – Larphoid

+0

非常感谢!我会试试看。 – Prizoff

这不是你的主要问题的答案,只是想留下一些笔记。

页眉/页脚的高度可以这样设置:

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