¿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.
- Barra de herramientas que no se muestra con desplazamiento para actualizar
- Cómo ajustar la distancia de golpe hacia abajo en SwipeRefreshLayout?
- Hacer una costumbre SwipeRefreshLayout Indicator?
- SwipeRefreshLayout se congela en la API 4.2.2
- Cuando el fragmento de interruptor con SwipeRefreshLayout durante la actualización, el fragmento se congela pero en realidad todavía funciona
captura de pantalla:
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 …
- Cómo pasar la matriz int de identificadores de recursos de color desde array.xml a SwipeRefreshLayout.setColorSchemeResources
- Desplazamiento hacia abajo activa la actualización en lugar de revelar la barra de herramientas
- Actualizar Actualización de Android Desplácese hasta actualizar
- Indicador de actualización de Android SwipeRefreshLayout no visible
- RecyclerView y SwipeRefreshLayout
- Android SwipeRefreshLayout con TextView vacío no funciona correctamente
- Android: CoordinatorLayout y SwipeRefreshLayout
- Cómo añadir una sugerencia de texto a Android SwipeRefreshLayout
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>
Consulte el siguiente ejemplo: http://developer.android.com/samples/SwipeRefreshLayoutBasic/index.html
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