DrawableLayout实现仿QQ侧滑菜单+HttURLConnection_XListView_DrawerLayout_ImageLoader

来源:互联网 发布:avmoo2017最新域名 编辑:程序博客网 时间:2024/06/05 06:05

一. 在MainActivity.java中的代码:

import android.support.v4.app.FragmentActivity;import android.support.v4.view.GravityCompat;import android.support.v4.widget.DrawerLayout;import android.os.Bundle;import android.view.View;import android.view.Window;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.ListView;import android.widget.RelativeLayout;import java.util.ArrayList;import java.util.List;public class MainActivity extends FragmentActivity {    private DrawerLayout drawerlayout;    private ImageView myHeadPhoto;    private FrameLayout framelayout;    private RelativeLayout relative;    private ListView listView;    private List<String> list;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        //抽屉,即侧滑菜单的布局        drawerlayout = (DrawerLayout) findViewById(R.id.drawer_layout);        //主内容区域的布局        framelayout = (FrameLayout) findViewById(R.id.frame_layout);        //菜单选项布局        listView = (ListView) findViewById(R.id.listView);        //抽屉显示的布局        relative = (RelativeLayout) findViewById(R.id.relative);        //点击QQ左侧头像        myHeadPhoto = (ImageView) findViewById(R.id.myHeadPhoto);        //定义集合添加数据        list = new ArrayList<>();        list.add("了解会员特权");        list.add("QQ钱包");        list.add("个性装扮");        list.add("我的收藏");        list.add("我的相册");        list.add("我的文件");        //设置适配器        ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, list);        listView.setAdapter(adapter);        //用户点击头像展示侧滑页的点击事件        myHeadPhoto.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                switch (view.getId()){                    case R.id.myHeadPhoto:                        drawerlayout.openDrawer(GravityCompat.START);                        break;                }            }        });        //条目的点击事件        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {                //要有一个fragment替换后面主内容的frameLayout                NewsFragment newsFragment = new NewsFragment();                //使用Framelayout布局占位                getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout,newsFragment).commit();                //关闭抽屉                drawerlayout.closeDrawer(relative);            }        });    }

二. 自定义的Fragment类代码:

package activity.WeekTwo;import android.os.AsyncTask;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import com.google.gson.Gson;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import Adapter.MyAdapter;import Bean.NewsBean;import view.XListView;public class NewsFragment extends Fragment implements XListView.IXListViewListener{    private List<NewsBean.ResultBean.RowsBean> list = new ArrayList<NewsBean.ResultBean.RowsBean>();    private MyAdapter adapter;    private XListView xListView;    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        View view = inflater.inflate(R.layout.news_layout, container, false);        //查找控件        xListView = view.findViewById(R.id.xListView);        //设置XListView的上拉刷新功能        xListView.setPullLoadEnable(true);        xListView.setPullRefreshEnable(true);        //XListView的监听事件        xListView.setXListViewListener(this);        return view;    }    @Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        //获取刷新的数据        getDataFromNet();    }    //网络获取刷新的数据    private void getDataFromNet() {        AsyncTask<Void,Void,String>  task = new AsyncTask<Void, Void, String>() {            @Override            protected String doInBackground(Void... voids) {                try {                    String path = "http://api.fang.anjuke.com/m/android/1.3/shouye/recInfosV3/?city_id=14&lat=40.04652&lng=116.306033&api_key=androidkey&sig=9317e9634b5fbc16078ab07abb6661c5&macid=45cd2478331b184ff0e15f29aaa89e3e&app=a-ajk&_pid=11738&o=PE-TL10-user+4.4.2+HuaweiPE-TL10+CHNC00B260+ota-rel-keys%2Crelease-keys&from=mobile&m=Android-PE-TL10&cv=9.5.1&cid=14&i=864601026706713&v=4.4.2&pm=b61&uuid=1848c59c-185d-48d9-b0e9-782016041109&_chat_id=0&qtime=20160411091603";                    URL url = new URL(path);                    //GET方式网络连接,注意HttpURLConnection请求数据,不是HttpsURLConnection类                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();                    connection.setRequestMethod("GET");                    connection.setConnectTimeout(5000);                    connection.setReadTimeout(5000);                    //响应数据                    int responseCode = connection.getResponseCode();                    if (responseCode == 200){                        InputStream inputStream = connection.getInputStream();                        //返回数据                        String json = streamToString(inputStream,"utf-8");                        return json;                    }                } catch (Exception e) {                    e.printStackTrace();                }                return null;            }            @Override            protected void onPostExecute(String result) {                //解析数据                NewsBean newsBean = new Gson().fromJson(result, NewsBean.class);                //把获取的数据添加到集合中                list.addAll(newsBean.getResult().getRows());                //设置适配器                setAdapter();                //停止刷新数据                xListView.stopRefresh();                //设置刷新的时间                Date date = new Date(System.currentTimeMillis());                SimpleDateFormat format = new SimpleDateFormat("HH:mm");                xListView.setRefreshTime(format.format(date));            }        };        task.execute();    }    //设置适配器的方法    private void setAdapter() {        if (adapter == null){            adapter = new MyAdapter(getActivity(), list);            xListView.setAdapter(adapter);        }else {            adapter.notifyDataSetChanged();        }    }    //下拉刷新    @Override    public void onRefresh() {        getDataFromNet();     //刷新数据    }    //上拉加载    @Override    public void onLoadMore() {        getDataFromNet();     //加载数据    }    //Json数据解析的自定义方法    private String streamToString(InputStream inputStream, String encode) {        try {            //转换流            InputStreamReader streamReader = new InputStreamReader(inputStream, encode);            //缓冲流            BufferedReader reader = new BufferedReader(streamReader);            //缓冲区            StringBuilder builder = new StringBuilder();            //读取数据            String data = null;            while ((data = reader.readLine())!=null){                builder.append(data);            }            //关流,返回数据            reader.close();            return  builder.toString();        } catch (Exception e) {            e.printStackTrace();        }        return null;    }}

三. 自定义适配器类代码(导入ImageLoader包):

package Adapter;import android.content.Context;import android.graphics.Bitmap;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import com.nostra13.universalimageloader.core.DisplayImageOptions;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;import com.nostra13.universalimageloader.core.assist.ImageScaleType;import java.util.List;import Bean.NewsBean;import activity.WeekTwo.R;//自定义适配器继承BaseAdapterpublic class MyAdapter extends BaseAdapter{    private Context context;    private List<NewsBean.ResultBean.RowsBean> list;    public MyAdapter(Context context, List<NewsBean.ResultBean.RowsBean> list) {        this.context = context;        this.list = list;        //自定义配置ImageLoader类        ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(context));    }    @Override    public int getCount() {        return list.size();    }    @Override    public Object getItem(int i) {        return list.get(i);    }    @Override    public long getItemId(int i) {        return i;    }    //XlistView进行优化,防止出现内存溢出    @Override    public View getView(int i, View view, ViewGroup viewGroup) {        ViewHolder holder;        if (view == null){            view = View.inflate(context, R.layout.item_layout,null);            holder = new ViewHolder();            //查找控件            holder.loupan_name = view.findViewById(R.id.loupan_name);            holder.default_image = view.findViewById(R.id.default_image);            //绑定数据            view.setTag(holder);        }else {            //解绑            holder = (ViewHolder) view.getTag();        }        //获取数据重新赋值        holder.loupan_name.setText(list.get(i).getInfo().getLoupan_name());        ImageLoader.getInstance().displayImage(list.get(i).getInfo().getDefault_image(),holder.default_image,getOption());        return view;    }    //ImageLoader加载图片,imageLoader配置使用自定义配置的方法    private DisplayImageOptions getOption(){        DisplayImageOptions build = new DisplayImageOptions.Builder()                .showImageForEmptyUri(R.mipmap.ic_launcher)                .showImageOnFail(R.mipmap.ic_launcher)                .showImageOnLoading(R.mipmap.ic_launcher)                .cacheInMemory(true)                .cacheOnDisk(true)                .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)                .resetViewBeforeLoading(true)                                 //在加载之前复位一下显示                .bitmapConfig(Bitmap.Config.RGB_565)                  //图片的质量                .considerExifParams(true)                                        //是否考虑JPEG图像EXIF参数(旋转,翻转)                .build();        return build;    }    static class  ViewHolder{            TextView loupan_name;            ImageView default_image;    }}

四. 自定义Bean类代码(导入Gson包)


五. 自定义view包盛放3个XListView类代码:

1.  XListView.java

/** * @file XListView.java * @package me.maxwin.view * @create Mar 18, 2012 6:28:41 PM * @author Maxwin * @description An ListView support (a) Pull down to refresh, (b) Pull up to load more. *        Implement IXListViewListener, and see stopRefresh() / stopLoadMore(). */package view;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewTreeObserver.OnGlobalLayoutListener;import android.view.animation.DecelerateInterpolator;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.RelativeLayout;import android.widget.Scroller;import android.widget.TextView;import activity.WeekTwo.R;public class XListView extends ListView implements OnScrollListener {   private float mLastY = -1; // save event y   private Scroller mScroller; // used for scroll back   private OnScrollListener mScrollListener; // user's scroll listener   // the interface to trigger refresh and load more.   private IXListViewListener mListViewListener;   // -- header view   private XListViewHeader mHeaderView;   // header view content, use it to calculate the Header's height. And hide it   // when disable pull refresh.   private RelativeLayout mHeaderViewContent;   private TextView mHeaderTimeView;   private int mHeaderViewHeight; // header view's height   private boolean mEnablePullRefresh = true;   private boolean mPullRefreshing = false; // is refreashing.   // -- footer view   private XListViewFooter mFooterView;   private boolean mEnablePullLoad;   private boolean mPullLoading;   private boolean mIsFooterReady = false;      // total list items, used to detect is at the bottom of listview.   private int mTotalItemCount;   // for mScroller, scroll back from header or footer.   private int mScrollBack;   private final static int SCROLLBACK_HEADER = 0;   private final static int SCROLLBACK_FOOTER = 1;   private final static int SCROLL_DURATION = 400; // scroll back duration   private final static int PULL_LOAD_MORE_DELTA = 50; // when pull up >= 50px                                          // at bottom, trigger                                          // load more.   private final static float OFFSET_RADIO = 1.8f; // support iOS like pull                                       // feature.   /**    * @param context    */   public XListView(Context context) {      super(context);      initWithContext(context);   }   public XListView(Context context, AttributeSet attrs) {      super(context, attrs);      initWithContext(context);   }   public XListView(Context context, AttributeSet attrs, int defStyle) {      super(context, attrs, defStyle);      initWithContext(context);   }   private void initWithContext(Context context) {      mScroller = new Scroller(context, new DecelerateInterpolator());      // XListView need the scroll event, and it will dispatch the event to      // user's listener (as a proxy).      super.setOnScrollListener(this);      // init header view      mHeaderView = new XListViewHeader(context);      mHeaderViewContent = (RelativeLayout) mHeaderView            .findViewById(R.id.xlistview_header_content);      mHeaderTimeView = (TextView) mHeaderView            .findViewById(R.id.xlistview_header_time);      addHeaderView(mHeaderView);      // init footer view      mFooterView = new XListViewFooter(context);      // init header height      mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(            new OnGlobalLayoutListener() {               @Override               public void onGlobalLayout() {                  mHeaderViewHeight = mHeaderViewContent.getHeight();                  getViewTreeObserver()                        .removeGlobalOnLayoutListener(this);               }            });   }   @Override   public void setAdapter(ListAdapter adapter) {      // make sure XListViewFooter is the last footer view, and only add once.      if (mIsFooterReady == false) {         mIsFooterReady = true;         addFooterView(mFooterView);      }      super.setAdapter(adapter);   }   /**    * enable or disable pull down refresh feature.    *     * @param enable    */   public void setPullRefreshEnable(boolean enable) {      mEnablePullRefresh = enable;      if (!mEnablePullRefresh) { // disable, hide the content         mHeaderViewContent.setVisibility(View.INVISIBLE);      } else {         mHeaderViewContent.setVisibility(View.VISIBLE);      }   }   /**    * enable or disable pull up load more feature.    *     * @param enable    */   public void setPullLoadEnable(boolean enable) {      mEnablePullLoad = enable;      if (!mEnablePullLoad) {         mFooterView.hide();         mFooterView.setOnClickListener(null);         //make sure "pull up" don't show a line in bottom when listview with one page          setFooterDividersEnabled(false);      } else {         mPullLoading = false;         mFooterView.show();         mFooterView.setState(XListViewFooter.STATE_NORMAL);         //make sure "pull up" don't show a line in bottom when listview with one page           setFooterDividersEnabled(true);         // both "pull up" and "click" will invoke load more.         mFooterView.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {               startLoadMore();            }         });      }   }   /**    * stop refresh, reset header view.    */   public void stopRefresh() {      if (mPullRefreshing == true) {         mPullRefreshing = false;         resetHeaderHeight();      }   }   /**    * stop load more, reset footer view.    */   public void stopLoadMore() {      if (mPullLoading == true) {         mPullLoading = false;         mFooterView.setState(XListViewFooter.STATE_NORMAL);      }   }   /**    * set last refresh time    *     * @param time    */   public void setRefreshTime(String time) {      mHeaderTimeView.setText(time);   }   private void invokeOnScrolling() {      if (mScrollListener instanceof OnXScrollListener) {         OnXScrollListener l = (OnXScrollListener) mScrollListener;         l.onXScrolling(this);      }   }   private void updateHeaderHeight(float delta) {      mHeaderView.setVisiableHeight((int) delta            + mHeaderView.getVisiableHeight());      if (mEnablePullRefresh && !mPullRefreshing) { // 未处于刷新状态,更新箭头         if (mHeaderView.getVisiableHeight() > mHeaderViewHeight) {            mHeaderView.setState(XListViewHeader.STATE_READY);         } else {            mHeaderView.setState(XListViewHeader.STATE_NORMAL);         }      }      setSelection(0); // scroll to top each time   }   /**    * reset header view's height.    */   private void resetHeaderHeight() {      int height = mHeaderView.getVisiableHeight();      if (height == 0) // not visible.         return;      // refreshing and header isn't shown fully. do nothing.      if (mPullRefreshing && height <= mHeaderViewHeight) {         return;      }      int finalHeight = 0; // default: scroll back to dismiss header.      // is refreshing, just scroll back to show all the header.      if (mPullRefreshing && height > mHeaderViewHeight) {         finalHeight = mHeaderViewHeight;      }      mScrollBack = SCROLLBACK_HEADER;      mScroller.startScroll(0, height, 0, finalHeight - height,            SCROLL_DURATION);      // trigger computeScroll      invalidate();   }   private void updateFooterHeight(float delta) {      int height = mFooterView.getBottomMargin() + (int) delta;      if (mEnablePullLoad && !mPullLoading) {         if (height > PULL_LOAD_MORE_DELTA) { // height enough to invoke load                                       // more.            mFooterView.setState(XListViewFooter.STATE_READY);         } else {            mFooterView.setState(XListViewFooter.STATE_NORMAL);         }      }      mFooterView.setBottomMargin(height);//    setSelection(mTotalItemCount - 1); // scroll to bottom   }   private void resetFooterHeight() {      int bottomMargin = mFooterView.getBottomMargin();      if (bottomMargin > 0) {         mScrollBack = SCROLLBACK_FOOTER;         mScroller.startScroll(0, bottomMargin, 0, -bottomMargin,               SCROLL_DURATION);         invalidate();      }   }   private void startLoadMore() {      mPullLoading = true;      mFooterView.setState(XListViewFooter.STATE_LOADING);      if (mListViewListener != null) {         mListViewListener.onLoadMore();      }   }   @Override   public boolean onTouchEvent(MotionEvent ev) {      if (mLastY == -1) {         mLastY = ev.getRawY();      }      switch (ev.getAction()) {      case MotionEvent.ACTION_DOWN:         mLastY = ev.getRawY();         break;      case MotionEvent.ACTION_MOVE:         final float deltaY = ev.getRawY() - mLastY;         mLastY = ev.getRawY();         if (getFirstVisiblePosition() == 0               && (mHeaderView.getVisiableHeight() > 0 || deltaY > 0)) {            // the first item is showing, header has shown or pull down.            updateHeaderHeight(deltaY / OFFSET_RADIO);            invokeOnScrolling();         } else if (getLastVisiblePosition() == mTotalItemCount - 1               && (mFooterView.getBottomMargin() > 0 || deltaY < 0)) {            // last item, already pulled up or want to pull up.            updateFooterHeight(-deltaY / OFFSET_RADIO);         }         break;      default:         mLastY = -1; // reset         if (getFirstVisiblePosition() == 0) {            // invoke refresh            if (mEnablePullRefresh                  && mHeaderView.getVisiableHeight() > mHeaderViewHeight) {               mPullRefreshing = true;               mHeaderView.setState(XListViewHeader.STATE_REFRESHING);               if (mListViewListener != null) {                  mListViewListener.onRefresh();               }            }            resetHeaderHeight();         } else if (getLastVisiblePosition() == mTotalItemCount - 1) {            // invoke load more.            if (mEnablePullLoad                && mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA                && !mPullLoading) {               startLoadMore();            }            resetFooterHeight();         }         break;      }      return super.onTouchEvent(ev);   }   @Override   public void computeScroll() {      if (mScroller.computeScrollOffset()) {         if (mScrollBack == SCROLLBACK_HEADER) {            mHeaderView.setVisiableHeight(mScroller.getCurrY());         } else {            mFooterView.setBottomMargin(mScroller.getCurrY());         }         postInvalidate();         invokeOnScrolling();      }      super.computeScroll();   }   @Override   public void setOnScrollListener(OnScrollListener l) {      mScrollListener = l;   }   @Override   public void onScrollStateChanged(AbsListView view, int scrollState) {      if (mScrollListener != null) {         mScrollListener.onScrollStateChanged(view, scrollState);      }   }   @Override   public void onScroll(AbsListView view, int firstVisibleItem,         int visibleItemCount, int totalItemCount) {      // send to user's listener      mTotalItemCount = totalItemCount;      if (mScrollListener != null) {         mScrollListener.onScroll(view, firstVisibleItem, visibleItemCount,               totalItemCount);      }   }   public void setXListViewListener(IXListViewListener l) {      mListViewListener = l;   }   /**    * you can listen ListView.OnScrollListener or this one. it will invoke    * onXScrolling when header/footer scroll back.    */   public interface OnXScrollListener extends OnScrollListener {      public void onXScrolling(View view);   }   /**    * implements this interface to get refresh/load more event.    */   public interface IXListViewListener {      public void onRefresh();      public void onLoadMore();   }}

2. XListViewFooter.java

/** * @file XFooterView.java * @create Mar 31, 2012 9:33:43 PM * @author Maxwin * @description XListView's footer */package view;import android.content.Context;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.widget.LinearLayout;import android.widget.TextView;import activity.WeekTwo.R;public class XListViewFooter extends LinearLayout {   public final static int STATE_NORMAL = 0;   public final static int STATE_READY = 1;   public final static int STATE_LOADING = 2;   private Context mContext;   private View mContentView;   private View mProgressBar;   private TextView mHintView;      public XListViewFooter(Context context) {      super(context);      initView(context);   }      public XListViewFooter(Context context, AttributeSet attrs) {      super(context, attrs);      initView(context);   }      public void setState(int state) {      mHintView.setVisibility(View.INVISIBLE);      mProgressBar.setVisibility(View.INVISIBLE);      mHintView.setVisibility(View.INVISIBLE);      if (state == STATE_READY) {         mHintView.setVisibility(View.VISIBLE);         mHintView.setText(R.string.xlistview_footer_hint_ready);      } else if (state == STATE_LOADING) {         mProgressBar.setVisibility(View.VISIBLE);      } else {         mHintView.setVisibility(View.VISIBLE);         mHintView.setText(R.string.xlistview_footer_hint_normal);      }   }      public void setBottomMargin(int height) {      if (height < 0) return ;      LayoutParams lp = (LayoutParams)mContentView.getLayoutParams();      lp.bottomMargin = height;      mContentView.setLayoutParams(lp);   }      public int getBottomMargin() {      LayoutParams lp = (LayoutParams)mContentView.getLayoutParams();      return lp.bottomMargin;   }         /**    * normal status    */   public void normal() {      mHintView.setVisibility(View.VISIBLE);      mProgressBar.setVisibility(View.GONE);   }         /**    * loading status     */   public void loading() {      mHintView.setVisibility(View.GONE);      mProgressBar.setVisibility(View.VISIBLE);   }      /**    * hide footer when disable pull load more    */   public void hide() {      LayoutParams lp = (LayoutParams)mContentView.getLayoutParams();      lp.height = 0;      mContentView.setLayoutParams(lp);   }      /**    * show footer    */   public void show() {      LayoutParams lp = (LayoutParams)mContentView.getLayoutParams();      lp.height = LayoutParams.WRAP_CONTENT;      mContentView.setLayoutParams(lp);   }      private void initView(Context context) {      mContext = context;      LinearLayout moreView = (LinearLayout)LayoutInflater.from(mContext).inflate(R.layout.xlistview_footer, null);      addView(moreView);      moreView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));            mContentView = moreView.findViewById(R.id.xlistview_footer_content);      mProgressBar = moreView.findViewById(R.id.xlistview_footer_progressbar);      mHintView = (TextView)moreView.findViewById(R.id.xlistview_footer_hint_textview);   }      }

3. XListViewHeader.java

/** * @file XListViewHeader.java * @create Apr 18, 2012 5:22:27 PM * @author Maxwin * @description XListView's header */package view;import android.content.Context;import android.util.AttributeSet;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.animation.Animation;import android.view.animation.RotateAnimation;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ProgressBar;import android.widget.TextView;import activity.WeekTwo.R;public class XListViewHeader extends LinearLayout {   private LinearLayout mContainer;   private ImageView mArrowImageView;   private ProgressBar mProgressBar;   private TextView mHintTextView;   private int mState = STATE_NORMAL;   private Animation mRotateUpAnim;   private Animation mRotateDownAnim;      private final int ROTATE_ANIM_DURATION = 180;      public final static int STATE_NORMAL = 0;   public final static int STATE_READY = 1;   public final static int STATE_REFRESHING = 2;   public XListViewHeader(Context context) {      super(context);      initView(context);   }   /**    * @param context    * @param attrs    */   public XListViewHeader(Context context, AttributeSet attrs) {      super(context, attrs);      initView(context);   }   private void initView(Context context) {      // 初始情况,设置下拉刷新view高度为0      LayoutParams lp = new LayoutParams(            LayoutParams.FILL_PARENT, 0);      mContainer = (LinearLayout) LayoutInflater.from(context).inflate(            R.layout.xlistview_header, null);      addView(mContainer, lp);      setGravity(Gravity.BOTTOM);      mArrowImageView = (ImageView)findViewById(R.id.xlistview_header_arrow);      mHintTextView = (TextView)findViewById(R.id.xlistview_header_hint_textview);      mProgressBar = (ProgressBar)findViewById(R.id.xlistview_header_progressbar);            mRotateUpAnim = new RotateAnimation(0.0f, -180.0f,            Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,            0.5f);      mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION);      mRotateUpAnim.setFillAfter(true);      mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f,            Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,            0.5f);      mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION);      mRotateDownAnim.setFillAfter(true);   }   public void setState(int state) {      if (state == mState) return ;            if (state == STATE_REFRESHING) {   // 显示进度         mArrowImageView.clearAnimation();         mArrowImageView.setVisibility(View.INVISIBLE);         mProgressBar.setVisibility(View.VISIBLE);      } else {   // 显示箭头图片         mArrowImageView.setVisibility(View.VISIBLE);         mProgressBar.setVisibility(View.INVISIBLE);      }            switch(state){      case STATE_NORMAL:         if (mState == STATE_READY) {            mArrowImageView.startAnimation(mRotateDownAnim);         }         if (mState == STATE_REFRESHING) {            mArrowImageView.clearAnimation();         }         mHintTextView.setText(R.string.xlistview_header_hint_normal);         break;      case STATE_READY:         if (mState != STATE_READY) {            mArrowImageView.clearAnimation();            mArrowImageView.startAnimation(mRotateUpAnim);            mHintTextView.setText(R.string.xlistview_header_hint_ready);         }         break;      case STATE_REFRESHING:         mHintTextView.setText(R.string.xlistview_header_hint_loading);         break;         default:      }            mState = state;   }      public void setVisiableHeight(int height) {      if (height < 0)         height = 0;      LayoutParams lp = (LayoutParams) mContainer            .getLayoutParams();      lp.height = height;      mContainer.setLayoutParams(lp);   }   public int getVisiableHeight() {      return mContainer.getLayoutParams().height;   }}


六. 自定义布局:

1. activity_main.xml :

<?xml version="1.0" encoding="utf-8"?><android.support.v4.widget.DrawerLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/drawer_layout"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <!--主内容区域的视图-->    <FrameLayout        android:id="@+id/frame_layout"        android:layout_width="match_parent"        android:layout_height="match_parent"  >        <RelativeLayout            android:background="#EEE8AA"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:layout_gravity="left|center_vertical">            <RelativeLayout                android:layout_height="88dp"                android:background="#00FA9A"                android:layout_width="match_parent"                android:layout_alignParentTop="true">                <ImageView                    android:clickable="true"                    android:src="@drawable/a"                    android:layout_width="36dp"                    android:layout_height="36dp"                    android:layout_marginLeft="6dp"                    android:id="@+id/myHeadPhoto"                    android:layout_centerVertical="true"/>                <TextView                    android:text="消息"                    android:textSize="21sp"                    android:textStyle="bold"                    android:layout_centerInParent="true"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content" />                <ImageView                    android:clickable="true"                    android:layout_width="36dp"                    android:layout_height="36dp"                    android:layout_marginRight="6dp"                    android:src="@drawable/popshow"                    android:layout_centerVertical="true"                    android:layout_alignParentRight="true"/>            </RelativeLayout>            <TextView                android:textSize="36sp"                android:textStyle="bold"                android:textColor="#00BFFF"                android:text="QQ侧滑菜单的实现"                android:layout_marginTop="36dp"                android:layout_centerInParent="true"                android:layout_width="wrap_content"                android:layout_height="wrap_content" />        </RelativeLayout>    </FrameLayout>    <!--抽屉展示的布局-->    <RelativeLayout        android:id="@+id/relative"        android:layout_gravity="left"        android:layout_width="250dp"        android:background="#00BFFF"        android:layout_height="match_parent">        <ImageView            android:id="@+id/a"            android:src="@drawable/a"            android:layout_width="36dp"            android:layout_height="36dp"            android:layout_marginLeft="65dp"            android:layout_marginTop="20dp" />        <TextView            android:text="问天"            android:textSize="21sp"            android:id="@+id/text"            android:layout_marginLeft="10dp"            android:layout_marginTop="21dp"            android:layout_toRightOf="@id/a"            android:layout_width="wrap_content"            android:layout_height="wrap_content" />        <ListView            android:divider="#00BFFF"            android:id="@+id/listView"            android:layout_marginTop="50dp"            android:layout_marginLeft="80dp"            android:layout_below="@+id/text"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:layout_centerHorizontal="true"></ListView>    </RelativeLayout></android.support.v4.widget.DrawerLayout>

2. item_layout.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="horizontal"    android:background="#ffffff"  >    <ImageView        android:layout_width="88dp"        android:layout_height="88dp"        android:layout_marginLeft="6dp"        android:id="@+id/default_image"        android:layout_gravity="center_vertical"  />    <TextView        android:textSize="18sp"        android:id="@+id/loupan_name"        android:layout_marginLeft="16dp"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_vertical"/></LinearLayout>

3. news_layout.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">    <view.XListView        android:background="#ffffff"        android:id="@+id/xListView"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_gravity="center_horizontal"/></LinearLayout>

4. xlistview_header.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:gravity="bottom" >    <RelativeLayout        android:id="@+id/xlistview_header_content"        android:layout_width="fill_parent"        android:layout_height="60dp" >        <LinearLayout            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:gravity="center"            android:orientation="vertical" android:id="@+id/xlistview_header_text">            <TextView                android:id="@+id/xlistview_header_hint_textview"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="@string/xlistview_header_hint_normal" />            <LinearLayout                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginTop="3dp" >                <TextView                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:text="@string/xlistview_header_last_time"                    android:textSize="12sp" />                <TextView                    android:id="@+id/xlistview_header_time"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:textSize="12sp" />            </LinearLayout>        </LinearLayout>        <ImageView            android:id="@+id/xlistview_header_arrow"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_alignLeft="@id/xlistview_header_text"            android:layout_centerVertical="true"            android:layout_marginLeft="-35dp"            android:src="@drawable/xlistview_arrow" />        <ProgressBar            android:id="@+id/xlistview_header_progressbar"            android:layout_width="30dp"            android:layout_height="30dp"            android:layout_alignLeft="@id/xlistview_header_text"            android:layout_centerVertical="true"            android:layout_marginLeft="-40dp"            android:visibility="invisible" />    </RelativeLayout></LinearLayout>

5. xlistview_footer.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" >    <RelativeLayout        android:id="@+id/xlistview_footer_content"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:padding="10dp" >        <ProgressBar            android:id="@+id/xlistview_footer_progressbar"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:visibility="invisible" />        <TextView            android:id="@+id/xlistview_footer_hint_textview"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:text="@string/xlistview_footer_hint_normal" />    </RelativeLayout></LinearLayout>

6. values目录下的strings.xml中的<resources>加入以下代码:

<string name="xlistview_header_hint_normal">下拉刷新</string><string name="xlistview_header_hint_ready">松开刷新数据</string><string name="xlistview_header_hint_loading">正在加载...</string><string name="xlistview_header_last_time">上次更新时间:</string><string name="xlistview_footer_hint_normal">查看更多</string><string name="xlistview_footer_hint_ready">松开载入更多</string>

7. 在drawable目录下,加入图片 xlistview_arrow.png :


                     

8. 在AndroidManfiest.xml中加入网络请求权限。

原创粉丝点击