Cómo implementar "Deslizar hacia abajo para actualizar" como en la nueva aplicación de GMail

Google libera la nueva aplicación de Gmail con una forma alternativa de manejar la función de despliegue hacia abajo para actualizar.

En lugar de mostrar la fila oculta iniciada que se tira hacia abajo. Gmail muestra un mensaje animado encima de la barra de acción.

El mensaje incluye una línea horizontal animada.

¿Es esta una característica estándar del SDK de Android? No puedo encontrar nada en la API de barra de acciones que haría esto.

Introduzca aquí la descripción de la imagen

La biblioteca de ActionBar-PullToRefresh de Chris Banes en GitHub probablemente ofrece funcionalidad pull-to-refresh más cercana a la aplicación de GMail.

Véase también: Análisis de Juhani Lehtimäki de GMail pull-to-refresh .

Google ha lanzado soporte para esto directamente en el SDK. No estoy seguro de la versión que necesita para apoyar (que puede ser un problema).

Echa un vistazo a la funcionalidad oficial SDK información aquí: http://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html

Si usted es capaz de usar el SDK uno, estará mejor, incluso Chris Banes escribió un post , sugiriendo lo mismo.

Prueba esto … es trabajo para mí.

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

Chris Banes (el mismo tipo que implementó el mejor tirón para actualizar el componente para Android) también implementó el Gmail como Pull To Refresh.

Puede encontrarlo aquí: https://github.com/chrisbanes/ActionBar-PullToRefresh

Tenga en cuenta que este proyecto aún está en desarrollo para que la API actual pueda cambiar.

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

Pruébalo. Usando: swipeRefreshLayout.setRotation (180f);

Y en su adaptador ListView, método getView: view.setRotation (180f);

Invierta el orden de sus artículos en la lista.

O usando directamente android: rotation = "180" en xml.

  • Problema mientras se desplaza Vista de lista con Pull to Refresh
  • Android Pull-to-Refresh con Fragmento ListView y Adaptador ListView personalizado
  • La aplicación arroja java.lang.StackOverflowError Excepción en la actividad
  • Implementación de la atracción de Chris Banes para actualizar junto con desplazamiento horizontal en la vista de lista
  • ¿Funciona PullToRefresh con FragmentPagerAdapter?
  • Chris Banes PullToRefreshListView con el error del adaptador personalizado
  • Android - ¿cómo puedo saber cuando gridview ha llegado al fondo?
  • Xamarin Forms ListView Programatic Refresh No se detiene en Android cuando se carga la página
  • Cómo implementar pull para actualizar en un ListFragment
  • Refrescante adaptador al tirar de ListView en android
  • Lista de PullToRefresh con el encabezado de sección fijado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.