欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android UI自定義ListView實(shí)現(xiàn)下拉刷新和加載更多效果

 更新時間:2016年11月21日 11:27:04   作者:IT_xiao小巫  
這篇文章主要介紹了Android UI自定義ListView實(shí)現(xiàn)下拉刷新和加載更多效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下

關(guān)于實(shí)現(xiàn)ListView下拉刷新和加載更多的實(shí)現(xiàn),我想網(wǎng)上一搜就一堆。不過我就沒發(fā)現(xiàn)比較實(shí)用的,要不就是實(shí)現(xiàn)起來太復(fù)雜,要不就是不健全的。因為小巫近期要開發(fā)新浪微博客戶端,需要實(shí)現(xiàn)ListView的下拉刷新,所以就想把這個UI整合到項目當(dāng)中去,這里只是一個demo,可以根據(jù)項目的需要進(jìn)行修改。

就不要太在乎界面了哈:



知道你們想要源碼了,去下吧:http://download.csdn.net/detail/wwj_748/6373183

自定義ListView:

package com.markupartist.android.widget; 
 
 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
 
import com.markupartist.android.example.pulltorefresh.R; 
 
import android.content.Context; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.animation.LinearInterpolator; 
import android.view.animation.RotateAnimation; 
import android.widget.AbsListView; 
import android.widget.AbsListView.OnScrollListener; 
import android.widget.ImageView; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.ProgressBar; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
 
 
 
/** 
 * 2013/8/13 
 * 自定義ListView,實(shí)現(xiàn)OnScrollListener接口 
 * 此ListView是為實(shí)現(xiàn)"下拉刷新"和"上拉加載更多"而定制的,具體效果可參考新浪微博、騰訊微博 
 * @author wwj 
 * 
 */ 
public class PullToRefreshListView extends ListView implements OnScrollListener { 
 
  private static final int TAP_TO_REFRESH = 1;      //(未刷新) 
  private static final int PULL_TO_REFRESH = 2;      // 下拉刷新 
  private static final int RELEASE_TO_REFRESH = 3;    // 釋放刷新 
  private static final int REFRESHING = 4;        // 正在刷新 
  private static final int TAP_TO_LOADMORE = 5;      // 未加載更多 
  private static final int LOADING = 6;          // 正在加載 
   
 
  private static final String TAG = "PullToRefreshListView"; 
 
  private OnRefreshListener mOnRefreshListener;      // 刷新監(jiān)聽器 
 
  /** 
   * Listener that will receive notifications every time the list scrolls. 
   */ 
  private OnScrollListener mOnScrollListener;       // 列表滾動監(jiān)聽器 
  private LayoutInflater mInflater;            // 用于加載布局文件 
 
  private RelativeLayout mRefreshHeaderView;       // 刷新視圖(也就是頭部那部分)   
  private TextView mRefreshViewText;           // 刷新提示文本     
  private ImageView mRefreshViewImage;          // 刷新向上向下的那個圖片 
  private ProgressBar mRefreshViewProgress;        // 這里是圓形進(jìn)度條 
  private TextView mRefreshViewLastUpdated;        // 最近更新的文本 
   
  private RelativeLayout mLoadMoreFooterView;       // 加載更多 
  private TextView mLoadMoreText;             // 提示文本 
  private ProgressBar mLoadMoreProgress;         // 加載更多進(jìn)度條 
   
 
  private int mCurrentScrollState;            // 當(dāng)前滾動位置       
  private int mRefreshState;               // 刷新狀態(tài)  
  private int mLoadState;                 // 加載狀態(tài) 
 
  private RotateAnimation mFlipAnimation;         // 下拉動畫 
  private RotateAnimation mReverseFlipAnimation;     // 恢復(fù)動畫 
 
  private int mRefreshViewHeight;             // 刷新視圖高度           
  private int mRefreshOriginalTopPadding;         // 原始上部間隙 
  private int mLastMotionY;                // 記錄點(diǎn)擊位置 
   
  public PullToRefreshListView(Context context) { 
    super(context); 
    init(context); 
  } 
 
  public PullToRefreshListView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context); 
  } 
 
  public PullToRefreshListView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    init(context); 
  } 
 
  private void init(Context context) { 
    // Load all of the animations we need in code rather than through XML 
    /** 定義旋轉(zhuǎn)動畫**/ 
    // 參數(shù):1.旋轉(zhuǎn)開始的角度 2.旋轉(zhuǎn)結(jié)束的角度 3. X軸伸縮模式 4.X坐標(biāo)的伸縮值 5.Y軸的伸縮模式 6.Y坐標(biāo)的伸縮值 
    mFlipAnimation = new RotateAnimation(0, -180, 
        RotateAnimation.RELATIVE_TO_SELF, 0.5f, 
        RotateAnimation.RELATIVE_TO_SELF, 0.5f); 
    mFlipAnimation.setInterpolator(new LinearInterpolator()); 
    mFlipAnimation.setDuration(250);        // 設(shè)置持續(xù)時間 
    mFlipAnimation.setFillAfter(true);       // 動畫執(zhí)行完是否停留在執(zhí)行完的狀態(tài) 
    mReverseFlipAnimation = new RotateAnimation(-180, 0, 
        RotateAnimation.RELATIVE_TO_SELF, 0.5f, 
        RotateAnimation.RELATIVE_TO_SELF, 0.5f); 
    mReverseFlipAnimation.setInterpolator(new LinearInterpolator()); 
    mReverseFlipAnimation.setDuration(250); 
    mReverseFlipAnimation.setFillAfter(true); 
 
    // 獲取LayoutInflater實(shí)例對象 
    mInflater = (LayoutInflater) context.getSystemService( 
        Context.LAYOUT_INFLATER_SERVICE); 
 
    // 加載下拉刷新的頭部視圖 
    mRefreshHeaderView = (RelativeLayout) mInflater.inflate( 
        R.layout.pull_to_refresh_header, this, false); 
    mRefreshViewText = 
      (TextView) mRefreshHeaderView.findViewById(R.id.pull_to_refresh_text); 
    mRefreshViewImage = 
      (ImageView) mRefreshHeaderView.findViewById(R.id.pull_to_refresh_image); 
    mRefreshViewProgress = 
      (ProgressBar) mRefreshHeaderView.findViewById(R.id.pull_to_refresh_progress); 
    mRefreshViewLastUpdated = 
      (TextView) mRefreshHeaderView.findViewById(R.id.pull_to_refresh_updated_at); 
    mLoadMoreFooterView = (RelativeLayout) mInflater.inflate( 
        R.layout.loadmore_footer, this, false); 
    mLoadMoreText = (TextView) mLoadMoreFooterView.findViewById(R.id.loadmore_text); 
    mLoadMoreProgress = (ProgressBar) mLoadMoreFooterView.findViewById(R.id.loadmore_progress); 
     
 
    mRefreshViewImage.setMinimumHeight(50);   // 設(shè)置圖片最小高度 
    mRefreshHeaderView.setOnClickListener(new OnClickRefreshListener()); 
    mRefreshOriginalTopPadding = mRefreshHeaderView.getPaddingTop(); 
    mLoadMoreFooterView.setOnClickListener(new OnClickLoadMoreListener()); 
 
    mRefreshState = TAP_TO_REFRESH;       // 初始刷新狀態(tài) 
    mLoadState = TAP_TO_LOADMORE; 
 
    addHeaderView(mRefreshHeaderView);     // 增加頭部視圖 
    addFooterView(mLoadMoreFooterView);     // 增加尾部視圖 
 
    super.setOnScrollListener(this);     
 
    measureView(mRefreshHeaderView);        // 測量視圖 
    mRefreshViewHeight = mRefreshHeaderView.getMeasuredHeight();  // 得到視圖的高度 
  } 
 
  @Override 
  protected void onAttachedToWindow() { 
    setSelection(1);    // 設(shè)置當(dāng)前選中的項 
  } 
 
  @Override 
  public void setAdapter(ListAdapter adapter) { 
    super.setAdapter(adapter); 
 
    setSelection(1); 
  } 
 
  /** 
   * Set the listener that will receive notifications every time the list 
   * scrolls. 
   * 
   * @param l The scroll listener. 
   */ 
  @Override 
  public void setOnScrollListener(AbsListView.OnScrollListener l) { 
    mOnScrollListener = l; 
  } 
 
  /** 
   * Register a callback to be invoked when this list should be refreshed. 
   * 注冊監(jiān)聽器 
   * @param onRefreshListener The callback to run. 
   */ 
  public void setOnRefreshListener(OnRefreshListener onRefreshListener) { 
    mOnRefreshListener = onRefreshListener; 
  } 
 
  /** 
   * Set a text to represent when the list was last updated. 
   * 設(shè)置一個文本來表示最近更新的列表,顯示的是最近更新列表的時間 
   * @param lastUpdated Last updated at. 
   */ 
  public void setLastUpdated(CharSequence lastUpdated) { 
    if (lastUpdated != null) { 
      mRefreshViewLastUpdated.setVisibility(View.VISIBLE); 
      mRefreshViewLastUpdated.setText("更新于: " + lastUpdated); 
    } else { 
      mRefreshViewLastUpdated.setVisibility(View.GONE); 
    } 
  } 
 
  @Override 
  public boolean onTouchEvent(MotionEvent event) { 
    final int y = (int) event.getY();  // 獲取點(diǎn)擊位置的Y坐標(biāo) 
 
    switch (event.getAction()) { 
      case MotionEvent.ACTION_UP:   // 手指抬起 
        if (!isVerticalScrollBarEnabled()) { 
          setVerticalScrollBarEnabled(true); 
        } 
        if (getFirstVisiblePosition() == 0 && mRefreshState != REFRESHING) { 
          if ((mRefreshHeaderView.getBottom() > mRefreshViewHeight 
              || mRefreshHeaderView.getTop() >= 0) 
              && mRefreshState == RELEASE_TO_REFRESH) { 
            // Initiate the refresh 
            mRefreshState = REFRESHING;   // 刷新狀態(tài) 
            prepareForRefresh(); 
            onRefresh(); 
          } else if (mRefreshHeaderView.getBottom() < mRefreshViewHeight 
              || mRefreshHeaderView.getTop() < 0) { 
            // Abort refresh and scroll down below the refresh view 
            resetHeader(); 
            setSelection(1); 
          } 
        } 
        break; 
      case MotionEvent.ACTION_DOWN: 
        mLastMotionY = y; 
        break; 
      case MotionEvent.ACTION_MOVE: 
        applyHeaderPadding(event); 
        break; 
    } 
    return super.onTouchEvent(event); 
  } 
 
  private void applyHeaderPadding(MotionEvent ev) { 
    final int historySize = ev.getHistorySize(); 
 
    // Workaround for getPointerCount() which is unavailable in 1.5 
    // (it's always 1 in 1.5) 
    int pointerCount = 1; 
    try { 
      Method method = MotionEvent.class.getMethod("getPointerCount"); 
      pointerCount = (Integer)method.invoke(ev); 
    } catch (NoSuchMethodException e) { 
      pointerCount = 1; 
    } catch (IllegalArgumentException e) { 
      throw e; 
    } catch (IllegalAccessException e) { 
      System.err.println("unexpected " + e); 
    } catch (InvocationTargetException e) { 
      System.err.println("unexpected " + e); 
    } 
 
    for (int h = 0; h < historySize; h++) { 
      for (int p = 0; p < pointerCount; p++) { 
        if (mRefreshState == RELEASE_TO_REFRESH) { 
          if (isVerticalFadingEdgeEnabled()) { 
            setVerticalScrollBarEnabled(false); 
          } 
 
          int historicalY = 0; 
          try { 
            // For Android > 2.0 
            Method method = MotionEvent.class.getMethod( 
                "getHistoricalY", Integer.TYPE, Integer.TYPE); 
            historicalY = ((Float) method.invoke(ev, p, h)).intValue(); 
          } catch (NoSuchMethodException e) { 
            // For Android < 2.0 
            historicalY = (int) (ev.getHistoricalY(h)); 
          } catch (IllegalArgumentException e) { 
            throw e; 
          } catch (IllegalAccessException e) { 
            System.err.println("unexpected " + e); 
          } catch (InvocationTargetException e) { 
            System.err.println("unexpected " + e); 
          } 
 
          // Calculate the padding to apply, we divide by 1.7 to 
          // simulate a more resistant effect during pull. 
          int topPadding = (int) (((historicalY - mLastMotionY) 
              - mRefreshViewHeight) / 1.7); 
 
          // 設(shè)置上、下、左、右四個位置的間隙間隙 
          mRefreshHeaderView.setPadding( 
              mRefreshHeaderView.getPaddingLeft(), 
              topPadding, 
              mRefreshHeaderView.getPaddingRight(), 
              mRefreshHeaderView.getPaddingBottom()); 
        } 
      } 
    } 
  } 
 
  /** 
   * Sets the header padding back to original size. 
   * 設(shè)置頭部填充會原始大小 
   */ 
  private void resetHeaderPadding() { 
    mRefreshHeaderView.setPadding( 
        mRefreshHeaderView.getPaddingLeft(), 
        mRefreshOriginalTopPadding, 
        mRefreshHeaderView.getPaddingRight(), 
        mRefreshHeaderView.getPaddingBottom()); 
  } 
 
  /** 
   * Resets the header to the original state. 
   * 重新設(shè)置頭部為原始狀態(tài) 
   */ 
  private void resetHeader() { 
    if (mRefreshState != TAP_TO_REFRESH) { 
      mRefreshState = TAP_TO_REFRESH; 
 
      resetHeaderPadding(); 
 
      // Set refresh view text to the pull label 
      mRefreshViewText.setText(R.string.pull_to_refresh_tap_label); 
      // Replace refresh drawable with arrow drawable 
      mRefreshViewImage.setImageResource(R.drawable.ic_pulltorefresh_arrow); 
      // Clear the full rotation animation 
      mRefreshViewImage.clearAnimation(); 
      // Hide progress bar and arrow. 
      mRefreshViewImage.setVisibility(View.GONE); 
      mRefreshViewProgress.setVisibility(View.GONE); 
    } 
  } 
   
  /** 
   * 重設(shè)ListView尾部視圖為初始狀態(tài) 
   */ 
  private void resetFooter() { 
    if(mLoadState != TAP_TO_LOADMORE) { 
      mLoadState = TAP_TO_LOADMORE; 
       
      // 進(jìn)度條設(shè)置為不可見 
      mLoadMoreProgress.setVisibility(View.GONE); 
      // 按鈕的文本替換為“加載更多” 
      mLoadMoreText.setText(R.string.loadmore_label); 
    } 
     
  } 
   
 
  /** 
   * 測量視圖的大小 
   * @param child 
   */ 
  private void measureView(View child) { 
    ViewGroup.LayoutParams p = child.getLayoutParams(); 
    if (p == null) { 
      p = new ViewGroup.LayoutParams( 
          ViewGroup.LayoutParams.MATCH_PARENT, 
          ViewGroup.LayoutParams.WRAP_CONTENT); 
    } 
 
    int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 
        0 + 0, p.width); 
    int lpHeight = p.height; 
    int childHeightSpec; 
    if (lpHeight > 0) { 
      childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY); 
    } else { 
      childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 
    } 
    child.measure(childWidthSpec, childHeightSpec); 
  } 
 
  @Override 
  public void onScroll(AbsListView view, int firstVisibleItem, 
      int visibleItemCount, int totalItemCount) { 
    // When the refresh view is completely visible, change the text to say 
    // "Release to refresh..." and flip the arrow drawable. 
    if (mCurrentScrollState == SCROLL_STATE_TOUCH_SCROLL 
        && mRefreshState != REFRESHING) { 
      if (firstVisibleItem == 0) {    // 如果第一個可見條目為0 
        mRefreshViewImage.setVisibility(View.VISIBLE); // 讓指示箭頭變得可見 
        /**如果頭部視圖相對與父容器的位置大于其自身高度+20或者頭部視圖的頂部位置>0,并且要在刷新狀態(tài)不等于"釋放以刷新"**/ 
        if ((mRefreshHeaderView.getBottom() > mRefreshViewHeight + 20 
            || mRefreshHeaderView.getTop() >= 0) 
            && mRefreshState != RELEASE_TO_REFRESH) { 
          mRefreshViewText.setText(R.string.pull_to_refresh_release_label);// 設(shè)置刷新文本為"Release to refresh..." 
          mRefreshViewImage.clearAnimation();         // 清除動畫  
          mRefreshViewImage.startAnimation(mFlipAnimation);  // 啟動動畫 
          mRefreshState = RELEASE_TO_REFRESH;         // 更改刷新狀態(tài)為“釋放以刷新" 
        } else if (mRefreshHeaderView.getBottom() < mRefreshViewHeight + 20 
            && mRefreshState != PULL_TO_REFRESH) { 
          mRefreshViewText.setText(R.string.pull_to_refresh_pull_label);// 設(shè)置刷新文本為"Pull to refresh..." 
          if (mRefreshState != TAP_TO_REFRESH) { 
            mRefreshViewImage.clearAnimation(); 
            mRefreshViewImage.startAnimation(mReverseFlipAnimation); 
          } 
          mRefreshState = PULL_TO_REFRESH; 
        } 
      } else { 
        mRefreshViewImage.setVisibility(View.GONE);     // 讓刷新箭頭不可見 
        resetHeader(); // 重新設(shè)置頭部為原始狀態(tài) 
      } 
    } else if (mCurrentScrollState == SCROLL_STATE_FLING 
        && firstVisibleItem == 0 
        && mRefreshState != REFRESHING) { 
      setSelection(1); 
    } 
 
    if (mOnScrollListener != null) { 
      mOnScrollListener.onScroll(view, firstVisibleItem, 
          visibleItemCount, totalItemCount); 
    } 
  } 
 
  @Override 
  public void onScrollStateChanged(AbsListView view, int scrollState) { 
    mCurrentScrollState = scrollState; 
 
    if (mOnScrollListener != null) { 
      mOnScrollListener.onScrollStateChanged(view, scrollState); 
    } 
  } 
   
 
  /**為刷新做準(zhǔn)備**/ 
  public void prepareForRefresh() { 
    resetHeaderPadding();     
 
    mRefreshViewImage.setVisibility(View.GONE);     // 去掉刷新的箭頭 
    // We need this hack, otherwise it will keep the previous drawable. 
    mRefreshViewImage.setImageDrawable(null); 
    mRefreshViewProgress.setVisibility(View.VISIBLE);  // 圓形進(jìn)度條變?yōu)榭梢?
 
    // Set refresh view text to the refreshing label 
    mRefreshViewText.setText(R.string.pull_to_refresh_refreshing_label); 
 
    mRefreshState = REFRESHING; 
  } 
   
  /**為加載更多做準(zhǔn)備**/ 
  public void prepareForLoadMore() { 
    mLoadMoreProgress.setVisibility(View.VISIBLE);   
    mLoadMoreText.setText(R.string.loading_label); 
    mLoadState = LOADING; 
  } 
 
  public void onRefresh() { 
    Log.d(TAG, "onRefresh"); 
 
    if (mOnRefreshListener != null) { 
      mOnRefreshListener.onRefresh(); 
    } 
  } 
   
  public void OnLoadMore() { 
    Log.d(TAG, "onLoadMore"); 
    if(mOnRefreshListener != null) { 
      mOnRefreshListener.onLoadMore(); 
    } 
  } 
 
  /** 
   * Resets the list to a normal state after a refresh. 
   * @param lastUpdated Last updated at. 
   */ 
  public void onRefreshComplete(CharSequence lastUpdated) { 
    setLastUpdated(lastUpdated);  // 顯示更新時間 
    onRefreshComplete(); 
  } 
 
  /** 
   * Resets the list to a normal state after a refresh. 
   */ 
  public void onRefreshComplete() {     
    Log.d(TAG, "onRefreshComplete"); 
 
    resetHeader(); 
 
    // If refresh view is visible when loading completes, scroll down to 
    // the next item. 
    if (mRefreshHeaderView.getBottom() > 0) { 
      invalidateViews(); 
      setSelection(1); 
    } 
  } 
   
  public void onLoadMoreComplete() { 
    Log.d(TAG, "onLoadMoreComplete"); 
    resetFooter(); 
  } 
 
  /** 
   * Invoked when the refresh view is clicked on. This is mainly used when 
   * there's only a few items in the list and it's not possible to drag the 
   * list. 
   * 點(diǎn)擊刷新 
   */ 
  private class OnClickRefreshListener implements OnClickListener { 
 
    @Override 
    public void onClick(View v) { 
      if (mRefreshState != REFRESHING) { 
        prepareForRefresh(); 
        onRefresh(); 
      } 
    } 
 
  } 
   
  /** 
   * 
   * @author wwj 
   * 加載更多 
   */ 
  private class OnClickLoadMoreListener implements OnClickListener { 
 
    @Override 
    public void onClick(View v) { 
      if(mLoadState != LOADING) { 
        prepareForLoadMore(); 
        OnLoadMore(); 
      } 
    } 
  } 
 
  /** 
   * Interface definition for a callback to be invoked when list should be 
   * refreshed. 
   * 接口定義一個回調(diào)方法當(dāng)列表應(yīng)當(dāng)被刷新 
   */ 
  public interface OnRefreshListener { 
    /** 
     * Called when the list should be refreshed. 
     * 當(dāng)列表應(yīng)當(dāng)被刷新是調(diào)用這個方法 
     * <p> 
     * A call to {@link PullToRefreshListView #onRefreshComplete()} is 
     * expected to indicate that the refresh has completed. 
     */ 
    public void onRefresh(); 
     
    public void onLoadMore(); 
  } 
} 

使用方法:

package com.markupartist.android.example.pulltorefresh; 
 
import java.text.SimpleDateFormat; 
import java.util.Arrays; 
import java.util.Date; 
import java.util.LinkedList; 
 
import android.app.Activity; 
import android.content.Context; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 
 
import com.markupartist.android.widget.PullToRefreshListView; 
import com.markupartist.android.widget.PullToRefreshListView.OnRefreshListener; 
 
public class PullToRefreshActivity extends Activity { 
  private LinkedList<String> mListItems; 
  public static PullToRefreshListView weiboListView; 
 
  /** Called when the activity is first created. */ 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.pull_to_refresh); 
    weiboListView = (PullToRefreshListView) findViewById(R.id.weibolist); 
 
    // Set a listener to be invoked when the list should be refreshed. 
    weiboListView.setOnRefreshListener(new OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
        // Do work to refresh the list here. 
        new GetDataTask(PullToRefreshActivity.this, 0).execute(); 
      } 
 
      @Override 
      public void onLoadMore() { 
        new GetDataTask(PullToRefreshActivity.this, 1).execute(); 
      } 
    }); 
 
    mListItems = new LinkedList<String>(); 
    mListItems.addAll(Arrays.asList(mStrings)); 
 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
        android.R.layout.simple_list_item_1, mListItems); 
 
    weiboListView.setAdapter(adapter); 
  } 
 
  private class GetDataTask extends AsyncTask<Void, Void, String[]> { 
    private Context context; 
    private int index; 
 
    public GetDataTask(Context context, int index) { 
      this.context = context; 
      this.index = index; 
    } 
 
    @Override 
    protected String[] doInBackground(Void... params) { 
      // Simulates a background job. 
      try { 
        Thread.sleep(2000); 
      } catch (InterruptedException e) { 
        ; 
      } 
      return mStrings; 
    } 
 
    @Override 
    protected void onPostExecute(String[] result) { 
      if (index == 0) { 
        // 將字符串“Added after refresh”添加到頂部 
        mListItems.addFirst("Added after refresh..."); 
 
        SimpleDateFormat format = new SimpleDateFormat( 
            "yyyy年MM月dd日 HH:mm"); 
        String date = format.format(new Date()); 
        // Call onRefreshComplete when the list has been refreshed. 
        weiboListView.onRefreshComplete(date); 
      } else if (index == 1) { 
        mListItems.addLast("Added after loadmore..."); 
        weiboListView.onLoadMoreComplete(); 
      } 
 
      super.onPostExecute(result); 
    } 
  } 
 
  public static String[] mStrings = { "一條微博", "兩條微博", "三條微博", "四條微博", "五條微博", 
      "六條微博", "七條微博", "八條微博", "九條微博", "十條微博", "十一條微博", "十二條微博" }; 
 
} 

下拉刷新的那個頭部布局
/2013.08.22_PullToRefresh_ListView_Demo/res/layout/pull_to_refresh_header.xml

<?xml version="1.0" encoding="utf-8"?> 
<!-- 
   Copyright (C) 2011 Johan Nilsson <http://markupartist.com> 
 
   Licensed under the Apache License, Version 2.0 (the "License"); 
   you may not use this file except in compliance with the License. 
   You may obtain a copy of the License at 
 
     http://www.apache.org/licenses/LICENSE-2.0 
 
   Unless required by applicable law or agreed to in writing, software 
   distributed under the License is distributed on an "AS IS" BASIS, 
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
   See the License for the specific language governing permissions and 
   limitations under the License. 
--> 
 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent" 
  android:gravity="center" 
  android:paddingBottom="15dip" 
  android:paddingTop="10dip" > 
 
  <!-- 小型圓形進(jìn)度條,初始為不可見 --> 
 
  <ProgressBar 
    android:id="@+id/pull_to_refresh_progress" 
    style="?android:attr/progressBarStyleSmall" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:layout_marginLeft="30dip" 
    android:layout_marginRight="20dip" 
    android:layout_marginTop="10dip" 
    android:indeterminate="true" 
    android:visibility="gone" /> 
  <!-- 下拉刷新的那個箭頭 --> 
 
  <ImageView 
    android:id="@+id/pull_to_refresh_image" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:layout_marginLeft="30dip" 
    android:layout_marginRight="20dip" 
    android:gravity="center" 
    android:src="@drawable/ic_pulltorefresh_arrow" 
    android:visibility="gone" /> 
  <!-- 下拉刷新的提示文本 --> 
 
  <TextView 
    android:id="@+id/pull_to_refresh_text" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:gravity="center" 
    android:paddingTop="5dip" 
    android:text="@string/pull_to_refresh_tap_label" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:textStyle="bold" /> 
 
  <TextView 
    android:id="@+id/pull_to_refresh_updated_at" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/pull_to_refresh_text" 
    android:layout_gravity="center" 
    android:gravity="center" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:visibility="gone" /> 
 
</RelativeLayout> 

加載更多的底部布局
/2013.08.22_PullToRefresh_ListView_Demo/res/layout/loadmore_footer.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:id="@+id/loadmore_layout" 
  android:layout_width="match_parent" 
  android:layout_height="wrap_content" 
  android:gravity="center" 
  android:paddingBottom="15dip" 
  android:paddingTop="10dip" > 
 
<!--   <Button 
    android:id="@+id/loadmore_btn" 
    android:layout_width="match_parent" 
    android:layout_height="60.0dip" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="0.0dip" 
    android:background="@drawable/weibo_list_item_selector" 
    android:text="@string/loadmore_label" 
    android:textColor="@color/loadmore_btn_selector" 
    android:textSize="18.0sp" /> 
 --> 
  <ProgressBar 
    android:id="@+id/loadmore_progress" 
    style="?android:attr/progressBarStyleSmall" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:layout_marginLeft="30dip" 
    android:layout_marginRight="20dip" 
    android:layout_marginTop="10dip" 
    android:indeterminate="true" 
    android:visibility="gone" /> 
 
  <TextView 
    android:id="@+id/loadmore_text" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:gravity="center" 
    android:paddingTop="5dip" 
    android:text="@string/loadmore_label" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:textStyle="bold" /> 
 
</RelativeLayout> 

/2013.08.22_PullToRefresh_ListView_Demo/res/layout/pull_to_refresh.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:orientation="vertical" > 
 
  <!-- 
  The PullToRefreshListView replaces a standard ListView widget. 
    自定義列表在這 
  --> 
 
  <com.markupartist.android.widget.PullToRefreshListView 
    android:id="@+id/weibolist" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"  
    android:cacheColorHint="#00000000" 
    android:fastScrollEnabled="true"/> 
 
</LinearLayout>

 以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • RecyclerView索引溢出異常的解決方法

    RecyclerView索引溢出異常的解決方法

    本篇文章主要介紹了RecyclerView索引溢出異常的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 使用DrawerLayout完成滑動菜單的示例代碼

    使用DrawerLayout完成滑動菜單的示例代碼

    這篇文章主要介紹了使用DrawerLayout完成滑動菜單的示例代碼,代碼簡單易懂,非常不錯,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Android MaterialCardView的使用介紹與示例

    Android MaterialCardView的使用介紹與示例

    MaterialCardView是一個基于Android支持庫中的CardView的可自定義組件。 MaterialCardView提供了CardView的所有功能,但增加了一些自定義屬性,使用起來更加方便實(shí)用
    2021-11-11
  • 安卓中出現(xiàn)過的一些容易被忽略的異常整理

    安卓中出現(xiàn)過的一些容易被忽略的異常整理

    今天小編就為大家分享一篇關(guān)于安卓中出現(xiàn)過的一些容易被忽略的異常整理,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Android?ANR分析trace文件的產(chǎn)生流程詳情

    Android?ANR分析trace文件的產(chǎn)生流程詳情

    這篇文章主要介紹了Android?ANR分析trace文件的產(chǎn)生流程詳情,文章圍繞主題展開相詳細(xì)的內(nèi)容介紹,需要的朋友可以參考一下
    2022-07-07
  • flutter實(shí)現(xiàn)頭部tabTop滾動欄

    flutter實(shí)現(xiàn)頭部tabTop滾動欄

    這篇文章主要為大家詳細(xì)介紹了flutter實(shí)現(xiàn)頭部tabTop滾動欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 用Android Studio3.0新功能加快構(gòu)建速度

    用Android Studio3.0新功能加快構(gòu)建速度

    本文主要介紹了使用Android Studio3.0新功能,加快Android Studio的構(gòu)建速度等相關(guān)做法。
    2017-11-11
  • Android 使用VideoView播放MP4的簡單實(shí)現(xiàn)

    Android 使用VideoView播放MP4的簡單實(shí)現(xiàn)

    這篇文章主要介紹了Android 使用VideoView播放MP4的簡單實(shí)現(xiàn),實(shí)現(xiàn)簡單的播放功能,播放手機(jī)本地的MP4文件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • camera錄制視頻的縮略圖獲取原理心得分享

    camera錄制視頻的縮略圖獲取原理心得分享

    camera錄制的視頻的縮略圖如何獲取,想必有很多的朋友都不會吧,下面與大家分享下獲取的原理,感興趣的你可不要錯過了哈
    2013-06-06
  • Android 開發(fā)延時調(diào)用的幾種方法

    Android 開發(fā)延時調(diào)用的幾種方法

    本篇文章主要介紹Android 延遲, 在Android 程序開發(fā)過程中經(jīng)常會遇到程序推遲時間執(zhí)行,這里整理了幾種方法,以便Android 開發(fā)的朋友參考
    2016-07-07

最新評論