TabLayout横向滑动,DrawerLayout侧滑,PullToRefreshListView上拉刷新下拉加载联用

本文介绍了如何在Android应用中将TabLayout的横向滑动、DrawerLayout的侧滑菜单以及PullToRefreshListView的上拉刷新和下拉加载功能进行集成和联动使用,提供了一个实现这种复杂交互的实例。
摘要由CSDN通过智能技术生成

Activity

public class MainActivity extends AppCompatActivity {
   ViewPager vp_ma; //ViewPager
    LbUtils Lu;//数据请求的包
    LbBean lb; //LbBean包
    LbApdata lbApdata; //轮播图的适配器
    List<ImageView> list; //用于存放轮播图的图片额集合
    List<LbBean.NewslistBean> list1; //轮播图的bena包
    private List<ImageView> imagesList;  //用于存放小圆点的集合
    LinearLayout  linearLayout;  //小园点的布局控件
    Button bt_ma; //Button按钮用于实现跳转
    //handler机制
        //用于实现无限轮播
            private Handler handler = new Handler(){
                public void handleMessage(Message msg) {
                    //获取当前条目
                    int index = vp_ma.getCurrentItem();
                    //向右轮播
                    vp_ma.setCurrentItem(index+=1);
                    //间隔2秒
                    handler.sendEmptyMessageDelayed(1,1000);//轮播图轮播的速度
                };
            };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找控件
        vp_ma = (ViewPager) findViewById(R.id.vp_ma);
        linearLayout = (LinearLayout) findViewById(R.id.linearLayout);
        bt_ma = (Button) findViewById(R.id.bt_ma);
        getBeanByGson();
        //viewPager页面改变的监听事件  小圆点的监听
        vp_ma.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
            @Override
            public void onPageSelected(int position) {
                //如果选中了这一页,,,当前小圆点红色,,,否则绿色
                for (int i = 0;i<imagesList.size();i++){
                    if (i== position%imagesList.size()){
                        imagesList.get(i).setImageResource(R.drawable.doc_select);
                    }else {
                        imagesList.get(i).setImageResource(R.drawable.doc_select_no);
                    }
                }
            }
            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
        //给Button一个点击事件  用于跳转
        bt_ma.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,Activity.class);
                startActivity(intent);
            }
        });
    }
    //轮播图的解析
    public void getBeanByGson() {
        // 使用该方法得到了一个 Json的字符输入流
        new AsyncTask<String, String, String>() {
            @Override
            protected String doInBackground(String... strings) {
                String reader = LbUtils.getNetDataStr();
                return reader;
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                // 使用Gson把该字符输入流转换成JavaBean
                Gson gson = new Gson();
                lb = gson.fromJson(s, LbBean.class);
                list = new ArrayList<ImageView>();
                list1 = new ArrayList<>();
                list1.addAll(lb.getNewslist());
                for (int i = 0; i < list1.size(); i++) {
                    ImageView imageView = new ImageView(MainActivity.this);
                    imageView.setScaleType(ImageView.ScaleType.FIT_XY);
                    ImageLoader.getInstance().displayImage(list1.get(i).getPicUrl(), imageView);
                    list.add(imageView);
                }
                initDoc();
                lbApdata = new LbApdata(list);
                vp_ma.setAdapter(lbApdata);
                handler.sendEmptyMessageDelayed(1, 1000);//轮播图轮播的速度
            }
        }.execute();
    }
    private void initDoc() {
        //首先需要一个集合记录这些小圆点的图片,,,,当页面切换的时候,可以从集合中取出imageView进行显示图片的设置
        imagesList = new ArrayList<>();
        linearLayout.removeAllViews();//清空/移除所有的view
        for (int i = 0;i<list.size();i++){
            ImageView imageView = new ImageView(MainActivity.this);
            if (i==0){//显示第一页,,,红的
                imageView.setImageResource(R.drawable.doc_select);
            }else {//绿的
                imageView.setImageResource(R.drawable.doc_select_no);
            }
            //添加到集合
            imagesList.add(imageView);
            //加入到线性布局中显示
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
            params.setMargins(5,0,5,0);//这是小圆点间距
            linearLayout.addView(imageView,params);//把小圆点存放到布局中
        }


    }

}
Activity布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.yuekaolx.MainActivity">
  <android.support.v4.view.ViewPager
      android:id="@+id/vp_ma"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
  </android.support.v4.view.ViewPager>
  <LinearLayout
      android:id="@+id/linearLayout"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignBottom="@+id/vp_ma"
      android:layout_centerHorizontal="true"
      android:layout_marginBottom="20dp"
      android:orientation="horizontal">
  </LinearLayout>
  <Button
      android:id="@+id/bt_ma"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="进入主界面"

      android:layout_alignParentBottom="true"
      android:layout_alignParentRight="true"
      android:layout_alignParentEnd="true" />
</RelativeLayout>

跳转后页面 TabLayout
public class Activity extends AppCompatActivity {
    TabLayout tab; //横向布局
    ViewPager vp_ac;//ViewPage
    List<String> listStr; //用于存放添加Fragment的结合
    List<Fragment> listTv;//用于存放Fragment的集合
    private ListView lv; //侧滑的控件
    private DrawerLayout drawerLayout; //侧滑
    List<PullBean.ResultBean.ListBean> lsit;  //PuiiBean的结合
    PullBean Pb;  //PullBean包
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_);
        //找控件
        tab = (TabLayout) findViewById(R.id.tab);
        vp_ac = (ViewPager) findViewById(R.id.vp_ac);
        ListView lv = (ListView) findViewById(R.id.lv);
        //侧滑的集合
        List<String> list = new ArrayList<>();
        //给侧滑页面添加数据
        list.add("数据1");
        list.add("数据2");
        list.add("数据3");
        //侧滑的适配器
       ArrayAdapter<String> array = new ArrayAdapter<String>(Activity.this,
               android.R.layout.simple_list_item_1, list);
        lv.setAdapter(array);

        init(); //侧滑的数据调用
        //TabLayout的横向布局  添加数据
        listStr = new ArrayList();
        listStr.add("美女");
        listStr.add("段子");
        listStr.add("社会");
        listStr.add("汽车");
        listStr.add("博客");
        listStr.add("前端");
        listStr.add("公司");
        listStr.add("资讯");
        listStr.add("视频");
        listStr.add("文学");
        listTv = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            listTv.add(new NewsFragment(listStr.get(i)));
        }
        vp_ac.setAdapter(new MyAdapter(getSupportFragmentManager()));
        //ViewpAge的预加载解决方法
        vp_ac.setOffscreenPageLimit(listTv.size());
        //TabLayout和ViewPage进行联动
        tab.setupWithViewPager(vp_ac);
    }
    //ViewPage的适配器
    class MyAdapter extends FragmentPagerAdapter {

        public MyAdapter(FragmentManager fm) {
            super(fm);
        }
        @Override
        public Fragment getItem(int position) {
            return listTv.get(position);
        }
        @Override
        public int getCount() {
            return listTv.size();
        }
        @Override
        public CharSequence getPageTitle(int position) {
            return listStr.get(position);
        }
    }
    //侧滑
    private void init() {
        drawerLayout = (DrawerLayout) findViewById(R.id.mydraw);
        lv = (ListView) findViewById(R.id.lv);
        //点击lv的条目,关闭侧滑,在主界面显示相关详细
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                drawerLayout.closeDrawer(lv);//关闭侧滑
                //改变主界面
                String str = parent.getItemAtPosition(position).toString();
            }
        });
    }

}

 
TabLayout布局
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="com.example.yuekaolx.Activity">
    <android.support.design.widget.TabLayout
        android:id="@+id/tab"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabGravity="center"
        app:tabIndicatorColor="@color/colorAccent"
        app:tabMode="scrollable"
        app:tabSelectedTextColor="@color/colorPrimaryDark"
        app:tabTextColor="@color/colorPrimary"
        >
    </android.support.design.widget.TabLayout>

    <android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/mydraw"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent"
        >
        <android.support.v4.view.ViewPager
            android:id="@+id/vp_ac"
            android:layout_below="@+id/tab"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </android.support.v4.view.ViewPager>
        <ListView
            android:id="@+id/lv"
            android:layout_width="240sp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:choiceMode="singleChoice"
            android:divider="#f00"
            android:dividerHeight="1dp"
            android:background="#fff"
            />
    </android.support.v4.widget.DrawerLayout>
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>

TabLyout的Fragment数据
public class NewsFragment extends Fragment {
    PullToRefreshListView refresh_list_view;  //用于实现上拉刷新下拉加载
    List<PullBean.ResultBean.ListBean> list = new ArrayList<>(); //上拉刷新下拉啊加载的结合
    boolean boo;
    int NUM=1; //实现刷新的时候可以加载更多和刷新不同的数据
    LbUtils lb; //数据的请求包
    PullBean PB; //PullBean包
    MyApdata myApdata;  //适配器
    ListView  lv;
    public NewsFragment(String s) {
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        //找布局
        View view = View.inflate(getActivity(),R.layout.fragment,null);
        //找控件
         refresh_list_view = view.findViewById(R.id.refresh_list_view);
        //设置打开文件方式
        refresh_list_view.setMode(PullToRefreshBase.Mode.BOTH);
        lv = view.findViewById(R.id.lv);

        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //这用于实现上拉刷新下拉加载
        ILoadingLayout startLabels = refresh_list_view
                .getLoadingLayoutProxy(true, false);
        startLabels.setPullLabel("下拉刷新");
        startLabels.setRefreshingLabel("正在拉");
        startLabels.setReleaseLabel("放开刷新");
        ILoadingLayout endLabels = refresh_list_view.getLoadingLayoutProxy( false, true);
        endLabels.setPullLabel("上拉刷新");
        endLabels.setRefreshingLabel("正在载入...");
        endLabels.setReleaseLabel("放开刷新...");
        ListGson();
        //PullToRefreshListView给他一个监听用于监听上拉还是下拉
        refresh_list_view.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
            @Override
            public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
                NUM++;
               boo = true;
                ListGson();
            }
            @Override
            public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
              NUM++;
               boo = false;
                ListGson();
            }
        });
  }
    //异步请求数据
    public void ListGson(){
        new AsyncTask<String,String,String>(){
            @Override
            protected String doInBackground(String... strings) {
                String read = LbUtils.getNetData();
                return read;
            }
            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
                Gson gson = new Gson();
                PullBean PB = gson.fromJson(result, PullBean.class);
                list.addAll(0,PB.getResult().getList());//把数据存放到集合中
                setAdapter(list);//发送集合
                refresh_list_view.onRefreshComplete();
            }
        }.execute();
    }
    //给适配器做判断
    public void setAdapter(List<PullBean.ResultBean.ListBean> list){
        if(myApdata == null){
            myApdata = new MyApdata(list,getActivity());
            refresh_list_view.setAdapter(myApdata);
        }else{

            myApdata.notifyDataSetChanged();
        }
    }

}

布局文件
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.handmark.pulltorefresh.library.PullToRefreshListView
        xmlns:ptr="http://schemas.android.com/apk/res-auto"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:id="@+id/refresh_list_view"
        ptr:ptrDrawable="@drawable/default_ptr_flip"
        ptr:ptrAnimationStyle="flip"
        ptr:ptrHeaderBackground="#383838"
        ptr:ptrHeaderTextColor="#FFFFFF"  >
    </com.handmark.pulltorefresh.library.PullToRefreshListView>
</LinearLayout>

轮播适配器
 
//轮播图的适配器
public class LbApdata extends PagerAdapter{

    List<ImageView> list = new ArrayList<>();
    public LbApdata(List<ImageView> list) {
        this.list = list;
    }
    @Override
    public int getCount() {
        return Integer.MAX_VALUE;//Integer.MAX_VALUE可实现无限轮播
    }
    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;//固定的
    }
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        position %= list.size();
        container.addView(list.get(position));
        return list.get(position);
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }
}

PullToRefreshListView适配器

public class MyApdata extends BaseAdapter {
    //构造参数
    List<PullBean.ResultBean.ListBean> list;
    //创建上下文
    Context context;

    public MyApdata(List<PullBean.ResultBean.ListBean> list, Context context) {
        this.list = list;
        this.context = context;
    }
    //有几个条目类型
    @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 list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder holder=null;
        ViewHolder2 holder2 = null;
        int type = getItemViewType(i);
        //进行多条目的判断
        switch (type){
            //如果为0,则是第一种布局
            case 0:
                if(view==null){
                    view=View.inflate(context,R.layout.itme_one,null);
                    holder=new ViewHolder();
                    holder.iv_one= (ImageView) view.findViewById(R.id.iv_one);
                    holder.tv_one= (TextView) view.findViewById(R.id.tv_one);
                    view.setTag(holder);
                }else{
                    holder= (ViewHolder) view.getTag();
                }
                holder.tv_one.setText(list.get(i).getTitle());
                ImageLoader.getInstance().displayImage(list.get(i).getFirstImg(),holder.iv_one);
                break;
            //如果为1,则是第二种布局
            case 1:
                if(view==null){
                    view=View.inflate(context,R.layout.itme_two,null);
                    holder2=new ViewHolder2();
                    holder2.tv_two= (TextView) view.findViewById(R.id.tv_two);
                    view.setTag(holder2);
                }else{
                    holder2= (ViewHolder2) view.getTag();
                }
                holder2.tv_two.setText(list.get(i).getTitle());
                break;
        }
        DisplayImageOptions build = new DisplayImageOptions.Builder()
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .showImageForEmptyUri(R.mipmap.ic_launcher)
                .showImageOnFail(R.mipmap.ic_launcher)
                .showImageOnLoading(R.mipmap.ic_launcher)
                .build();
        return view;
    }
    //优化XlistView
    class ViewHolder{
        ImageView iv_one;
        TextView tv_one;
    }
    class ViewHolder2{
        TextView tv_two ;
      }
}

数据请求包
public class LbUtils {
        //无限轮播的数据请求
        public static String getNetDataStr() {
            String json = null;
            try {
                URL url = new URL(
                        "https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10");
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                int code = conn.getResponseCode();
                if (code == 200) {
                    InputStream is = conn.getInputStream();
                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    int len = -1;
                    byte[] buff = new byte[1024];
                    while((len = is.read(buff)) != -1){
                        bos.write(buff,0,len);
                    }
                    json = new String(bos.toByteArray());
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return json;
        }

//上拉刷新下拉加载的数据请求
    public static String getNetData() {
        try {
            URL url = new URL(
                    "http://v.juhe.cn/weixin/query?key=88f7bbc507e3ecacfaeab2b47dd8936f");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //设置
            conn.setRequestMethod("GET");
            conn.setReadTimeout(5000);
            conn.setConnectTimeout(5000);

            int code = conn.getResponseCode();
            if (code == 200) {
                InputStream is = conn.getInputStream();

                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                int len = -1;
                byte[] buff = new byte[1024];
                while((len = is.read(buff)) != -1){
                    bos.write(buff,0,len);
                }

                String json = new String(bos.toByteArray());
                return json;
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "";
    }

    }

温馨提示:联网权限,读取权限,第三方架包,清单文件配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值