31 votes

Comment implémenter "Glissez vers le bas pour actualiser" comme dans la nouvelle application GMail

Google publie la nouvelle application Gmail avec un autre moyen de gérer les opérations d'actualisation.

Au lieu de montrer la ligne cachée commencée qui est abaissée. Gmail affiche un message animé au-dessus de la barre d'action.

Le message comprend une ligne horizontale animée.

Est-ce une fonctionnalité standard du SDK Android? Je ne trouve rien dans l'API de la barre d'action qui puisse le faire.

entrez la description de l'image ici

46voto

Booger Points 7311

Google a publié le support directement dans le SDK. Je ne suis pas sûr de quelle version vous avez besoin de soutien (qui peut être un problème).

Découvrez le SDK officiel de la fonctionnalité d'infos ici: http://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html

Si vous êtes en mesure d'utiliser le SDK, vous serez mieux lotis, même Chris Banes a écrit un post, ce qui suggère la même chose.

22voto

laalto Points 50581

La bibliothèque ActionBar-PullToRefresh de Chris Banes sur GitHub offre probablement une fonctionnalité d'extraction à rafraîchir la plus proche de l'application GMail.

Voir aussi: analyse de Juhani Lehtimäki sur GMail en mode «pull-to-refresh» .

8voto

Rakesh Rangani Points 479

essayez ceci ... c'est un travail pour moi.

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

        }
   }
 

3voto

sonida Points 1578

Chris Banes (le même gars qui a implémenté le meilleur composant pour extraire le rafraîchissement pour Android) a également implémenté le GMail comme Pull To Refresh.

Vous pouvez le trouver ici: https://github.com/chrisbanes/ActionBar-PullToRefresh

Notez que ce projet est toujours en développement et que l’API actuelle peut changer.

1voto

App Kart Points 128
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;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X