прокрутка списка внизу не работает

РЕДАКТИРОВАТЬ: недавно снова работал над этим и заработал, так что больше не нужен ответ. ссылка

Я сделал просмотр списка с возможностью прокрутки, и все работает, за исключением случаев, когда вы прокручиваете последний элемент с помощью навигационной панели / трекбола. При прокрутке пальцем на экране все проверки верхней и нижней прокрутки работают, даже при прокрутке с помощью крестовины / трекбола за пределами первого элемента в списке ... но только не нижней стороны. Вот почему это меня пугает, потому что другие проверки все работают... я не публикую всю активность, потому что она довольно большая, я просто опубликую то, что считаю нужным. Вся проверка выполняется в классе 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;
}

Класс просмотра прокрутки:

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);
            }
        }
    }
    };
}

Хотя большая часть этого работает, с чем я могу жить, я был бы признателен, если бы кто-нибудь мог увидеть, что происходит не так, потому что это просто беспокоит меня...

Спасибо.


person Larphoid    schedule 01.01.2013    source источник
comment
Где вы можете это решить?   -  person Prizoff    schedule 11.01.2013
comment
Да, в конце концов, он заработал... если вы хотите попробовать, вот ссылка< /а>   -  person Larphoid    schedule 23.02.2013
comment
Большое спасибо! Я попробую.   -  person Prizoff    schedule 24.02.2013


Ответы (1)


Это не ответы на ваш главный вопрос, просто хотел оставить некоторые заметки.

Высота верхнего/нижнего колонтитула может быть установлена ​​следующим образом:

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.

person Prizoff    schedule 11.01.2013
comment
Спасибо, я не подумал об этом, потому что мой список покрывает весь экран, но это было бы здорово, когда это не так. - person Larphoid; 05.02.2013