ViewPager+TabLayout

//主页布局

<?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();
            }

        });
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 ViewPager2+TabLayout+Fragment 实现页面切换,需要以下步骤: 1. 在 XML 布局文件中定义 ViewPager2 和 TabLayout,并将它们嵌套在一个父布局中。 ```xml <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.material.tabs.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMode="scrollable" app:tabGravity="center"/> <androidx.viewpager2.widget.ViewPager2 android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@id/tab_layout" app:layout_constraintBottom_toBottomOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout> ``` 2. 创建 Fragment,并实现 ViewPager2 的适配器。 ```kotlin class MyFragmentAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) { private val fragmentList = listOf( FirstFragment(), SecondFragment(), ThirdFragment() ) override fun getItemCount() = fragmentList.size override fun createFragment(position: Int) = fragmentList[position] } ``` 3. 在 Activity 或 Fragment 中,初始化 ViewPager2 和 TabLayout,并将适配器设置给 ViewPager2。 ```kotlin val viewPager: ViewPager2 = findViewById(R.id.view_pager) val tabLayout: TabLayout = findViewById(R.id.tab_layout) val adapter = MyFragmentAdapter(this) viewPager.adapter = adapter TabLayoutMediator(tabLayout, viewPager) { tab, position -> tab.text = "Tab ${position + 1}" }.attach() ``` 这样就可以实现 ViewPager2+TabLayout+Fragment 实现页面切换了。注意,TabLayoutMediator 是用来关联 TabLayout 和 ViewPager2 的,它的第一个参数是 TabLayout,第二个参数是 ViewPager2,第三个参数是一个回调函数,用来设置 TabLayout 的标签文本。在最后一行调用 attach() 方法即可完成关联。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值