依赖:
package com.bw.arp.zhoukao2_moni.Xlistview;
import android.annotation.SuppressLint;
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 com.bw.arp.zhoukao2_moni.R;
import java.text.SimpleDateFormat;
import java.util.Date;
public class XListView extends ListView implements OnScrollListener {
private float mLastY = -1; // save event y
private Scroller mScroller; // 用于回滚
private OnScrollListener mScrollListener; // 回滚监听
// 触发刷新和加载更多接口.
private IXListViewListener mListViewListener;
// -- 头部的View
private XListViewHeader mHeaderView;
// 查看头部的内容,用它计算头部高度,和隐藏它
// 当禁用的时候刷新
private RelativeLayout mHeaderViewContent;
private TextView mHeaderTimeView;
private int mHeaderViewHeight; // 头部View的高
private boolean mEnablePullRefresh = true;
private boolean mPullRefreshing = false; // 是否刷新.
// -- 底部的View
private XListViewFooter mFooterView;
private boolean mEnablePullLoad;
private boolean mPullLoading;
private boolean mIsFooterReady = false;
// 总列表项,用于检测列表视图的底部
private int mTotalItemCount;
// for mScroller, 滚动页眉或者页脚
private int mScrollBack;
private final static int SCROLLBACK_HEADER = 0;// 顶部
private final static int SCROLLBACK_FOOTER = 1;// 下部
private final static int SCROLL_DURATION = 400; // 滚动回时间
private final static int PULL_LOAD_MORE_DELTA = 50; // 当大于50PX的时候,加载更多
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);
// 初始化头部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);// 把头部这个视图添加进去
// 初始化底部的View
mFooterView = new XListViewFooter(context);
// 初始化头部高度
mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mHeaderViewHeight = mHeaderViewContent.getHeight();
getViewTreeObserver()
.removeGlobalOnLayoutListener(this);
}
});
}
@Override
public void setAdapter(ListAdapter adapter) {
// 确定XListViewFooter是最后底部的View, 并且只有一次
if (mIsFooterReady == false) {
mIsFooterReady = true;
addFooterView(mFooterView);
}
super.setAdapter(adapter);
}
/**
* 启用或禁用下拉刷新功能.
*
* @param enable
*/
public void setPullRefreshEnable(boolean enable) {
mEnablePullRefresh = enable;
if (!mEnablePullRefresh) { // 禁用,隐藏内容
mHeaderViewContent.setVisibility(View.INVISIBLE);// 如果为false则隐藏下拉刷新功能
} else {
mHeaderViewContent.setVisibility(View.VISIBLE);// 否则就显示下拉刷新功能
}
}
/**
* 启用或禁用加载更多的功能.
*
* @param enable
*/
public void setPullLoadEnable(boolean enable) {
mEnablePullLoad = enable;
if (!mEnablePullLoad) {
mFooterView.hide();// 隐藏
mFooterView.setOnClickListener(null);
} else {
mPullLoading = false;
mFooterView.show();// 显示
mFooterView.setState(XListViewFooter.STATE_NORMAL);
// both "上拉" 和 "点击" 将调用加载更多.
mFooterView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startLoadMore();
}
});
}
}
/**
* 停止刷新, 重置头视图.
*/
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);
}
}
/**
* 設置最後一次刷新時間
*
* @param time
*/
@SuppressLint("SimpleDateFormat")
public void setRefreshTime(String time) {
SimpleDateFormat formatter = new SimpleDateFormat ("yyyy年MM月dd日 HH:mm:ss ");
Date curDate = new Date(System.currentTimeMillis());
//获取当前时间
String str = formatter.format(curDate);
mHeaderTimeView.setText(str);
}
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
}
/**
* 重置头视图的高度
*/
private void resetHeaderHeight() {
int height = mHeaderView.getVisiableHeight();
if (height == 0) // 不显示.
return;
// 不显示刷新和标题的时候,什么都不显示
if (mPullRefreshing && height <= mHeaderViewHeight) {
return;
}
int finalHeight = 0; // 默认:滚动回头.
// 当滚动回显示所有头标题时候,刷新
if (mPullRefreshing && height > mHeaderViewHeight) {
finalHeight = mHeaderViewHeight;
}
mScrollBack = SCROLLBACK_HEADER;
mScroller.startScroll(0, height, 0, finalHeight - height,
SCROLL_DURATION);
// 触发刷新
invalidate();
}
// 改变底部视图高度
private void updateFooterHeight(float delta) {
int height = mFooterView.getBottomMargin() + (int) delta;
if (mEnablePullLoad && !mPullLoading) {
if (height > PULL_LOAD_MORE_DELTA) { // 高度足以调用加载更多
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();
System.out.println("数据监测:" + getFirstVisiblePosition() + "---->"
+ getLastVisiblePosition());
if (getFirstVisiblePosition() == 0
&& (mHeaderView.getVisiableHeight() > 0 || deltaY > 0)) {
// 第一项显示,标题显示或拉下来.
updateHeaderHeight(deltaY / OFFSET_RADIO);
invokeOnScrolling();
} else if (getLastVisiblePosition() == mTotalItemCount - 1
&& (mFooterView.getBottomMargin() > 0 || deltaY < 0)) {
// 最后一页,已停止或者想拉起
updateFooterHeight(-deltaY / OFFSET_RADIO);
}
break;
default:
mLastY = -1; // 重置
if (getFirstVisiblePosition() == 0) {
// 调用刷新,如果头部视图高度大于设定高度。
if (mEnablePullRefresh
&& mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
mPullRefreshing = true;// 那么刷新
mHeaderView.setState(XListViewHeader.STATE_REFRESHING);
if (mListViewListener != null) {
mListViewListener.onRefresh();
}
}
resetHeaderHeight();// 刷新完毕,重置头部高度,也就是返回上不
}
if (getLastVisiblePosition() == mTotalItemCount - 1) {
// 调用加载更多.
if (mEnablePullLoad
&& mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA) {
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) {
// 发送到用户的监听器
mTotalItemCount = totalItemCount;
if (mScrollListener != null) {
mScrollListener.onScroll(view, firstVisibleItem, visibleItemCount,
totalItemCount);
}
}
public void setXListViewListener(IXListViewListener l) {
mListViewListener = l;
}
/**
* 你可以监听到列表视图,OnScrollListener 或者这个. 他将会被调用 , 当头部或底部触发的时候
*/
public interface OnXScrollListener extends OnScrollListener {
public void onXScrolling(View view);
}
/**
* 实现这个接口来刷新/负载更多的事件
*/
public interface IXListViewListener {
public void onRefresh();
public void onLoadMore();
}
}
package com.bw.arp.zhoukao2_moni.Xlistview;
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 com.bw.arp.zhoukao2_moni.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);
}
/**
* 当禁用拉加载更多隐藏底部视图
*/
public void hide() {
LayoutParams lp = (LayoutParams) mContentView
.getLayoutParams();
lp.height = 0;
mContentView.setLayoutParams(lp);
}
/**
* 显示底部视图
*/
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);
}
}
package com.bw.arp.zhoukao2_moni.Xlistview;
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 com.bw.arp.zhoukao2_moni.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);
// 时间TextView
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.getHeight();
}
}
<?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>
<?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:id="@+id/xlistview_header_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:orientation="vertical" >
<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="@mipmap/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>
<resources>
<string name="app_name">Zhoukao2_moni</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>
<string-array name="goodsType">
<item>新闻</item>
<item>关注</item>
<item>动态</item>
<item>设置</item>
</string-array>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
</resources>
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context="com.example.month_3.MainActivity">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="200dp"/>
<com.bawei.jane.mxlistview.view.XListView
android:id="@+id/xlistview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.month_3.Main2Activity">
<WebView
android:id="@+id/Web"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.month_3.Main3Activity">
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/tu_list0"
android:layout_width="100dp"
android:layout_height="100dp" />
<TextView
android:id="@+id/name_list0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toEndOf="@+id/tu_list0"
android:layout_toRightOf="@+id/tu_list0"
android:padding="10dp"
android:textSize="20sp"
android:textColor="#f00"
/>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/name_list1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:padding="10dp"
android:textSize="20sp"
android:textColor="#f00"
/>
</RelativeLayout>
主界面:
package com.example.month_3;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.bawei.jane.mxlistview.view.XListView;
import com.example.month_3.MyBean.MyShuJu;
import com.example.month_3.MyBean.MypagerBean;
import com.example.month_3.Utils.ImageLoaderutils;
import com.example.month_3.Utils.MyNetTask;
import com.google.gson.Gson;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<MyShuJu.NewslistBean> data = new ArrayList<>();
private List<String> list = new ArrayList<>();
private XListView xlistview;
private ViewPager viewPager;
private String part= "http://api.tianapi.com/tiyu/?key=36bafe109f1b68cc2c3829db69c7c180&num=";
private int index = 3;
private String url=part+index;
private int type=1;
private DisplayImageOptions option;
private Myadapter myadapter;
@SuppressLint("HandlerLeak")
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what == 0){
int currentItem = viewPager.getCurrentItem();
viewPager.setCurrentItem(currentItem+1);
handler.sendEmptyMessageDelayed(0,2000);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化图片
ImageLoaderutils.initImageLoader(MainActivity.this);
option = ImageLoaderutils.getImageOption(MainActivity.this);
//找控件
xlistview = findViewById(R.id.xlistview);
viewPager = findViewById(R.id.viewpager);
//viewpager
Newviewpager();
//xlistview
NewXlistview();
//xlistview获取参数与实例化适配器
requestData();
}
//xlistview相关操作
private void NewXlistview() {
xlistview.setPullRefreshEnable(true);
xlistview.setPullLoadEnable(true);
xlistview.setXListViewListener(new XListView.IXListViewListener() {
@Override
public void onRefresh() {
index=3;
url=part+index;
type=1;
requestData();
}
@Override
public void onLoadMore() {
index++;
url=part+index;
type=2;
requestData();
}
});
//XListView的长摁事件
xlistview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
intent.putExtra("url",data.get(position-1).getUrl());
startActivity(intent);
return true;
}
});
}
//xlistview获取参数与实例化适配器
private void requestData() {
MyNetTask task = new MyNetTask(new MyNetTask.IcallBack() {
@Override
public void getJsonData(String jsonStr) {
Gson gson = new Gson();
MyShuJu myShuJu = gson.fromJson(jsonStr, MyShuJu.class);
if (type==1)
{
data.clear();
}
data.addAll(myShuJu.getNewslist());
if (myadapter==null)
{
myadapter = new Myadapter();
xlistview.setAdapter(myadapter);
}else {
myadapter.notifyDataSetChanged();
}
if (type==1)
{
xlistview.stopRefresh();
}else {
xlistview.stopLoadMore();
}
}
});
task.execute(url);
}
//viewpager相关操作
private void Newviewpager() {
MyNetTask task = new MyNetTask(new MyNetTask.IcallBack() {
@Override
public void getJsonData(String jsonStr) {
Gson gson = new Gson();
MypagerBean myShuJu = gson.fromJson(jsonStr, MypagerBean.class);
List<MypagerBean.NewslistBean> newslist = myShuJu.getNewslist();
for (int i = 0 ;i<newslist.size();i++){
String picUrl = newslist.get(i).getPicUrl();
list.add(picUrl);
}
viewPager.setAdapter(new MyPagerAdapter());
viewPager.setCurrentItem(list.size()*10000);
handler.sendEmptyMessageDelayed(0,2000);
}
});
task.execute("https://api.tianapi.com/wxnew/?key=48a7d7193e11bd2dd4a683b6e2f90a4f&num=10&page=1");
}
//ViewPager的适配器
class MyPagerAdapter extends PagerAdapter{
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView imageView = new ImageView(MainActivity.this);
ImageLoader.getInstance().displayImage(list.get(position%list.size()),imageView,option);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
container.addView(imageView);
return imageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View)object);
}
}
//xlistview的适配器
class Myadapter extends BaseAdapter{
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
if(position%2==0){
return 0;
}else{
return 1;
}
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
int itemViewType = getItemViewType(i);
if(itemViewType == 0){
ViewHolder0 holder0;
if(view == null){
view = View.inflate(MainActivity.this,R.layout.listview0,null);
holder0= new ViewHolder0();
holder0.tu = view.findViewById(R.id.tu_list0);
holder0.name = view.findViewById(R.id.name_list0);
view.setTag(holder0);
}else{
holder0 = (ViewHolder0) view.getTag();
}
ImageLoader.getInstance().displayImage(data.get(i).getPicUrl(),holder0.tu,option);
holder0.name.setText(data.get(i).getTitle());
}else{
ViewHolder1 holder1;
if(view == null){
view = View.inflate(MainActivity.this,R.layout.listview1,null);
holder1= new ViewHolder1();
holder1.name = view.findViewById(R.id.name_list1);
view.setTag(holder1);
}else{
holder1 = (ViewHolder1) view.getTag();
}
holder1.name.setText(data.get(i).getTitle());
}
return view;
}
class ViewHolder0{
ImageView tu;
TextView name;
}
class ViewHolder1{
TextView name;
}
}
}
跳转到的界面:
package com.example.month_3;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.example.month_3.R;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
WebView web = findViewById(R.id.Web);
Intent intent = getIntent();
String url = intent.getStringExtra("url");
//设置WebView属性,能够执行Javascript脚本
web.getSettings().setJavaScriptEnabled(true);
//加载需要显示的网页
web.loadUrl(url);
web.setWebViewClient(new HelloWebViewClient ());
}
private class HelloWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
}
package com.example.month_3;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.example.month_3.R;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
WebView web = findViewById(R.id.Web);
Intent intent = getIntent();
String url = intent.getStringExtra("url");
//设置WebView属性,能够执行Javascript脚本
web.getSettings().setJavaScriptEnabled(true);
//加载需要显示的网页
web.loadUrl(url);
web.setWebViewClient(new HelloWebViewClient ());
}
private class HelloWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
}
package com.example.month_3.MyBean;
import java.util.List;
/**
* Created by ASUS on 2017/12/20.
*/
public class MypagerBean {
/**
* code : 200
* msg : success
* newslist : [{"ctime":"2017-12-20","title":"中国海空军这一系列动作相当提气!从绕台到日本海 接下来去哪?","description":"军评陈光文","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-61260876.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=559×tamp=1513731607&signature=uzq1g9oxmrwF4jfPcQRSoC33k16T79gZjjANqeoK3u66O6qFUZ4BjrNwr3mmFyr9B2xdPXKZ2RVpECk7Uz2k9jT3xYqhlwoE2Nm*VEsZ6cw="},{"ctime":"2017-12-20","title":"中国海空军这一系列动作相当提气!从绕台到日本海 接下来去哪?","description":"军评陈光文","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-61260876.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=559×tamp=1513731606&signature=uzq1g9oxmrwF4jfPcQRSoMmoWfNiO4l3ZTQbEwIXBYGwA*b4nuGrgf13wNG5bef6qos01mk1OHmodnC9idkt4AiCEl11mOXYzM2os0hRwoA="},{"ctime":"2017-12-20","title":"这大国又在俄盟友背后捅刀子,俄罗斯摸透其底牌打开天窗说亮话","description":"高峰军事观察","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-61260850.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=559×tamp=1513731606&signature=ZEZGpFbgzMBkKz6uVMo19-QlYKvgCW1wI9KZxDt38NKNGWQWqZLPO4nlMPb*FKBt0Yo3lTDYsnWFql95xQNc1emBseD*Q7c5AIYKd0K*cK4="},{"ctime":"2017-12-20","title":"土耳其在叙利亚的军事布局完成,老美现在给了他翻脸开火的理由","description":"高峰军事观察","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-61260853.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=559×tamp=1513731606&signature=AB0p6HEeJFJi0r10gcSqIGIGGb*hE8feHm3H5oCaBhWEpjZqzkV*kehyWRhPgOLh5MHivGO2GPb6FFA2pARY8KiNT6htY9*gVS080DrIvm8="},{"ctime":"2017-12-20","title":"土耳其在叙利亚的军事布局完成,老美现在给了他翻脸开火的理由","description":"高峰军事观察","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-61260853.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=559×tamp=1513731605&signature=AB0p6HEeJFJi0r10gcSqIPxBTgl-Zrj9yq0ka6BoD3*iA-7pLd7jrHlkt9VveThcbO9621nN-lvWZuNitbACe7pq7GRgnsdBbJ-M9eqRohE="},{"ctime":"2017-12-20","title":"老虎伤人案庭审结束:原告索赔218余万,园方称无过错 | 晨读天下","description":"羊城晚报","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-36037989.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=559×tamp=1513731605&signature=WlECCrDvwufq1onBJTAf82AshCLoKDHlL0gQVRbuqmaq185H5DKzj-i-kHkmNToJGDulRacZTaKDlrmbqHbB5FpdmfwhrzFwMroaccoTmI4="},{"ctime":"2017-12-20","title":"既生瑜何生亮?双雄相争 它竟然败下阵来!","description":"快车报","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-48455624.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=559×tamp=1513728008&signature=DHRIbU96hEZfTXpyWiSfe5RItGKdUveEva7CJZgMou76O2wEQADBl4S4oyHYhUoYrdtlWPSHzgBKDPOpslsCmBskr4hCzXQcZ7xJOeTHYN0="},{"ctime":"2017-12-20","title":"蓝标版有新发动机,红标版有新设计,哈弗H6 Coupe明年春天上市!","description":"快车报","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-48455624.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=559×tamp=1513728008&signature=nSDaGW8ZbelDOOvkmz0P83eXgtFVuDcLvTT2aRLOfysjiRhf4qAxlfOiStVeanq6mOKvFLsT5XZDfG31toXyDhwF4O*uNiLUfOVrz4ypZrI="},{"ctime":"2017-12-20","title":"权威发布|广西公布一批人事任免","description":"广西日报","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-61260670.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=559×tamp=1513720809&signature=g8rcqmyvxweBDGlpS39gccUYK0po0gtCYCGaNp3HNSYVb2bU6wSKZNX1uXH42ogvPfH7X5UckWQ8APLrGCWq1PkIUuIWtNnYMJJEY9TReNM="},{"ctime":"2017-12-19","title":"米老鼠吞下大狐狸,引发好莱坞大公司间的军备竞赛","description":"虹膜","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-61260579.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=558×tamp=1513692009&signature=nxqUkwyApLrPzjG372PTMijuRfZoI74DAlfagnfbn1tZT9WBA2d0CKRReLD0JEC5dqWuDhotjJZoHowFD3MwVS5rjbCP4AnXFsSKHKN7RYI="}]
*/
private int code;
private String msg;
private List<NewslistBean> newslist;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public List<NewslistBean> getNewslist() {
return newslist;
}
public void setNewslist(List<NewslistBean> newslist) {
this.newslist = newslist;
}
public static class NewslistBean {
/**
* ctime : 2017-12-20
* title : 中国海空军这一系列动作相当提气!从绕台到日本海 接下来去哪?
* description : 军评陈光文
* picUrl : https://zxpic.gtimg.com/infonew/0/wechat_pics_-61260876.jpg/640
* url : https://mp.weixin.qq.com/s?src=16&ver=559×tamp=1513731607&signature=uzq1g9oxmrwF4jfPcQRSoC33k16T79gZjjANqeoK3u66O6qFUZ4BjrNwr3mmFyr9B2xdPXKZ2RVpECk7Uz2k9jT3xYqhlwoE2Nm*VEsZ6cw=
*/
private String ctime;
private String title;
private String description;
private String picUrl;
private String url;
public String getCtime() {
return ctime;
}
public void setCtime(String ctime) {
this.ctime = ctime;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPicUrl() {
return picUrl;
}
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
}
package com.example.month_3.Utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Environment;
import com.example.month_3.R;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
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 com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import java.io.File;
/*
* Created by jane on 2017/12/12.
*/
public class ImageLoaderutils {
//初使化
public static void initImageLoader(Context context){
//自定义磁盘缓存路径 系统默认的缓存路径 sd...<package>..cache 当app被卸载时,此路径下的缓存图片一并被删除
//File cacheDir=getExternalCacheDir();
File cacheDir= new File(Environment.getExternalStorageDirectory().getPath()+"/aaa");//自定义 sd卡的缓存路径
//第一步:对ImageLoader进行初使化
ImageLoaderConfiguration configuration=new ImageLoaderConfiguration.Builder(context)
.memoryCacheExtraOptions(320, 450) // default = device screen dimensions 内存缓存文件的最大长宽
.diskCacheExtraOptions(480, 800, null) // 本地缓存的详细信息(缓存的最大长宽),最好不要设置这个
.threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(10 * 1024 * 1024)) //可以通过自己的内存缓存实现
.memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值
.memoryCacheSizePercentage(13) // default
.diskCache(new UnlimitedDiscCache(cacheDir)) // 磁盘缓存 --default 可以自定义缓存路径
.diskCacheSize(20 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值
.diskCacheFileCount(100) // 可以缓存的文件数量
// default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
.imageDownloader(new BaseImageDownloader(context)) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.writeDebugLogs() // 打印debug log
.build();
ImageLoader.getInstance().init(configuration);
}
/**
* 得到图片的显示设置类对象
* @param context
* @return
*/
public static DisplayImageOptions getImageOption(Context context){
DisplayImageOptions options=new DisplayImageOptions.Builder()
.cacheInMemory(true)//使用内存缓存
.cacheOnDisk(true)//使用磁盘缓存
.showImageOnLoading(R.mipmap.ic_launcher)//设置正在下载的图片
.showImageForEmptyUri(R.mipmap.ic_launcher)//url为空或请求的资源不存在时
.showImageOnFail(R.mipmap.ic_launcher)//下载失败时显示的图片
.bitmapConfig(Bitmap.Config.RGB_565)//设置图片色彩模式
.imageScaleType(ImageScaleType.EXACTLY)//设置图片的缩放模式===imageView,,ScaleType
.displayer(new RoundedBitmapDisplayer(50))//设置图片圆角显示 弧度
.build();
return options;
}
}
package com.example.month_3.Utils;
import android.content.Context;
import android.widget.ImageView;
import com.nostra13.universalimageloader.core.ImageLoader;
/*
* Created by WangWenDa on 2017/12/12.
*/
public class MyBannerLoader extends ImageLoader {
public void displayImage(Context context, Object path, ImageView imageView) {
com.nostra13.universalimageloader.core.ImageLoader.getInstance().
displayImage(path.toString(),imageView,
ImageLoaderutils.getImageOption(context));
}
}
package com.example.month_3.Utils;
import android.os.AsyncTask;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/*
* Created by jane on 2017/12/12.
*/
public class MyNetTask extends AsyncTask<String,Void,String> {
//2.申明接口对象
private IcallBack icallBack;
//3.创建构造方法,将接口传进来
public MyNetTask(IcallBack icallBack) {
this.icallBack = icallBack;
}
@Override
protected String doInBackground(String... strings) {
StringBuilder builder=new StringBuilder();
//1.根据url创建URL
try {
URL url=new URL(strings[0]);
//2.打开连接
HttpURLConnection conn =(HttpURLConnection) url.openConnection();
//3.设置
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
//4.判断结果码
int responseCode = conn.getResponseCode();
if(conn.getResponseCode()==200){
//5.获取数据
InputStream inputStream = conn.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));
String str;
while ((str=reader.readLine())!=null){
builder.append(str);
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return builder.toString();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//4.调用接口中方法
icallBack.getJsonData(s);
}
//1.定义一个接口
public interface IcallBack{
void getJsonData(String jsonStr);
}
}
package com.example.month_3.Utils;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
/**
* Created by ASUS on 2017/12/12.
*/
public class Wangluo {
public static boolean isConn(Context context){
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info =(NetworkInfo) manager.getActiveNetworkInfo();
if(info!=null && info.isAvailable()){
return true;
}
return false;
}
public static void openDg(final Context context){
AlertDialog.Builder builder=new AlertDialog.Builder(context);
builder.setMessage("是否要进行网络连接设置?");
builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Intent intent=null;
//判断手机系统的版本 即API大于10 就是3.0或以上版本
if(android.os.Build.VERSION.SDK_INT>10){
intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);
}else{
intent = new Intent();
ComponentName component = new ComponentName("com.android.settings","com.android.settings.WirelessSettings");
intent.setComponent(component);
intent.setAction("android.intent.action.VIEW");
}
context.startActivity(intent);
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.create().show();
}
}
package com.example.month_3;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.bawei.jane.mxlistview.view.XListView;
import com.example.month_3.MyBean.MyShuJu;
import com.example.month_3.MyBean.MypagerBean;
import com.example.month_3.Utils.ImageLoaderutils;
import com.example.month_3.Utils.MyNetTask;
import com.google.gson.Gson;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.List;
和上文中的主界面一样:(看)
public class MainActivity extends AppCompatActivity {
private List<MyShuJu.NewslistBean> data = new ArrayList<>();
private List<String> list = new ArrayList<>();
private XListView xlistview;
private ViewPager viewPager;
private String part= "http://api.tianapi.com/tiyu/?key=36bafe109f1b68cc2c3829db69c7c180&num=";
private int index = 3;
private String url=part+index;
private int type=1;
private DisplayImageOptions option;
private Myadapter myadapter;
@SuppressLint("HandlerLeak")
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what == 0){
int currentItem = viewPager.getCurrentItem();
viewPager.setCurrentItem(currentItem+1);
handler.sendEmptyMessageDelayed(0,2000);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化图片
ImageLoaderutils.initImageLoader(MainActivity.this);
option = ImageLoaderutils.getImageOption(MainActivity.this);
//找控件
xlistview = findViewById(R.id.xlistview);
viewPager = findViewById(R.id.viewpager);
//viewpager
Newviewpager();
//xlistview
NewXlistview();
//xlistview获取参数与实例化适配器
requestData();
}
//xlistview相关操作
private void NewXlistview() {
xlistview.setPullRefreshEnable(true);
xlistview.setPullLoadEnable(true);
xlistview.setXListViewListener(new XListView.IXListViewListener() {
@Override
public void onRefresh() {
index=3;
url=part+index;
type=1;
requestData();
}
@Override
public void onLoadMore() {
index++;
url=part+index;
type=2;
requestData();
}
});
//XListView的长摁事件
xlistview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
intent.putExtra("url",data.get(position-1).getUrl());
startActivity(intent);
return true;
}
});
}
//xlistview获取参数与实例化适配器
private void requestData() {
MyNetTask task = new MyNetTask(new MyNetTask.IcallBack() {
@Override
public void getJsonData(String jsonStr) {
Gson gson = new Gson();
MyShuJu myShuJu = gson.fromJson(jsonStr, MyShuJu.class);
if (type==1)
{
data.clear();
}
data.addAll(myShuJu.getNewslist());
if (myadapter==null)
{
myadapter = new Myadapter();
xlistview.setAdapter(myadapter);
}else {
myadapter.notifyDataSetChanged();
}
if (type==1)
{
xlistview.stopRefresh();
}else {
xlistview.stopLoadMore();
}
}
});
task.execute(url);
}
//viewpager相关操作
private void Newviewpager() {
MyNetTask task = new MyNetTask(new MyNetTask.IcallBack() {
@Override
public void getJsonData(String jsonStr) {
Gson gson = new Gson();
MypagerBean myShuJu = gson.fromJson(jsonStr, MypagerBean.class);
List<MypagerBean.NewslistBean> newslist = myShuJu.getNewslist();
for (int i = 0 ;i<newslist.size();i++){
String picUrl = newslist.get(i).getPicUrl();
list.add(picUrl);
}
viewPager.setAdapter(new MyPagerAdapter());
viewPager.setCurrentItem(list.size()*10000);
handler.sendEmptyMessageDelayed(0,2000);
}
});
task.execute("https://api.tianapi.com/wxnew/?key=48a7d7193e11bd2dd4a683b6e2f90a4f&num=10&page=1");
}
//ViewPager的适配器
class MyPagerAdapter extends PagerAdapter{
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView imageView = new ImageView(MainActivity.this);
ImageLoader.getInstance().displayImage(list.get(position%list.size()),imageView,option);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
container.addView(imageView);
return imageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View)object);
}
}
//xlistview的适配器
class Myadapter extends BaseAdapter{
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
if(position%2==0){
return 0;
}else{
return 1;
}
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
int itemViewType = getItemViewType(i);
if(itemViewType == 0){
ViewHolder0 holder0;
if(view == null){
view = View.inflate(MainActivity.this,R.layout.listview0,null);
holder0= new ViewHolder0();
holder0.tu = view.findViewById(R.id.tu_list0);
holder0.name = view.findViewById(R.id.name_list0);
view.setTag(holder0);
}else{
holder0 = (ViewHolder0) view.getTag();
}
ImageLoader.getInstance().displayImage(data.get(i).getPicUrl(),holder0.tu,option);
holder0.name.setText(data.get(i).getTitle());
}else{
ViewHolder1 holder1;
if(view == null){
view = View.inflate(MainActivity.this,R.layout.listview1,null);
holder1= new ViewHolder1();
holder1.name = view.findViewById(R.id.name_list1);
view.setTag(holder1);
}else{
holder1 = (ViewHolder1) view.getTag();
}
holder1.name.setText(data.get(i).getTitle());
}
return view;
}
class ViewHolder0{
ImageView tu;
TextView name;
}
class ViewHolder1{
TextView name;
}
}
}