【问题标题】:some bugs appeared when combining PullToRefresh and SwipeListView library结合 PullToRefresh 和 SwipeListView 库时出现了一些错误
【发布时间】:2014-02-14 10:15:47
【问题描述】:

我有一个实现PullToRefresh(旧版本)和SwipeListView 库的列表。

我正在关注this 将这些库和this 结合起来以在Activity 中使用它。

我的列表可以执行一些基本功能,例如上拉/下拉和向左/向右滑动,但我遇到了一些错误:

  1. 我的列表视图中的项目位置总是从 1 开始,我认为它应该从 0 开始,所以我需要在我的方法中减少它。
  2. 当我滑动一个项目(例如,第一个项目)时,第 5 个项目将被滑动到。所以index+4项也会被刷屏。

我用来初始化对象的代码:

private PullToRefreshSwipeListView ptrListView;
private SwipeListView resultListView;

resultListView = ptrListView.getRefreshableView();
        ptrListView.setOnRefreshListener(new OnRefreshListener2<SwipeListView>() {

            @Override
            public void onPullDownToRefresh(PullToRefreshBase<SwipeListView> refreshView) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onPullUpToRefresh(PullToRefreshBase<SwipeListView> refreshView) {
                // TODO Auto-generated method stub

            }

        });

这是我用来初始化列表视图的方法:

private void setListview() {
        adapter = new LibraryAdapter(this, R.layout.item_library_list, new ArrayList<PurchasedItem>(), resultListView);
        adapter.setListener(new LibraryListListener() {
             //set the adapter

        });

        resultListView.setSwipeListViewListener(new BaseSwipeListViewListener() {
            //position di -1 karena sejak gabung library swipelistview + pulltorefresh, position slalu kelebihan 1 & menyebabkan OutOfBound error.

            @Override
            public void onClickFrontView(final int position) {
                //do something here
            }

            @Override
            public void onOpened(int position, boolean toRight) {
                // TODO Auto-generated method stub
                super.onOpened(position-1, toRight);
                lastPos = position-1;
            }

            @Override
            public void onMove(int position, float x) {
                // TODO Auto-generated method stub
                super.onMove(position-1, x);
            }

            @Override
            public int onChangeSwipeMode(int position) {
                // TODO Auto-generated method stub
                            return SwipeListView.SWIPE_MODE_DEFAULT;
            }

            @Override
            public void onStartOpen(int position, int action, boolean right) {
                // TODO Auto-generated method stub
                super.onStartOpen(position-1, action, right);

            }

        });

        resultListView.setOnItemLongClickListener(new OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> adapter, View arg1,
                    final int pos, long arg3) {
                //do something here

            }
        });

        ptrListView.setAdapter(adapter);
        ptrListView.setLongClickable(true);
        resultListView.setSwipeOpenOnLongPress(false);
    }

这是我的 xml:

 <com.handmark.pulltorefresh.library.PullToRefreshSwipeListView
        xmlns:swipe="http://schemas.android.com/apk/res-auto"
        xmlns:ptr="http://schemas.android.com/apk/res-auto"
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        android:cacheColorHint="@android:color/transparent"
        android:divider="@drawable/line_separator_repeat"
        android:listSelector="#00000000"
        ptr:ptrMode="pullFromEnd"
        swipe:swipeActionLeft="reveal"
        swipe:swipeBackView="@+id/back"
        swipe:swipeCloseAllItemsWhenMoveList="true"
        swipe:swipeFrontView="@+id/front"
        swipe:swipeMode="both" />

请帮助我,我们将不胜感激。谢谢

【问题讨论】:

  • 你能把你的代码贴在这里吗?我得到的是空指针。

标签: android listview swipe pull-to-refresh


【解决方案1】:

我遇到了和你一样的第一个问题。我认为第一项(索引 0)是标题。

int _index = index -  listView.getHeaderViewsCount();

我从来没有遇到过你的第二个问题。你可以试试这个来解决感人的问题:

listView.setOnScrollListener(listView.getRefreshableView().getTouchListener().makeScrollListener());

希望有帮助

【讨论】:

  • 谢谢,我会试试这个:D
  • 我不明白你的第二个代码放在哪里,我找不到 listView.getRefreshableView().getTouchListener()。你能把你的代码分享给我吗?我相信我错过了一些小东西,但我找不到它。我的电子邮件:blazetamareborn@gmail.com 谢谢:D
  • getTouchListener() 返回 SwipeListView 的 touchListener,可能我在 SwipeListView.java 中将此方法修改为 public。我把这个方法放在列表视图启动之后。
  • 是的,它现在可以工作了。稍后我会将我的代码放入您的答案中,以便人们更好地理解。非常感谢您的帮助:D
【解决方案2】:

为了解决问题没有。 2,只需将这两个 Override 函数添加到您的适配器:

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public int getViewTypeCount() {
        return 500;
    }

【讨论】:

  • 严重建议不要使用此解决方案。它违背了 listview 的主要目的之一。 (行回收)相反,只需在将行绑定到数据时重置状态。
  • 您有更好的解决方案吗?
猜你喜欢
  • 2013-06-07
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 2016-12-05
  • 2015-08-02
  • 2013-11-04
  • 2016-11-21
  • 1970-01-01
相关资源
最近更新 更多