侧滑菜单+XListView+ImageLoader+Post请求方式+ListView加载更多条目
来源:互联网 发布:魔侠传 网络异常 编辑:程序博客网 时间:2024/06/05 05:44
一.在MainActivity中的代码:
import android.support.v4.app.FragmentActivity;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.ListView;import android.widget.RelativeLayout;import java.util.ArrayList;import java.util.List;public class MainActivity extends FragmentActivity { private DrawerLayout drawerlayout; 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); //定义集合添加数据 list = new ArrayList<>(); for (int i=1;i<10;i++){ list.add(i+""); } //设置适配器 ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this,android.R.layout.simple_list_item_1,android.R.id.text1,list); listView.setAdapter(adapter); //条目的点击事件 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { //要有一个fragment替换后面主内容的frameLayout WeiXinFragment weiXinFragment = new WeiXinFragment(); //传值 Bundle bundle = new Bundle(); bundle.putString("key", list.get(i)); weiXinFragment.setArguments(bundle); //使用Framelayout布局占位 getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout,weiXinFragment).commit(); //关闭抽屉 drawerlayout.closeDrawer(relative); } }); }}
二.自定义微信精选类Fragment:
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 android.widget.Toast;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.DataBean;import view.XListView;public class WeiXinFragment extends Fragment implements XListView.IXListViewListener{ private List<DataBean.ResultBean.ListBean> list = new ArrayList<DataBean.ResultBean.ListBean>(); private int num = 1; //页数 private XListView xListView; private MyAdapter adapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.weixin_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); //获取到传递过来的页码 Bundle bundle = getArguments(); num = Integer.parseInt(bundle.getString("key", "1")); //获取刷新的数据 getDataFromNet(); } //网络获取刷新的数据 private void getDataFromNet() { AsyncTask<Void,Void,String> task = new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... voids) { try { String path = "http://v.juhe.cn/weixin/query"; URL url = new URL(path); //post方式网络连接,注意HttpURLConnection请求数据,不是HttpsURLConnection类 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); //设置向服务器输出 connection.setDoOutput(true); //请求类型 connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); //key值 String param = "key=19178372f8a7c069c42cd59df8d84a46&ps=10&pno="+num; //输出 connection.getOutputStream().write(param.getBytes()); //响应数据 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) { //解析数据 DataBean dataBean = new Gson().fromJson(result, DataBean.class); //把获取的数据添加到集合中 list.addAll(0,dataBean.getResult().getList()); //设置适配器 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() { num++; getDataFromNet(); //加载到数据之后停止 } @Override public void onLoadMore() { Toast.makeText(getActivity(),"没有最新数据了!",Toast.LENGTH_SHORT).show(); } //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; }}
三.自定义适配器类:
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.DataBean;import activity.Drawerlayout.R;public class MyAdapter extends BaseAdapter{ private int LEFT = 0; private int RIGHT = 1; private Context context; private List<DataBean.ResultBean.ListBean> list; public MyAdapter(Context context, List<DataBean.ResultBean.ListBean> 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; } @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { if (position%2 == 0){ return LEFT; } return RIGHT; } @Override public View getView(int i, View view, ViewGroup viewGroup) { if (getItemViewType(i) == LEFT){ LeftHolder holder; if (view == null){ view = View.inflate(context,R.layout.item_01,null); holder = new LeftHolder(); //查找控件 holder.text = view.findViewById(R.id.text); holder.image = view.findViewById(R.id.image_01); //绑定数据 view.setTag(holder); }else { //解绑 holder = (LeftHolder) view.getTag(); } //获取数据重新赋值 holder.text.setText(list.get(i).getTitle()); ImageLoader.getInstance().displayImage(list.get(i).getFirstImg(),holder.image,getOption()); }else if (getItemViewType(i) == RIGHT) { RightHolder holder; if (view == null) { view = View.inflate(context, R.layout.item_02, null); holder = new RightHolder(); //查找控件 holder.text = view.findViewById(R.id.text); holder.image = view.findViewById(R.id.image_02); //绑定数据 view.setTag(holder); } else { //解绑 holder = (RightHolder) view.getTag(); } //获取数据重新赋值 holder.text.setText(list.get(i).getTitle()); ImageLoader.getInstance().displayImage(list.get(i).getFirstImg(), holder.image,getOption()); } return view; } 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 LeftHolder{ TextView text; ImageView image; } static class RightHolder{ TextView text; ImageView image; }}
四. 自定义bean类
五. 自定义盛放3个XListView类的包:
1.类一 :XListView
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.Drawerlayout.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. 类二:XListViewHeader:
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.Drawerlayout.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; }}
3. 类三:XListViewFooter:
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.Drawerlayout.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); } }
六.自定义布局:
1.activity_main:
<?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:id="@+id/relative" android:layout_gravity="left" android:background="#ffffff" android:layout_width="150dp" android:layout_height="match_parent"> <ImageView android:id="@+id/image" android:src="@drawable/e" android:layout_width="100dp" android:layout_height="100dp" android:layout_marginTop="20dp" android:layout_centerHorizontal="true"/> <ListView android:id="@+id/listView" android:layout_marginTop="20dp" android:layout_below="@+id/image" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true"></ListView> </RelativeLayout></android.support.v4.widget.DrawerLayout>
2.weixin_layout:
<?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:id="@+id/xListView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_horizontal"/></LinearLayout>
3.image_01:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/image_01" android:layout_width="100dp" android:layout_height="100dp" /> <TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>
4.image_02:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/text" android:layout_weight="1" android:layout_width="0dp" android:layout_height="wrap_content" /> <ImageView android:id="@+id/image_02" android:layout_width="100dp" android:layout_height="100dp" /></LinearLayout>
5.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>
6. 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>
7.在drawable目录下加入图片:xlistview_arrow.png
七. 在values目录下的strings.xml布局中,加入下面代码:
<resources> <string name="app_name">项目名称</string> <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></resources>
八.最后在AndroidManifest.xml文件中加入网络请求权限
阅读全文
0 0
- 侧滑菜单+XListView+ImageLoader+Post请求方式+ListView加载更多条目
- ImageLoader,GET,POST获取数据,多条目加载,XListView
- ImageLoader+网络请求+ListView多条目加载
- 多条目加载+XlistView刷新加载更多
- 动漫-无限轮播小圆点+判断网络+网络请求+多条目加载XListView+ImageLoader
- handle发送get和post请求网络数据+多条目加载+banner+xlistview+TabLayout
- ListView多条目加载和ImageLoader
- xlistview多条目加载
- XListView之多条目加载
- XlistView多条目加载
- LIstView多条目展示+XListView下拉刷新,上拉加载
- Listview多条目加载和XListview下拉刷新控件
- ListView多条目+ImageLoader
- 网络判断+网络请求+TabLayout+XListview+多条目加载.
- ImageLoader多张图片&listview多条目加载
- Xlistview加载更多
- XListView+Library加载更多
- listview多条目加载(网络请求)
- Unity鼠标出屏幕后 摄像机跟随鼠标方向移动
- Luba And The Ticket CodeForces
- OKHTTP的简单封装
- 疯狂Java讲义:第16章:多线程复习(一)
- 如何在协议栈中构建自己的 Zigbee 网络指示灯
- 侧滑菜单+XListView+ImageLoader+Post请求方式+ListView加载更多条目
- phpstorm破解版地址http://www.oyksoft.com/soft/40722.html
- JVM学习笔记(一)
- 调度线程池
- 如何在CSDN博客上设置首行缩进?
- 面对对象之继承,密封
- 走进科学-盐碱地种出甜高粱
- 洛谷 P2146 [NOI2015]软件包管理器 树链剖分
- 二分查找算法及分析