前篇已經講過安卓自帶刷新控件沒有上拉加載需要自己自定義相關控件才能實現。先看下效果 xml布局如下:
上面代碼中有一個底部布局,可以自己定義就不黏貼上來了 記下來具體界面中調用給接口方法
package com.example.swiperefresh4listview;import java.util.ArrayList;import java.util.List;import java.util.Random;import com.example.swiperefresh4listview.Swiperefresh4ListView.OnLoadListener;import android.os.Bundle;import android.os.Handler;import android.support.v4.widget.SwipeRefreshLayout;import android.support.v7.app.AppCompatActivity;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;/** * 使用谷歌提供的SwipeRefreshLayout下拉控件進行下拉刷新和上拉加載 */public class MainActivity extends AppCompatActivity { private List<String> mList; private int mCount; private ArrayAdapter<String> mAdapter; private Swiperefresh4ListView swipeRefreshView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initUI(); reFresh(); } private void initUI() { swipeRefreshView = (Swiperefresh4ListView) findViewById(R.id.srl); ListView listView = (ListView) findViewById(R.id.lv); // 設置適配器數據 mList = new ArrayList<>(); for (int i = 0; i < 30; i++) { mList.add("我是laohu" + i + "號"); mCount++; } mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mList); listView.setAdapter(mAdapter); } private void reFresh() { // 設置顏色屬性的時候一定要注意是引用了資源文件還是直接設置16進制的顏色,因為都是int值容易搞混 // 設置下拉進度的背景顏色,默認就是白色的 swipeRefreshView.setProgressBackgroundColorSchemeResource(android.R.color.white); // 設置下拉進度的主題顏色 swipeRefreshView.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark); // 設置刷新出現的位置 swipeRefreshView.setProgressViewEndTarget(false,200); // 設置向下拉多少出現刷新 swipeRefreshView.setDistanceToTriggerSync(30); // 下拉時觸發SwipeRefreshLayout的下拉動畫,動畫完畢之后就會回調這個方法 swipeRefreshView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //默認會自動刷新無需調用這個屬性setRefreshing(boolean d) // 這里是主線程一些比較耗時的操作,比如聯網獲取數據,需要放到子線程去執行 final Random random = new Random(); new Handler().postDelayed(new Runnable() { @Override public void run() {// 刷新數據在這里 mList.add(0, "我是天才" + random.nextInt(100) + "號"); mAdapter.notifyDataSetChanged(); Toast.makeText(MainActivity.this, "刷新了一條數據", Toast.LENGTH_SHORT).show(); // 加載完數據設置為不刷新狀態,將下拉進度收起來 swipeRefreshView.setRefreshing(false); } }, 1200); // 這個不能寫在外邊,不然會直接收起來 // swipeRefreshLayout.setRefreshing(false); } }); // 設置下拉加載更多 swipeRefreshView.setOnLoadListener(new OnLoadListener() { @Override public void onLoad() { // TODO Auto-generated method stub new Handler().postDelayed(new Runnable() { @Override public void run() { // 添加數據 for (int i = 30; i < 35; i++) { mList.add("我是小胡" + i + "號"); // 這里要放在里面刷新,放在外面會導致刷新的進度條卡住 mAdapter.notifyDataSetChanged(); } Toast.makeText(MainActivity.this, "數據加載完成", Toast.LENGTH_SHORT).show(); // 加載完數據隱藏掉上拉加載布局 swipeRefreshView.setLoading(false); } }, 1200); } }); }}思考:使用官方的下拉刷新可以實現自定義下拉刷新樣式嗎? 好的,上拉加載已經實現,后面在實際刷新過程中,發現一個問題,就是下拉刷新在刷新過程中,如果下拉界面過短或者刷新顯示時常短,上拉到底部的時候,兩個會一起顯示,一個小bug,有待解決,還是第三方刷新比較好用。哪位大神看到能指導一二,以上代碼參考了網上資源,感謝各位大神分享。
新聞熱點
疑難解答