Как использовать SwipeRefreshLayout?

Задний план

Недавно Google опубликовала обновление в своей библиотеке поддержки , которая теперь имеет новое представление « SwipeRefreshLayout ».

Представление позволяет обернуть еще один вид, поддерживая покадрование, чтобы выполнить операцию обновления.

Скриншот:

Введите описание изображения здесь

Проблема

Google не предоставил образец (по крайней мере, не тот, который я могу найти, пока), поэтому я попытался использовать его сам.

Сначала я получал сбой (NPE) всякий раз, когда я менял, но потом я узнал, что это потому, что я не предоставил для него «OnRefreshListener».

Но я до сих пор не понимаю, как его использовать, не говоря уже о его настройке

Вот 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: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> 

Код, хотя он не делает ничего особенного:

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

Вопрос

Каков правильный способ использования этого представления?

Как его настроить? В настоящее время это просто черная линия …

Solutions Collecting From Web of "Как использовать SwipeRefreshLayout?"

Dunno, что этот класс ActionBarActivity который вы распространяете, но я отлично его работаю, используя 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); } } 

Стоит отметить, что я скопировал ваш xml-макет точно так, как он есть

Что касается настройки, вы действительно не можете сделать ничего, кроме изменения цвета цветной полосы, вызвав setColorScheme (int colorResId, int colorResId, int colorResId, int colorResId);

например

 <?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);

Это действительно разочаровывающее дополнение. Чувствительность при освещении довольно высока, и нет необходимости изменять ее

редактировать

Я написал это, когда этот класс (и класс ActionBarActivity ) только что был добавлен в sdk. Таким образом, некоторые вещи изменились, когда я написал этот ответ. Кроме того, тип действия, который вы используете, не должен влиять на это решение.

setColorScheme теперь устарел, вместо этого следует использовать setColorSchemeResources(int... colorResIds) . (Вы можете поместить столько цветов, сколько хотите).

setDistanceToTriggerSync(int distance) также может использоваться для определения того, насколько далеко пользователь должен прокрутить, чтобы вызвать обновление.

Я рекомендую проверить официальную документацию, чтобы узнать, что еще может предложить класс.

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> 

Вы можете просто следовать ниже метода (я использую swipelayout в расширяемом списке) 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> 1 <?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> 

Используемые цвета

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

Вы можете установить swipeView.setRefreshing(false); На false или true в соответствии с вашим требованием, этот механизм очистки будет работать на уровне API всех Android