//需要的权限
<uses-permission android:name="android.permission.INTERNET" />网络
/* design */
implementation 'com.android.support:design:27.1.1'
/* xlistviewlib */
implementation project(':xlistviewlib')
/* imageloader */
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
/* guava */
implementation 'com.google.guava:guava:16.0.1'
/* gson */
implementation 'com.google.code.gson:gson:2.2.4'
//HttpUtils
public class HttpUtils {
private static final HttpUtils ourInstance = new HttpUtils();
public static HttpUtils getInstance() {
return ourInstance;
}
private HttpUtils() {
}
/**
* 请求网络数据的方法
*
* @param url 请求的url
* @param callback 回调
*/
public void getDataFromServer(String url, NetCallback callback) {
new LoadDataTask(callback).execute(url);
}
/**
* 请求网络数据的异步任务类
*/
class LoadDataTask extends AsyncTask<String, Void, String> {
private NetCallback netCallback;
public LoadDataTask(NetCallback netCallback) {
this.netCallback = netCallback;
}
@Override
protected String doInBackground(String... strings) {
try {
URL url = new URL(strings[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
return CharStreams.toString(new InputStreamReader(connection.getInputStream(), "UTF-8"));
}
} catch (Exception e) {
e.printStackTrace();
if (netCallback != null) {
netCallback.onError(e.getMessage());
}
}
return null;
}
@Override
protected void onPostExecute(String s) {
if (netCallback != null) {
if (TextUtils.isEmpty(s)) {
netCallback.onError("服务器没有响应数据");
} else {
netCallback.onSuccess(s);
}
}
}
}
/**
* 网络回调
*/
public interface NetCallback {
void onSuccess(String result);
void onError(String errorMsg);
}
}
//上面是utils的
//Fragment
public class ChannelFragment extends Fragment implements HttpUtils.NetCallback, XListView.IXListViewListener {
public static final String TAG = ChannelFragment.class.getSimpleName();
private XListView xListView;
private final int COUNT = 10;
private int page = 1;
private HttpUtils instance;
private String url;
private String countUrl;
private ChannelAdapter adapter;
private List<ChannelResultBean.ResultsBean> resultsBeanList;
public ChannelFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_channel, container, false);
xListView = view.findViewById(R.id.x_list_view);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
xListView.setPullLoadEnable(true);
xListView.setPullRefreshEnable(true);
xListView.setXListViewListener(this);
resultsBeanList = new ArrayList<>();
adapter = new ChannelAdapter(getActivity(), resultsBeanList);
xListView.setAdapter(adapter);
xListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ChannelResultBean.ResultsBean item = adapter.getItem(position);
Intent intent = new Intent(getActivity(), WebActivity.class);
intent.putExtra("url", item.getUrl());
startActivity(intent);
}
});
url = getArguments().getString("url");
instance = HttpUtils.getInstance();
countUrl = url + "/" + COUNT + "/";
instance.getDataFromServer(countUrl + page, this);
}
/**
* 创建实例
*
* @param url
* @return
*/
public static Fragment newInstance(String url) {
ChannelFragment fragment = new ChannelFragment();
Bundle args = new Bundle();
args.putString("url", url);
fragment.setArguments(args);
return fragment;
}
@Override
public void onSuccess(String result) {
Log.i(TAG, "result url :" + result);
Gson gson = new Gson();
ChannelResultBean resultBean = gson.fromJson(result, ChannelResultBean.class);
if (page == 1) {
resultsBeanList.clear();
}
resultsBeanList.addAll(resultBean.getResults());
adapter.notifyDataSetChanged();
// 关闭刷新
xListView.stopLoadMore();
xListView.stopRefresh(true);
//xListView.setAdapter(adapter);
}
@Override
public void onError(String errorMsg) {
}
@Override
public void onRefresh() {
page = 1;
instance.getDataFromServer(countUrl + page, this);
}
@Override
public void onLoadMore() {
page++;
instance.getDataFromServer(countUrl + page, this);
}
}
//上面是Fragment的
//Application
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
initImageLoader();
}
/**
* 初始化ImageLoader
*/
private void initImageLoader() {
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration
.Builder(getApplicationContext())
.defaultDisplayImageOptions(options())
.build();
ImageLoader.getInstance().init(configuration);
}
private DisplayImageOptions options() {
DisplayImageOptions options = new DisplayImageOptions
.Builder()
.cacheOnDisk(true)
.cacheInMemory(true)
.displayer(new SimpleBitmapDisplayer())
.build();
return options;
}
}
//上面是Application
//adapter
public class ChannelAdapter extends BaseAdapter {
private Context context;
private List<ChannelResultBean.ResultsBean> resultsBeanList;
private final int ITEM_TYPE_ONE = 1;
private final int ITEM_TYPE_TWO = 2;
private final int ITEM_TYPE_THREE = 3;
public ChannelAdapter(Context context, List<ChannelResultBean.ResultsBean> resultsBeanList) {
this.context = context;
this.resultsBeanList = resultsBeanList;
}
@Override
public int getCount() {
return resultsBeanList.size();
}
@Override
public ChannelResultBean.ResultsBean getItem(int position) {
return resultsBeanList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int viewType = getItemViewType(position);
switch (viewType) {
case ITEM_TYPE_THREE:
ViewHolderThree holderThree = null;
if (convertView == null) {
holderThree = new ViewHolderThree();
convertView = LayoutInflater.from(context).inflate(R.layout.item_type_three, null, false);
holderThree.textView = convertView.findViewById(R.id.tv_desc);
holderThree.imageView = convertView.findViewById(R.id.iv_image);
holderThree.imageViewTwo = convertView.findViewById(R.id.iv_image2);
holderThree.imageViewThree = convertView.findViewById(R.id.iv_image3);
convertView.setTag(holderThree);
} else {
holderThree = (ViewHolderThree) convertView.getTag();
}
// 设置数据
holderThree.textView.setText(resultsBeanList.get(position).getDesc());
// 设置图片
ImageLoader.getInstance().displayImage(resultsBeanList.get(position).getImages().get(0), holderThree.imageView);
ImageLoader.getInstance().displayImage(resultsBeanList.get(position).getImages().get(1), holderThree.imageViewTwo);
ImageLoader.getInstance().displayImage(resultsBeanList.get(position).getImages().get(2), holderThree.imageViewThree);
break;
case ITEM_TYPE_TWO:
ViewHolderTwo holderTwo = null;
if (convertView == null) {
holderTwo = new ViewHolderTwo();
convertView = LayoutInflater.from(context).inflate(R.layout.item_type_two, null, false);
holderTwo.textView = convertView.findViewById(R.id.tv_desc);
holderTwo.imageView = convertView.findViewById(R.id.iv_image);
convertView.setTag(holderTwo);
} else {
holderTwo = (ViewHolderTwo) convertView.getTag();
}
String type = resultsBeanList.get(position).getType();
// 设置数据
holderTwo.textView.setText(resultsBeanList.get(position).getDesc());
// 设置图片
if ("福利".equals(type)) {
ImageLoader.getInstance().displayImage(resultsBeanList.get(position).getUrl(), holderTwo.imageView);
} else {
ImageLoader.getInstance().displayImage(resultsBeanList.get(position).getImages().get(0), holderTwo.imageView);
}
break;
case ITEM_TYPE_ONE:
ViewHolder viewHolder = null;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.item_type_one, null, false);
viewHolder.textView = convertView.findViewById(R.id.tv_desc);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// 设置数据
viewHolder.textView.setText(resultsBeanList.get(position).getDesc());
break;
}
return convertView;
}
@Override
public int getItemViewType(int position) {
List<String> images = resultsBeanList.get(position).getImages();
String type = resultsBeanList.get(position).getType();
if ("福利".equals(type)) {
return ITEM_TYPE_TWO;
}
if (images != null && images.size() > 2) {
// 三张图片
return ITEM_TYPE_THREE;
} else if (images != null && images.size() > 0 && images.size() < 2) {
// 一张图片
return ITEM_TYPE_TWO;
} else {
return ITEM_TYPE_ONE;
}
// return ITEM_TYPE_ONE;
}
@Override
public int getViewTypeCount() {
return 4;
}
class ViewHolder {
TextView textView;
}
class ViewHolderTwo {
TextView textView;
ImageView imageView;
}
class ViewHolderThree {
TextView textView;
ImageView imageView;
ImageView imageViewTwo;
ImageView imageViewThree;
}
}
//上面是adapter
//动画页面
public class SplashActivity extends Activity implements Animation.AnimationListener {
private RelativeLayout layout;
private AlphaAnimation animation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_splash);
layout = findViewById(R.id.rl_root);
animation = new AlphaAnimation(0, 1);
animation.setDuration(3000);
animation.setAnimationListener(this);
layout.startAnimation(animation);
}
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
/*
动画执行结束
*/
toMain();
}
/**
* 跳转到主界面
*/
private void toMain() {
startActivity(new Intent(this, MainActivity.class));
finish();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
}
//上面是动画页面
//这是跳转后的页面
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private DrawerLayout drawerLayout;
private ImageView ivHead;
private TabLayout tabs;
private ViewPager mainPagers;
private List<ChannelBean> channelBeanList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
drawerLayout = findViewById(R.id.drawer_layout);
ivHead = findViewById(R.id.iv_head);
tabs = findViewById(R.id.tabs);
mainPagers = findViewById(R.id.main_pagers);
ivHead.setOnClickListener(this);
// 创建标题
channelBeanList = new ArrayList<>();
channelBeanList.add(new ChannelBean("Android", "https://gank.io/api/data/Android"));
channelBeanList.add(new ChannelBean("iOS", "https://gank.io/api/data/iOS"));
channelBeanList.add(new ChannelBean("all", "https://gank.io/api/data/all"));
channelBeanList.add(new ChannelBean("福利", "https://gank.io/api/data/福利"));
channelBeanList.add(new ChannelBean("休息视频", "https://gank.io/api/data/休息视频"));
channelBeanList.add(new ChannelBean("拓展资源", "https://gank.io/api/data/拓展资源"));
channelBeanList.add(new ChannelBean("前端", "https://gank.io/api/data/前端"));
// 初始化页面
mainPagers.setAdapter(new MainPagerAdapter(getSupportFragmentManager()));
tabs.setupWithViewPager(mainPagers);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.iv_head:
operatorDrawerLayout();
break;
}
}
/**
* 操作侧滑菜单
*/
private void operatorDrawerLayout() {
if (drawerLayout.isDrawerOpen(Gravity.START)) {
drawerLayout.closeDrawer(Gravity.START);
} else {
drawerLayout.openDrawer(Gravity.START);
}
}
/**
* 主界面ViewPager适配器
*/
class MainPagerAdapter extends FragmentPagerAdapter {
public MainPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return ChannelFragment.newInstance(channelBeanList.get(position).url);
}
@Override
public int getCount() {
return channelBeanList.size();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return channelBeanList.get(position).title;
}
}
}
//上面是跳转后的页面
//webactivity
public class WebActivity extends AppCompatActivity {
private WebView webView;
private FrameLayout flProgress;
private TextView tvPorgress;
private ImageView ivImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web);
webView = findViewById(R.id.web_view);
flProgress = findViewById(R.id.fl_progress);
tvPorgress = findViewById(R.id.tv_progress);
ivImage = findViewById(R.id.iv_image);
webView.setVisibility(View.GONE);
flProgress.setVisibility(View.GONE);
ivImage.setVisibility(View.GONE);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
flProgress.setVisibility(View.VISIBLE);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
flProgress.setVisibility(View.GONE);
}
});
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
tvPorgress.setText(newProgress + "%");
}
});
/* 读取Url */
String url = getIntent().getStringExtra("url");
/* 判断url是网页还是图片 */
if (url.endsWith(".jpg")) {
ivImage.setVisibility(View.VISIBLE);
ImageLoader.getInstance().displayImage(url, ivImage);
} else {
webView.setVisibility(View.VISIBLE);
webView.loadUrl(url);
}
}
}
//上面的是webactivity
//三张图的布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
<TextView
android:id="@+id/tv_desc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@android:style/TextAppearance.StatusBar.Title" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_below="@id/tv_desc">
<ImageView
android:id="@+id/iv_image"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<ImageView
android:id="@+id/iv_image2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<ImageView
android:id="@+id/iv_image3"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
</RelativeLayout>
//上面是三张图的布局
//web的xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Web -->
<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- 进度条 -->
<FrameLayout
android:id="@+id/fl_progress"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="0%" />
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</FrameLayout>
<!-- 图片 -->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
</FrameLayout>
//上面是web的xml
//splash动画的xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/splash"
android:id="@+id/rl_root"/>
//上面是splash动画的xml
//主视图Main的xml
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 主布局 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- 标题布局 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/colorPrimary"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_head"
android:layout_width="50dp"
android:layout_height="match_parent"
android:src="@mipmap/ic_launcher" />
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="GANK"
android:textColor="@android:color/white"
android:textSize="22sp" />
<ImageView
android:layout_width="50dp"
android:layout_height="match_parent" />
</LinearLayout>
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="scrollable" />
<android.support.v4.view.ViewPager
android:id="@+id/main_pagers"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<!-- 侧边菜单 -->
<RelativeLayout
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@drawable/splash">
</RelativeLayout>
</android.support.v4.widget.DrawerLayout>