標籤:
昨天,測試人員提了一個Bug,說是只要來回的點擊同一個Tab按鈕,載入的資料就會重複,檢查代碼檢查了好長時間也沒有發現有啥問題,於是就打斷點調試,發現本來是執行的pullToRefreshListView.setRefreshing(); 自以為是執行的重新整理操作(其實也就是重新整理操作,只不過上拉是重新整理,下拉也是重新整理,我們做的時候是把上拉重新整理改成載入更多了),其實該控制項並不能判斷出來目前執行的操作是下拉重新整理還是上拉載入更多,這就需要自訂一個布爾變數isAutoRefresh,通過它來識別是不是下拉重新整理的動作,下面給出實現的源碼:
public class MyTopicFragment extends Fragment implements MyTopicObserver,OnItemClickListener, OnRefreshListener<ListView>,OnLastItemVisibleListener {private int mType = 0;private PullToRefreshListView pullToRefreshListView;private ListView actualListView;private MyTopicListAdapter myTopicListAdapter;private Context mContext;private MyTopicLogic logic;private int currentPageCount = 0; // 記錄當前為第幾頁private int totalPageCount; // 記錄總頁數private boolean isRefreshAction;// 標誌是否是下拉重新整理private MyTopicEntity mMyTopicEntity;private LinearLayout promptView;// 無任何話題的時候顯示的提示private LinearLayout mLoadingHint = null;private LinearLayout mAfterLodingHint = null;private ImageView mHintImage = null;private TextView mHintTxt = null;private boolean isAutoRefresh = false;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {Bundle args = this.getArguments();mType = args.getInt("type");mContext = this.getActivity();logic = new MyTopicLogic();logic.addObserver(this);View rootView = inflater.inflate(R.layout.fragment_pulltorefresh_listview, container, false);initialize(rootView);return rootView;}private void initialize(View rootView) {pullToRefreshListView = (PullToRefreshListView) rootView.findViewById(R.id.fragment_pulltorefresh_listview);myTopicListAdapter = new MyTopicListAdapter();actualListView = pullToRefreshListView.getRefreshableView();registerForContextMenu(actualListView);actualListView.setAdapter(myTopicListAdapter);pullToRefreshListView.setMode(Mode.BOTH);pullToRefreshListView.getLoadingLayoutProxy(false, true).setPullLabel(getString(R.string.poll_refresh_down_loadmore));pullToRefreshListView.getLoadingLayoutProxy(false, true).setRefreshingLabel(getString(R.string.poll_refresh_down_refreshing));pullToRefreshListView.getLoadingLayoutProxy(false, true).setReleaseLabel(getString(R.string.poll_refresh_down_release));pullToRefreshListView.getLoadingLayoutProxy(false, true).setLastUpdatedLabel("");pullToRefreshListView.setOnRefreshListener(this);pullToRefreshListView.setOnLastItemVisibleListener(this);pullToRefreshListView.setOnItemClickListener(this);mMyTopicEntity = HealthApplication.mAPPCache.getMyTopic(mType);if (mMyTopicEntity != null && mMyTopicEntity.getData() != null) {myTopicListAdapter.refresh(mMyTopicEntity.getData().getData());currentPageCount = 1;}promptView = (LinearLayout) LayoutInflater.from(mContext).inflate(R.layout.net_request_prompt, null);pullToRefreshListView.setEmptyView(promptView);if (mType == 1) {// 預設全部顯示我發布的話題mHandler.sendEmptyMessageDelayed(1, 500);//logic.getMyTopic(10, 1, mType, "time");}/* * else if(mType == 2){ logic.getMyTopic(10, 1, mType, "time"); }else * if(mType == 3){ logic.getMyTopic(10, 1, mType, "time"); } */// mType = 1;//設定為1,只要是進入我發布的,還沒有點擊過我回複的和我收藏的,重新整理操作將會執行我發布的話題}Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case 1://pullToRefreshListView.setCurrentModeRefreash();isAutoRefresh = true;pullToRefreshListView.setRefreshing();break;default:break;}}};@Overridepublic void onPause() {logic.removeObserver(this);super.onPause();}@Overridepublic void onResume() {if (logic.getObservers().size() == 0) {logic.addObserver(this);}super.onResume();}@Overridepublic void onItemClick(AdapterView<?> listView, View itemView,int position, long itemViewId) {MyTopicDetail item = (MyTopicDetail) myTopicListAdapter.getItem(position - 1);Intent intent = new Intent(mContext, TopicDetailActivity.class);intent.putExtra("topicId", item.getId());startActivityForResult(intent, 18);}@Overridepublic void onLastItemVisible() {if (pullToRefreshListView.getMode() == Mode.PULL_FROM_START) {// Toast.makeText(mContext, "沒有更多話題了", Toast.LENGTH_SHORT).show();}}@Overridepublic void onRefresh(PullToRefreshBase<ListView> refreshView) {if (refreshView.isHeaderShown() || isAutoRefresh) {isAutoRefresh = false;isRefreshAction = true;logic.getMyTopic(10, 1, mType, "time");} else {isRefreshAction = false;logic.getMyTopic(10, currentPageCount + 1, mType, "time");}}public void refresh(int type) {isRefreshAction = true;mType = type;mHandler.sendEmptyMessageDelayed(1, 500);//logic.getMyTopic(10, 1, mType, "time");}private class MyTopicListAdapter extends BaseAdapter {private ArrayList<MyTopicDetail> mList;public MyTopicListAdapter() {mList = new ArrayList<MyTopicDetail>();}public void refresh(ArrayList<MyTopicDetail> arrayList) {mList.clear();mList = arrayList;notifyDataSetChanged();}public void add(ArrayList<MyTopicDetail> arrayList) {mList.addAll(arrayList);notifyDataSetChanged();}public void clear() {mList.clear();notifyDataSetChanged();}@Overridepublic int getCount() {return mList.size();}@Overridepublic Object getItem(int position) {return mList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder = null;if (convertView == null) {LayoutInflater inflater = LayoutInflater.from(mContext);convertView = inflater.inflate(R.layout.mytopic_list_item, null);viewHolder = new ViewHolder();viewHolder.topicName = (TextView) convertView.findViewById(R.id.tv_topic_name);viewHolder.topicContent = (TextView) convertView.findViewById(R.id.tv_topic_content);viewHolder.coloumnName = (TextView) convertView.findViewById(R.id.column);viewHolder.topicTime = (TextView) convertView.findViewById(R.id.sendtime);viewHolder.topicGoodCnt = (TextView) convertView.findViewById(R.id.tv_good);viewHolder.topicReplyCnt = (TextView) convertView.findViewById(R.id.tv_replay);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}MyTopicDetail item = (MyTopicDetail) getItem(position);if (item.getTitle().length() > 30) {String str = item.getTitle().substring(0, 30);viewHolder.topicName.setText(str + "...");} else {viewHolder.topicName.setText(item.getTitle());}if (item.getContent().length() > 80) {String temp = (item.getContent().substring(0, 80));viewHolder.topicContent.setText(temp + "...");} else {viewHolder.topicContent.setText(item.getContent());}if (item.getSectname().length() > 8) {String temp = (item.getSectname().substring(0, 6));viewHolder.coloumnName.setText(temp + "...");} else {viewHolder.coloumnName.setText(item.getSectname());}viewHolder.topicTime.setText(item.getCreate_time());viewHolder.topicGoodCnt.setText(item.getGoodcnt() + "");viewHolder.topicReplyCnt.setText(item.getDiscusscnt() + "");return convertView;}private class ViewHolder {public TextView topicName;// 話題名稱public TextView topicContent;// 話題內容public TextView coloumnName;// 專欄名字public TextView topicTime;// 話題時間public TextView topicGoodCnt;// 贊的個數public TextView topicReplyCnt;// 回複的個數}}@Overridepublic void onGetMyTopicSuccess(MyTopicEntity result) {pullToRefreshListView.onRefreshComplete();if (result.getData() == null) {showPromptView(false, getString(R.string.topic_nodata), 1);myTopicListAdapter.clear();pullToRefreshListView.setMode(Mode.BOTH);currentPageCount = 0;HealthApplication.mAPPCache.setMyTopic(mType, "");showPromptView(false, getResources().getString(R.string.temp_no_data), 1);}totalPageCount = result.getData().getPagecount();if (isRefreshAction) {myTopicListAdapter.refresh(result.getData().getData());currentPageCount = 1;String label = DateUtils.formatDateTime(mContext,System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME| DateUtils.FORMAT_SHOW_DATE| DateUtils.FORMAT_ABBREV_ALL);pullToRefreshListView.getLoadingLayoutProxy(true, false).setLastUpdatedLabel(label);if (1 == totalPageCount) {pullToRefreshListView.setMode(Mode.PULL_FROM_START);} else {pullToRefreshListView.setMode(Mode.BOTH);}} else {myTopicListAdapter.add(result.getData().getData());currentPageCount++;if (currentPageCount >= totalPageCount) {pullToRefreshListView.setMode(Mode.PULL_FROM_START);}}}@Overridepublic void onGetMyTopicFailed(int errorCode, String msg) {pullToRefreshListView.onRefreshComplete();if(errorCode == 17){showPromptView(false, getString(R.string.topic_nodata), 1);myTopicListAdapter.clear();pullToRefreshListView.setMode(Mode.BOTH);currentPageCount = 0;HealthApplication.mAPPCache.setMyTopic(mType, "");showPromptView(false, getResources().getString(R.string.temp_no_data), 1);}else {HaloToast.show(mContext, msg);showPromptView(false, getResources().getString(R.string.req_fail_click_refresh), 2);}}/** * 載入及載入之後的提示 * * @param isProgressShow * 是否顯示進度框 * @param text * 顯示的文字 * @param type * 控制顯示哪一個布局:0標識顯示正在載入,1標識請求成功,但是暫無資料,2標識請求失敗 */private void showPromptView(boolean isProgressShow, String text, int type) {mAfterLodingHint = (LinearLayout) promptView.findViewById(R.id.after_loding_hint_layout);mLoadingHint = (LinearLayout) promptView.findViewById(R.id.loding_hint);mHintImage = (ImageView) promptView.findViewById(R.id.hint_image);mHintTxt = (TextView) promptView.findViewById(R.id.hint_txt);View progressBar = promptView.findViewById(R.id.net_request_prompt_progressBar);TextView promptTextView = (TextView) promptView.findViewById(R.id.net_request_prompt_textView);promptView.setClickable(false);if (type == 0) {mLoadingHint.setVisibility(View.VISIBLE);mAfterLodingHint.setVisibility(View.GONE);if (isProgressShow) {progressBar.setVisibility(View.VISIBLE);} else {progressBar.setVisibility(View.GONE);}promptTextView.setText(text);} else if (type == 1) {mLoadingHint.setVisibility(View.GONE);mHintImage.setClickable(false);mHintImage.setImageResource(R.drawable.no_data);mHintTxt.setText(text);mAfterLodingHint.setVisibility(View.VISIBLE);} else if (type == 2) {promptView.setClickable(true);mLoadingHint.setVisibility(View.GONE);mHintImage.setImageResource(R.drawable.click_refresh_selector);mHintTxt.setText(text);mHintImage.setClickable(true);mHintImage.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {logic.getMyTopic(10, 1, mType, "time");}});mAfterLodingHint.setVisibility(View.VISIBLE);}}@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {if(requestCode == 18 && resultCode == getActivity().RESULT_OK){isRefreshAction = true;logic.getMyTopic(10, 1, mType, "time");}super.onActivityResult(requestCode, resultCode, data);}}
安卓PullToRefresh自動下拉載入重新整理實現