How to implement “Swipe down to refresh” like in new GMail app

谁说胖子不能爱 提交于 2019-11-27 09:41:13

问题


Google release the new Gmail app with an alternate way to handle pull down to refresh.

Instead of showing the started hidden row that is pulled down. Gmail displays an animated message overtop of the action bar.

The message includes an animated horizontal line.

Is this a standard feature of the Android SDK? I can't find anything in the action bar API that would do this.


回答1:


Chris Banes' ActionBar-PullToRefresh library on GitHub probably offers pull-to-refresh functionality closest to GMail app.

See also: Juhani Lehtimäki's analysis of GMail pull-to-refresh.




回答2:


Google has released support for this directly in the SDK. I am not sure of what version you need to support (that may be an issue).

Check out the official SDK feature info here: http://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html

If you are able to use the SDK one, you will be better off, even Chris Banes wrote a post, suggesting the same.




回答3:


try this...it's work for me.

res/layout/activity_main.xml

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.swipetorefresh.MainActivity"
tools:ignore="MergeRootFrame" />

res/layout/fragment_main.xml

<android.support.v4.widget.SwipeRefreshLayout           
       xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:id="@+id/container"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
       tools:ignore="MergeRootFrame" >

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

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

MainActivity.java

  public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        getFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }
}

public static class PlaceholderFragment extends ListFragment implements OnRefreshListener {

    private SwipeRefreshLayout mSwipeRefreshLayout;

    private static final int LIST_ITEM_COUNT = 5;
    private int mOffset = 0;

    private ArrayAdapter<String> mListAdapter;

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container,
                false);

        // Configure the swipe refresh layout
        mSwipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.container);
        mSwipeRefreshLayout.setOnRefreshListener(this);
        mSwipeRefreshLayout.setColorScheme(
                R.color.swipe_color_1, R.color.swipe_color_2,
                R.color.swipe_color_3, R.color.swipe_color_4);

        // Put the first batch of countries in the list
        mListAdapter = new ArrayAdapter<String>(
                getActivity(),
                android.R.layout.simple_list_item_1,
                android.R.id.text1,
                getCountries(mOffset));

        setListAdapter(mListAdapter);

        return rootView;
    }

    private List<String> getCountries(int offset) {
        ArrayList<String> countriesList = new ArrayList<String>();
        for(int i=0; i<LIST_ITEM_COUNT;i++){
            countriesList.add(COUNTRIES[offset+i]);
        }

        mOffset = offset + LIST_ITEM_COUNT;
        return countriesList;
    }

    @Override
    public void onRefresh() {
        // Start showing the refresh animation
        mSwipeRefreshLayout.setRefreshing(true);

        // Simulate a long running activity
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
               updateCountries();
            }
        }, 5000);
    }



    private void updateCountries() {

        // Add the next batch of countries to the list
        mListAdapter.addAll(getCountries(mOffset));

        // Signify that we are done refreshing
        mSwipeRefreshLayout.setRefreshing(false);
    }



    private static final String[] COUNTRIES = {"Afghanistan",
        "Albania", "Algeria", "American Samoa", "Andorra", "Angola",
        "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina",
        "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan",
        "Bahamas", "Bahrain", "Bangladesh", "Barbados", "Belarus",
        "Belgium", "Belize", "Benin", "Bermuda", "Bhutan",
        "Bolivia", "Bosnia and Herzegovina", "Botswana", "Brazil",
        "Brunei Darussalam", "Bulgaria", "Burkina Faso", "Burundi",
        "Cambodia", "Cameroon", "Canada", "Cape Verde", "Cayman Islands",
        "Central African Republic", "Chad", "Chile", "China",
        "Christmas Island", "Cocos (Keeling) Islands", "Colombia",
        "Comoros", "Democratic Republic of the Congo (Kinshasa)",
        "Congo, Republic of(Brazzaville)", "Cook Islands", "Costa Rica",
        "Ivory Coast", "Croatia", "Cuba", "Cyprus", "Czech Republic",
        "Denmark", "Djibouti", "Dominica", "Dominican Republic",
        "East Timor (Timor-Leste)", "Ecuador", "Egypt",
        "El Salvador", "Equatorial Guinea", "Eritrea", "Estonia", "Ethiopia"};

        }
   }



回答4:


Chris Banes ( the same guy who implemented the best pull to refresh component for android) also implemented the Gmail like Pull To Refresh.

You can find it here: https://github.com/chrisbanes/ActionBar-PullToRefresh

Note that this project is still under development so the current API may change.




回答5:


fragment_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.testloading.MainActivity$PlaceholderFragment" >

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

</RelativeLayout>    


counteries.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView 
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="47dp"
        android:gravity="center_vertical"
        android:textStyle="bold"/>
</LinearLayout>



package com.example.testloading;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

    private static final String TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment()).commit();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        private ListView listView;
        private static final int LIST_ITEM_COUNT = 20;
        private int mOffset = 0;
        private boolean flag_loading;

        private MyAdapter adapter;
        private List<String> list;

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container,
                    false);

            listView = (ListView) rootView.findViewById(R.id.list);
            list = getCountries(mOffset);
            adapter = new MyAdapter(list, getActivity());
            listView.setAdapter(adapter);
            listView.setOnScrollListener(new OnScrollListener() {

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

                @Override
                public void onScroll(AbsListView view, int firstVisibleItem,
                        int visibleItemCount, int totalItemCount) {
                    Log.d(TAG, "firstVisibleItem : " + firstVisibleItem
                            + " , visibleItemCount : " + visibleItemCount
                            + " , totalItemCount : " + totalItemCount);
                    if (firstVisibleItem + visibleItemCount == totalItemCount) {
                        Log.d(TAG, "ZZZ offSet : " + mOffset);
                        if (COUNTRIES.length > mOffset) {
                            if (flag_loading == false) {
                                Log.d(TAG, "ZZZ inside : ");
                                flag_loading = true;
                                additems();
                            }
                        }
                    }

                }
            });
            return rootView;
        }

        protected void additems() {
            list.addAll(getCountries(mOffset));
            adapter.notifyDataSetChanged();
            listView.invalidate();
            flag_loading = false;
        }

        private List<String> getCountries(int offset) {
            ArrayList<String> countriesList = new ArrayList<String>();
            for (int i = 0; i < LIST_ITEM_COUNT; i++) {
                if (COUNTRIES.length > offset + i) {
                    countriesList.add(COUNTRIES[offset + i]);
                }
            }

            mOffset = offset + LIST_ITEM_COUNT;
            return countriesList;
        }

        private static final String[] COUNTRIES = { "Afghanistan", "Albania",
                "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla",
                "Antarctica", "Antigua and Barbuda", "Argentina", "Armenia",
                "Aruba", "Australia", "Austria", "Azerbaijan", "Bahamas",
                "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium",
                "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia",
                "Bosnia and Herzegovina", "Botswana", "Brazil",
                "Brunei Darussalam", "Bulgaria", "Burkina Faso", "Burundi",
                "Cambodia", "Cameroon", "Canada", "Cape Verde",
                "Cayman Islands", "Central African Republic", "Chad", "Chile",
                "China", "Christmas Island", "Cocos (Keeling) Islands",
                "Colombia", "Comoros",
                "Democratic Republic of the Congo (Kinshasa)",
                "Congo, Republic of(Brazzaville)", "Cook Islands",
                "Costa Rica", "Ivory Coast", "Croatia", "Cuba", "Cyprus",
                "Czech Republic", "Denmark", "Djibouti", "Dominica",
                "Dominican Republic", "East Timor (Timor-Leste)", "Ecuador",
                "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea",
                "Estonia", "Ethiopia" };

    }
}

class MyAdapter extends BaseAdapter {

    private List<String> list;
    private LayoutInflater layoutInflater;

    public MyAdapter(List<String> list, Context context) {
        this.list = list;
        layoutInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup arg2) {

        ViewHolder viewHolder;

        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.counteries, null);
            viewHolder = new ViewHolder();
            viewHolder.textView = (TextView) convertView
                    .findViewById(R.id.text_view);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.textView.setText(list.get(position));
        return convertView;
    }

    class ViewHolder {
        public TextView textView;
    }
}



回答6:


Test it. Using: swipeRefreshLayout.setRotation(180f);

And in your adapter ListView, method getView: view.setRotation(180f);

invert order of your items in List.

Or using directly android:rotation="180" in xml.



来源:https://stackoverflow.com/questions/17029256/how-to-implement-swipe-down-to-refresh-like-in-new-gmail-app

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!