如何实现Android的拉取刷新

dy1byipe  于 2022-09-21  发布在  Android
关注(0)|答案(18)|浏览(148)

在Twitter(官方应用)等Android应用中,当你遇到ListView时,你可以拉下它(发布后它会反弹回来)来刷新内容。

我想知道,在您看来,实现这一点的最佳方式是什么?

我能想到的一些可能性是:

1.ListView顶部的项目--然而,我不认为在ListView上使用动画滚动回到项目位置1(从0开始)是一件容易的任务。
1.ListView外部的另一个视图-但我需要注意在拖拽ListView时将ListView位置向下移动,并且我不确定是否可以检测到拖拽到ListView的触摸是否真的滚动ListView上的项。

有什么建议吗?

另外,我想知道Twitter应用程序的官方源代码什么时候发布。有人提到它会上映,但6个月过去了,我们再也没有听到过它的消息。

gblwokeq

gblwokeq1#

如果你不想让你的程序看起来像一个强制安装在Android中的iPhone程序,那就瞄准一个更自然的外观和感觉,做一些类似于姜饼的事情:

envsm3lx

envsm3lx2#

如果您想在网页视图或其他地方使用拉取刷新,那么只需将此代码复制粘贴到您的项目中,它就可以很好地工作。

XML源代码:

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/swiperefresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <WebView
        android:id="@+id/WebView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true">
    </WebView>
    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

Java代码:

final SwipeRefreshLayout pullToRefresh = findViewById(R.id.swiperefresh);
    pullToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh()
        {
          Toast.makeText(WebBrowser.this,"pull to refresh",Toast.LENGTH_LONG).show();
            mwebView.loadUrl(mainUrl);
            pullToRefresh.setRefreshing(false);//if false then refresh progress dialog will disappear when page loading finish, but if it is true then always the refresh load dialog show even after the page load or not
        }
    });

build.gradle源码:

implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
ljsrvy3e

ljsrvy3e3#

将此添加到您的布局中

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
        android:id="@+id/swipeRefreshView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

现在,只需在代码中添加以下行

mSwipeRefreshLayout.setOnRefreshListener(() -> {

       // your refresh code here

    });

你们都完蛋了

wbrvyc0a

wbrvyc0a4#

那些希望为RecclerView实现拉入刷新功能的人可以遵循我的简单教程How to implement Pull To Refresh for RecyclerView in Android

要导入的库

implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.gridlayout:gridlayout:1.0.0'

XML代码

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    android:id="@+id/swipe_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

活动Java代码

import androidx.appcompat.app.AppCompatActivity;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import android.os.Bundle;
import android.os.Handler;

public class MainActivity extends AppCompatActivity {

private SwipeRefreshLayout swipeRefreshLayout;

...

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ...
        swipeRefreshLayout = findViewById(R.id.swipe_layout);
        initializeRefreshListener();
}

    void initializeRefreshListener() {

        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                // This method gets called when user pull for refresh,
                // You can make your API call here,
                // We are using adding a delay for the moment
                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if(swipeRefreshLayout.isRefreshing()) {
                            swipeRefreshLayout.setRefreshing(false);
                        }
                    }
                }, 3000);
            }
        });
    }
lrpiutwd

lrpiutwd5#

非常有趣的Pull-to-RefreshYalantis。IOS版的GIF,但您可以查看:)

<com.yalantis.pulltorefresh.library.PullToRefreshView
android:id="@+id/pull_to_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
    android:id="@+id/list_view"
    android:divider="@null"
    android:dividerHeight="0dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
ntjbwcob

ntjbwcob6#

要获取最新的棒棒糖Pull-to刷新:

1.下载最新的Lolliop SDK和Extras/Android支持库
1.将Project的Build Target设置为Android 5.0(否则支持包可能会出现资源错误)
1.将您的libs/android-Support-v4.jar更新到第21版
1.使用android.support.v4.widget.SwipeRefreshLayoutandroid.support.v4.widget.SwipeRefreshLayout.OnRefreshListener

详细指南可在此处找到:http://antonioleiva.com/swiperefreshlayout/

另外,对于ListView,我建议在评论中阅读有关canChildScrollUp()的内容;)

pgx2nnw8

pgx2nnw87#

我们首先应该知道什么是拉动来刷新Android的布局。在Android中,我们可以将Pull称为Swipe-to-Renh。当你从上到下滑动屏幕时,它会根据setOnRechresListener执行一些操作。

下面是tutorial,它演示了如何实现Android Pull来刷新。我希望这能帮到你。

hm2xizp9

hm2xizp98#

我认为最好的图书馆是:https://github.com/chrisbanes/Android-PullToRefresh

与以下各项配合使用:

ListView
ExpandableListView
GridView
WebView
ScrollView
HorizontalScrollView
ViewPager
1wnzp6jl

1wnzp6jl9#

我在这里编写了一个刷新组件:https://github.com/guillep/PullToRefresh如果列表中没有项目,它就会工作,并且我已经在>=1.6的Android手机上测试了它。

如有任何建议或改进,我们将非常感谢:)

qf9go6mv

qf9go6mv10#

最后,谷歌发布了拉刷新库的官方版本!

它在支持库中称为SwipeRefreshLayout,文档为here

1.添加SwipeRefreshLayout作为视图的父级,它将被视为刷新布局的拉取。(我以ListView为例,它可以是任何View,如LinearLayoutScrollView等。)

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/pullToRefresh"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
     <ListView
         android:id="@+id/listView"
         android:layout_width="match_parent"
         android:layout_height="match_parent"/>
 </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

1.向您的类添加监听器

protected void onCreate(Bundle savedInstanceState) {
     final SwipeRefreshLayout pullToRefresh = findViewById(R.id.pullToRefresh);
     pullToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
         @Override
         public void onRefresh() {
             refreshData(); // your code
             pullToRefresh.setRefreshing(false);
         }
     });
 }

您也可以根据需要调用pullToRefresh.setRefreshing(true/false);

更新

Android支持库已经过时,取而代之的是androidX。指向新库的链接可以在here找到。

此外,您还需要向项目中添加以下依赖项:

implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'

你可以去重构>>迁移到androidX,Android Studio会为你处理依赖关系。

zphenhs4

zphenhs411#

注意,当在Android和WP上实现时,有一些UX问题需要解决。

“为什么设计师/开发人员不应该像iOS应用那样实现拉刷新,一个很好的指标是,谷歌和他们的团队从来不在Android上使用拉刷新,而他们确实在iOS上使用它。”

https://plus.google.com/109453683460749241197/posts/eqYxXR8L4eb

vq8itlhq

vq8itlhq12#

没有人提到像Google Now或Gmail应用程序那样在操作栏顶部显示的新类型的“拉入刷新”。

有一个库ActionBar-PullToRefresh,它的工作原理与此完全相同。

wh6knrhe

wh6knrhe13#

我有非常简单的方法来做这件事,但现在我确信这是万无一失的方法,那就是我的代码PullDownListView.java

package com.myproject.widgets;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;

/**
 * @author Pushpan
 * @date Nov 27, 2012

**/

public class PullDownListView extends ListView implements OnScrollListener {

    private ListViewTouchEventListener mTouchListener;
    private boolean pulledDown;

    public PullDownListView(Context context) {
        super(context);
        init();
    }

    public PullDownListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public PullDownListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        setOnScrollListener(this);
    }

    private float lastY;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            lastY = ev.getRawY();
        } else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
            float newY = ev.getRawY();
            setPulledDown((newY - lastY) > 0);
            postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (isPulledDown()) {
                        if (mTouchListener != null) {
                            mTouchListener.onListViewPulledDown();
                            setPulledDown(false);
                        }
                    }
                }
            }, 400);
            lastY = newY;
        } else if (ev.getAction() == MotionEvent.ACTION_UP) {
            lastY = 0;
        }
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        setPulledDown(false);
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }

    public interface ListViewTouchEventListener {
        public void onListViewPulledDown();
    }

    public void setListViewTouchListener(
            ListViewTouchEventListener touchListener) {
        this.mTouchListener = touchListener;
    }

    public ListViewTouchEventListener getListViewTouchListener() {
        return mTouchListener;
    }

    public boolean isPulledDown() {
        return pulledDown;
    }

    public void setPulledDown(boolean pulledDown) {
        this.pulledDown = pulledDown;
    }
}

您只需在要使用此ListView的活动上实现ListViewTouchEventListener并设置监听器

我在PullDownListViewActivity中实现了它

package com.myproject.activities;

import android.app.Activity;
import android.os.Bundle;

/**
 * @author Pushpan
 *
 */
public class PullDownListViewActivity extends Activity implements ListViewTouchEventListener {

    private PullDownListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        listView = new PullDownListView(this);
        setContentView(listView);
        listView.setListViewTouchListener(this);

        //setItems in listview
    }

    public void onListViewPulledDown(){
        Log.("PullDownListViewActivity", "ListView pulled down");
    }
}

它对我很有效:)

zy1mlcev

zy1mlcev14#

要实现Android拉入刷新,请尝试这段代码,

<android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/pullToRefresh"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

</android.support.v4.widget.SwipeRefreshLayout>

活动类:

ListView lv = (ListView) findViewById(R.id.lv);
SwipeRefreshLayout pullToRefresh = (SwipeRefreshLayout) findViewById(R.id.pullToRefresh);

lv.setAdapter(mAdapter);

pullToRefresh.setOnRefreshListener(new OnRefreshListener() {

        @Override
        public void onRefresh() {
            // TODO Auto-generated method stub

            refreshContent();

        }
    });

private void refreshContent(){ 

     new Handler().postDelayed(new Runnable() {
            @Override public void run() {
                pullToRefresh.setRefreshing(false);
            }
        }, 5000);

 }
uajslkp6

uajslkp615#

在这个链接中,您可以找到著名的PullToRefresh视图的分支,该视图具有新的有趣的实现,如PullTorRefreshWebViewPullToRefreshGridView,或者可以在列表的底部边缘添加PullToRefresh

https://github.com/chrisbanes/Android-PullToRefresh

最棒的是它能在安卓4.1上完美工作(正常的PullToRefresh不能工作)

相关问题