¿Cómo usar SwipeRefreshLayout?

Fondo

Google ha publicado recientemente una actualización de su biblioteca de soporte , que ahora tiene una nueva vista " SwipeRefreshLayout ".

La vista permite armar otra vista, mientras soporta el desplazamiento hacia abajo para realizar una operación de actualización.

captura de pantalla:

Introduzca aquí la descripción de la imagen

El problema

Google no ha proporcionado una muestra (al menos no una que pueda encontrar, todavía), así que he intentado usarla yo mismo.

Al principio me dieron un accidente (NPE) cada vez que pasé, pero luego he descubierto que es porque no he proporcionado un "OnRefreshListener" para ello.

Pero todavía no entiendo cómo usarlo, y mucho menos personalizarlo

Aquí está el XML del archivo de diseño:

<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:context="com.example.swiperefreshlayouttest.MainActivity" tools:ignore="MergeRootFrame" > <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TTT" android:textSize="40sp" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TTT" android:textSize="40sp" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TTT" android:textSize="40sp" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TTT" android:textSize="40sp" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TTT" android:textSize="40sp" /> </LinearLayout> </ScrollView> </android.support.v4.widget.SwipeRefreshLayout> 

Código, aunque no hace nada especial en absoluto:

 public class MainActivity extends ActionBarActivity { @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final SwipeRefreshLayout swipeRefreshLayout=(SwipeRefreshLayout)findViewById(R.id.container); swipeRefreshLayout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { // do nothing } }); } } 

La pregunta

¿Cuál es la forma correcta de usar esta vista?

¿Cómo lo personalizo? Actualmente es sólo una línea negra …

Dunno qué clase de ActionBarActivity que está extendiendo es, pero lo conseguí trabajando muy bien usando un FragmentActivity

 public class ActivityMain extends FragmentActivity implements OnRefreshListener { private SwipeRefreshLayout mSwipeRefreshLayout; @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.container); mSwipeRefreshLayout.setOnRefreshListener(this); super.onCreate(savedInstanceState); } @Override public void onRefresh() { Toast.makeText(this, "Refresh", Toast.LENGTH_SHORT).show(); new Handler().postDelayed(new Runnable() { @Override public void run() { mSwipeRefreshLayout.setRefreshing(false); } }, 2000); } } 

Vale la pena señalar copia copié su diseño xml exactamente como es

En términos de personalización, realmente no hay mucho que puedas hacer aparte de cambiar el color de la barra de color llamando a setColorScheme (int colorResId, int colorResId, int colorResId, int colorResId);

p.ej

 <?xml version="1.0" encoding="utf-8"?> <resources> <color name="blue">#0099CC</color> <color name="purple">#9933CC</color> <color name="green">#669900</color> <color name="orange">#FF8800</color> </resources> 

mSwipeRefreshLayout.setColorScheme(R.color.blue, R.color.purple, R.color.green, R.color.orange);

Es una especie de adición decepcionante realmente. La sensibilidad en la actualización es bastante alta y no hay ningún ajuste para cambiarlo

Editar

Escribí esto cuando esta clase (y la clase ActionBarActivity ) acababa de ser agregada a la sdk. Como tal, algunas cosas han cambiado desde cuando escribí esta respuesta. Además, el tipo de actividad que utilice no debería afectar a esta solución.

setColorScheme ahora está obsoleto, setColorSchemeResources(int... colorResIds) debe ser utilizado en su lugar. (Usted puede poner tantos ids del color adentro allí como usted tiene gusto).

setDistanceToTriggerSync(int distance) también se puede usar para establecer hasta qué punto un usuario necesita deslizar para desencadenar una actualización.

Recomiendo revisar la documentación oficial para ver qué más la clase tiene para ofrecer.

MainActivity.java

 public class MainActivity extends ActionBarActivity { TextView textView; private SwipeRefreshLayout mSwipeRefreshLayout; static int count = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.scrollTextView); // /You will setup the action bar with pull to refresh layout mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.container); mSwipeRefreshLayout.setColorScheme(R.color.blue, R.color.green, R.color.orange, R.color.purple); mSwipeRefreshLayout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { Log.e(getClass().getSimpleName(), "refresh"); new GetLinks().execute(); } }); } @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); } public class GetLinks extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Void doInBackground(Void... params) { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); //Here you can update the view textView.setText(textView.getText().toString()+"--New Content Added" + ++count); // Notify swipeRefreshLayout that the refresh has finished mSwipeRefreshLayout.setRefreshing(false); } } } 

Activity_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" > <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/scrollTextView" android:text="TTT" android:textSize="40sp" /> </ScrollView> </android.support.v4.widget.SwipeRefreshLayout> 

Colors.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <item name="blue" type="color">#FF33B5E5</item> <item name="purple" type="color">#FFAA66CC</item> <item name="green" type="color">#FF99CC00</item> <item name="orange" type="color">#FFFFBB33</item> </resources> 

Puede simplemente siguiendo el siguiente método (estoy usando swipelayout en la lista expandible) Test.xml

  <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipe2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@id/RelativeTop" android:background="@drawable/listbg" > <ExpandableListView android:id="@+id/lvExp" android:layout_width="fill_parent" android:layout_height="fill_parent" android:cacheColorHint="@android:color/transparent" android:groupIndicator="@null" android:listSelector="@android:color/white" /> </android.support.v4.widget.SwipeRefreshLayout> 

ListHeader.xml

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/sectionbg" android:orientation="horizontal" android:padding="8dp" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:contentDescription="@string/contentdescription" android:src="@drawable/expandbtn" /> <TextView android:id="@+id/lblListHeader" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="3dp" android:text="this is test" android:textColor="@android:color/white" android:textSize="17sp" /> 

ChildItem.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="55dp" android:background="@color/GrayProductBackground" > <TextView android:id="@+id/lblListItem" android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginLeft="35dp" android:layout_marginRight="20dp" android:gravity="center_vertical" android:paddingBottom="5dp" android:textColor="@color/GrayTextProduct" android:textSize="17sp" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignRight="@+id/lblListItem" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:contentDescription="@string/arrowdescription" android:gravity="center" android:src="@drawable/navigationarrow" /> <RelativeLayout android:layout_width="fill_parent" android:layout_height="1dp" android:layout_alignParentBottom="true" android:background="@android:color/white" > </RelativeLayout> 

Colores utilizados

 <color name="pDarkGreen">#8ec549</color> <color name="pDarskSlowGreen">#c1f57f</color> <color name="pLightGreen">#f7ffed</color> <color name="pFullLightGreen">#d6d4d4</color> 

Mainactivity.java

  swipeView = (SwipeRefreshLayout) findViewById(R.id.swipe2); swipeView.setColorSchemeResources(R.color.pDarkGreen, R.color.Gray, R.color.Yellow, R.color.pFullLightGreen); swipeView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { swipeView.setRefreshing(false); } (new Handler()).postDelayed(new Runnable() { @Override public void run() { Log.d("Swipe", "Refreshing Number"); } }, 0); } }); 

Puede configurar swipeView.setRefreshing(false); A falso o verdadero según su requirment este mechanisam swipeing trabajará en androide todo el nivel del API

  • La vista de Recycler no se desplaza correctamente después de implementar el desplazamiento para actualizar el diseño.
  • Estilo SwipeRefreshLayout en r21 de la biblioteca de soporte
  • SyncAdapter siempre en estado pendiente
  • SwipeRefreshLayout con NestedScrollView y LinearLayout
  • Scroll up no funciona con SwipeRefreshLayout en Listview
  • SwipeRefreshLayout: Desplazar la animación de progreso
  • SwipeRefreshLayout en API 21
  • SwipeRefreshLayout con scrollView y Disposición arriba
  • ¿Cuál es la forma correcta de usar la barra de herramientas y SwipeRefreshLayout?
  • Desplazar SwipeRefreshLayout con RecyclerView Actualizar en cualquier lugar de android 2.2
  • SwipeRefreshLayout intercepta con ViewPager
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.