//主页布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout 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:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!--
一个TabLayout
一个ViewPager
一个侧拉Fragment
-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_weight="9"
/>
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/bouuom_indication"
android:layout_weight="1"
></android.support.design.widget.TabLayout>
</LinearLayout>
<ListView
android:id="@+id/lift_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/colorPrimaryDark"
></ListView>
</android.support.v4.widget.DrawerLayout>
//主页
package com.example.banner;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.ListView;
import com.example.banner.adapter.DrawerAdapter;
import com.example.banner.adapter.MyPagerAdapter;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private DrawerLayout drawerLayout ;
private ViewPager viewPager;
private TabLayout tabLayout;
private ListView lift_listView;
private DrawerAdapter adapter;
private ActionBarDrawerToggle toggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取资源ID Viewpager tablayout
viewPager = findViewById(R.id.viewpager);
tabLayout = findViewById(R.id.bouuom_indication);
//侧拉的listview
lift_listView = findViewById(R.id.lift_list);
//布局的ID
drawerLayout = findViewById(R.id.drawer);
adapter = new DrawerAdapter(this);
//侧拉listView 添加子条目
List<String> list = new ArrayList<>();
list.add("首页");
list.add("中页");
list.add("尾页");
//添加适配器
adapter.setList(list);
//设置适配器
lift_listView.setAdapter(adapter);
//调用方法
initView();
}
//viewpager + tabLayout
private void initView(){
//2 抽屉 listView 左上角的按钮
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
drawerLayout = findViewById(R.id.drawer);
//实例化一个 ActionBarDrawerToggle 并且设置它的侧拉效果
toggle = new ActionBarDrawerToggle(
this,
drawerLayout
,R.string.open_drawer
,R.string.close_drawer);
//设置按钮和侧拉绑定
drawerLayout.addDrawerListener(toggle);
//同步状态 (按钮和侧拉)
toggle.syncState();
//设置适配器 第一层Fragment
viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
//1获取viewpager 让其与tabLayout绑定(点击切换页面,滑动后切换底部按钮)
tabLayout.setupWithViewPager(viewPager);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (toggle.onOptionsItemSelected(item)){
return true;
}
return super.onOptionsItemSelected(item);
}
}
//侧拉De shipeiqi
package com.example.banner.adapter;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.example.banner.R;
import java.util.ArrayList;
import java.util.List;
public class DrawerAdapter extends BaseAdapter {
private Context context;
private List<String> list;
public DrawerAdapter(Context context) {
this.context = context;
list = new ArrayList<>();
}
public void setList(List<String> list) {
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public String getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null){
convertView = View.inflate(context, R.layout.drawer_item,null);
holder = new ViewHolder();
holder.textView = convertView.findViewById(R.id.drawer_text);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setText(getItem(position));
return convertView;
}
class ViewHolder{
TextView textView;
}
}
//TabLayout Adapter
package com.example.banner.adapter;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import com.example.banner.Fragment.ShouyeFragment;
import com.example.banner.Fragment.WeiyeFragment;
import com.example.banner.Fragment.ZhongyeFragment;
public class MyPagerAdapter extends FragmentPagerAdapter {
//设置数据 展示几个Fragment
private String[] list = new String[]{
"首页","中页","尾页"
};
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
//实例化ragment
@Override
public Fragment getItem(int i) {
switch (i){
case 0:
return new ShouyeFragment();
case 1:
return new ZhongyeFragment();
case 2:
return new WeiyeFragment();
default:
return new Fragment();
}
}
//getPageTitle 得到数据相应的位置
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return list[position];
}
//得到数据的长度
@Override
public int getCount() {
return list.length;
}
}
//首页 这里面还有一个Tablayout 和 viewpager
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.banner.R;
import com.example.banner.adapter.SecondAdapter;
public class ShouyeFragment extends Fragment {
//在此页面在写一个tabLayout 和 viewpager
private TabLayout tabLayout;
private ViewPager viewPager;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//得到视图
View view = inflater.inflate(R.layout.shouye,container,false);
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//获取资源ID
tabLayout = view.findViewById(R.id.shouye_tablayout);
viewPager = view.findViewById(R.id.shouye_viewpager);
//Fragment嵌套Fragment,使用getChildFragmentManager()
viewPager.setAdapter(new SecondAdapter(getChildFragmentManager()));
//吧Fragment 与 Tablayout 进行绑定
tabLayout.setupWithViewPager(viewPager);
}
//首页 XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/shouye_tablayout"
android:layout_weight="1"
></android.support.design.widget.TabLayout>
<android.support.v4.view.ViewPager
android:id="@+id/shouye_viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="9">
</android.support.v4.view.ViewPager>
</LinearLayout>
//第二层 Tablayout Viewpager 的适配器
package com.example.banner.adapter;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import com.example.banner.Fragment.SecondFragment.ImageFragment;
import com.example.banner.Fragment.SecondFragment.MusicFragment;
import com.example.banner.Fragment.SecondFragment.NewsFragment;
public class SecondAdapter extends FragmentPagerAdapter {
//设置数组
String[] list = new String[]{
"新闻","歌曲","图片"
};
public SecondAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i){
case 0 :
return new NewsFragment();
case 1:
return new MusicFragment();
case 2:
return new ImageFragment();
default:
return new Fragment();
}
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return list[position];
}
@Override
public int getCount() {
return list.length;
}
}
//新闻 数据的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<com.handmark.pulltorefresh.library.PullToRefreshListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/pullListView"
></com.handmark.pulltorefresh.library.PullToRefreshListView>
</LinearLayout>
//新闻数据的适配器
package com.example.banner.adapter;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.banner.Bean.Bean;
import com.example.banner.R;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.List;
public class NewsDataAdapter extends BaseAdapter {
//实例化Bean里的集合数据
private List<Bean.DataBean> mlist;
//联系上下文
private Context context;
//因为是多条目所以设置条目类型的总数
private static final int COUNTS = 2;
private int ITEN_TYPE = 1;
private int ITEM_TYPE = 0;
public NewsDataAdapter(Context context) {
this.context = context;
mlist = new ArrayList<>();
}
//下拉刷新
public void setMlist(List<Bean.DataBean> list) {
//先清空
this.mlist.clear();
if (list != null){
//再添加
mlist.addAll(list);
}
//刷新数据
notifyDataSetChanged();
}
//加载
public void addMlist(List<Bean.DataBean> list) {
//List<Bean.DataBean> list 这个集合里没东西才能添加数据
if (list != null){
mlist.addAll(list);
}
//刷新
notifyDataSetChanged();
}
//多条目 从写两个方法getItemViewType,getViewTypeCount
//当前的视图类型
@Override
public int getItemViewType(int position) {
return position%2;
}
//给到视图类型的总数
@Override
public int getViewTypeCount() {
//返回一个总数 总数是两个
return COUNTS;
}
//解析出来的集合里的总数
@Override
public int getCount() {
return mlist.size();
}
//得到字条目的位置
@Override
public Bean.DataBean getItem(int position) {
return mlist.get(position);
}
@Override
public long getItemId(int position) {
//条目的ID
return position;
}
//获取视图
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//得到寄存器
NewViewHolder holder;
//当convertView 为空是
if (convertView == null){
//设置视图 当条目类型为1时用 一种条目 当为0时用用另一种条目
// 0 和 1 是怎么来的呢?
//position%2; 就只能得到 0 和 1
convertView = View.inflate(context,getItemViewType(position)==ITEN_TYPE?R.layout.news_item1:R.layout.news_item2,null);
//实例化 和older
holder = new NewViewHolder(convertView);
convertView.setTag(holder);
}else {
//得到数据
holder = (NewViewHolder) convertView.getTag();
}
//判断条目类型 加载不同的诗句
if (getItemViewType(position) == ITEN_TYPE){
holder.bindData1(mlist.get(position));
}else {
holder.bindData2(mlist.get(position));
}
return convertView;
}
//写一个寄存器 把控件都存进来
class NewViewHolder{
TextView news_id,news_title,news_summary;
ImageView pic_url;
//获取 资源ID
public NewViewHolder(View itemView){
pic_url = itemView.findViewById(R.id.pic_url);
news_id = itemView.findViewById(R.id.news_id);
news_title = itemView.findViewById(R.id.news_title);
news_summary = itemView.findViewById(R.id.news_summary);
//把获取过来的数据存进控件
itemView.setTag(this);
}
//绑定第一种 条目
private void bindData1(Bean.DataBean dataBean){
news_id.setText(dataBean.getNews_id());
ImageLoader.getInstance().displayImage(dataBean.getPic_url(),pic_url);
}
//绑定第一种 条目
private void bindData2(Bean.DataBean dataBean){
news_title.setText(dataBean.getNews_title());
news_summary.setText(dataBean.getNews_summary());
}
}
}
//新闻Fragment
package com.example.banner.Fragment.SecondFragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
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.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.banner.Bean.Bean;
import com.example.banner.NetUtil.NetUtils;
import com.example.banner.R;
import com.example.banner.adapter.NewsDataAdapter;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
public class NewsFragment extends Fragment {
//得到PullToRefreshListView
private PullToRefreshListView ptrListView;
//设置适配器
private NewsDataAdapter adapter;
//设置页数 往后有用
private int pager;
@Nullable
@Override
//
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.news,container,false);
//得到视图 获取资源ID
ptrListView = view.findViewById(R.id.pullListView);
adapter = new NewsDataAdapter(getActivity());
ptrListView.setAdapter(adapter);
//初始化pager
pager = 1;
//同时支持刷新 加载
ptrListView.setMode(PullToRefreshBase.Mode.BOTH);
//设置PullToRefreshListView它的监听 加载出来 刷新 加载两个方法
ptrListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
//刷新
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
pager = 1;
initData();
}
//加载
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
//调用方法
initData();
}
});
//调用方法
initData();
//返回值
return view;
}
//获得接口
private String urlStr = "http://api.expoon.com/AppNews/getNewsList/type/1/p/%d";
//提供加载数据的方法
private void initData(){
//利用接口回调 获取数据
NetUtils.getInstance().getqusert(String.format(urlStr, pager), Bean.class, new NetUtils.CallBak<Bean>() {
//判断是否请求成功
@Override
public void onSuccess(Bean bean) {
//当bean 里没有数据的时候 或者没有网的 时候 吐司一下 请求数据失败
if (bean ==null || !bean.isSuccess()){
Toast.makeText(getActivity(),"请求数据失败",Toast.LENGTH_SHORT).show();
}else {
//当没有问题后 判断是加载 还是 刷新
if (pager ==1){
//当数据的页数是一时 就是刷新数据
adapter.setMlist(bean.getData());
}else {
//否则是加载
adapter.addMlist(bean.getData());
}
//加载后 不断更新新的数据 数据的页数就要不断增加
pager++;
}
//同事停止刷新加载
ptrListView.onRefreshComplete();
}
});
}
}