TabLayout+Fragment+PullToRefresh

作者: 职度 | 来源:发表于2019-08-23 18:35 被阅读167次
    效果1

    技术点描述:

    1.MVC架构,分包明确、抽取Activity基类和Fragment基类
    2.异步 AsyncTask+ HttpUrlConnection + 单例模式 + 接口回调封装网络框架工具类(get、文本、图片)
    3.TableLayout + Fragment + ViewPager封装UI框架
    4.Json数据解析
    5.PullToRefresh下拉刷新、上拉加载
    6.WebView加载互联网页面、WebSettings及WebViewClient的使用

    1.androidmanifest.xml添加权限

     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    2. 简单 封装 BaseFragment

    public abstract class BaseActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(getLayoutId());
            initdata();
            initview();
        }
        public abstract int getLayoutId();
        public abstract void initdata();
        public abstract void initview();
    }
    

    3. 简单 封装 BaseFragment

    public abstract class BaseFragment extends Fragment {
    
        private View initid;
    
        @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            initdata();
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            initid = getLayoutId(inflater, container);
            return initid;
        }
        public abstract View getLayoutId(LayoutInflater inflater, ViewGroup container);
        public abstract void initdata();
    }
    

    4. 封装网络请求 HttpURLConnection

    /*
     *Name:fanyanlong
     *Time:15:31
     *Name:Android_zx_week01
     * 单例模式
     */
    
    import android.content.Context;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class HttpUtils {
        private ConnectivityManager connectivityManager;
        private NetworkInfo activeNetworkInfo;
        private URL url;
        private HttpURLConnection httpURLConnection;
        private InputStream inputStream;
        private ByteArrayOutputStream byteArrayOutputStream;
        private byte[] bytes;
      //懒汉式
        //静态变量
       private   static  HttpUtils httpUtils;
        //私有化构造方法
        private  HttpUtils(){
        }
        // 外部访问方法
        public   static  synchronized HttpUtils getInstance(){
              if (httpUtils==null){
                  httpUtils = new HttpUtils();
              }
            return httpUtils;
        }
      //网络状态判断
      public boolean isnetwork(Context context){
          //获取管理类
          connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
          //获取网络状态
          activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
          if(activeNetworkInfo!=null){
              return activeNetworkInfo.isAvailable();
          }
          return false;
      }
        //网络请求 (不可以放主线程)  出现ANR异常
        public  String getData(String path) throws IOException {
            //初始化统一资源定位符
            url = new URL(path);
            //打开网络请求
            httpURLConnection = (HttpURLConnection) url.openConnection();
            //设置请求方式
            httpURLConnection.setRequestMethod("GET");
            //请求超时设置
            httpURLConnection.setConnectTimeout(1000);
            //读取超时设置
            httpURLConnection.setReadTimeout(1000);
            //判断请求
            if(httpURLConnection.getResponseCode()==200){
                //初始化输入流
                inputStream = httpURLConnection.getInputStream();
                //转换流
                byteArrayOutputStream = new ByteArrayOutputStream();
                bytes = new byte[1024];
                int len;
                while ((len=inputStream.read(bytes))!=-1){
                    byteArrayOutputStream.write(bytes,0,len);
                }
                //关闭
                inputStream.close();
            }
            return byteArrayOutputStream.toString();
        }
    

    5.主页面 MainActivity 实现

    public class MainActivity extends BaseActivity {
        private TabLayout tabLayout;
        private ViewPager viewPager;
        private ArrayList<Fragment> fragments;
        private ArrayList<String> strings;
        @Override
        public int getLayoutId() {
            return R.layout.activity_main;
        }
    
        @Override
        public void initdata() {
    
        }
        @Override
        public void initview() {
            tabLayout = findViewById(R.id.table_one);
            viewPager = findViewById(R.id.viewpager_one);
            fragments = new ArrayList<>();
            fragments.add(new TjFragment());
            fragments.add(new RdFragment());
            fragments.add(new BwzxFragment());
            fragments.add(new BjFragment());
            fragments.add(new DmFragment());
            fragments.add(new YlFragment());
            strings = new ArrayList<>();
            strings.add("推荐");
            strings.add("热点");
            strings.add("最新");
            strings.add("北京");
            strings.add("动漫");
            strings.add("娱乐");
            viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
                @Override
                public Fragment getItem(int position) {
                    return fragments.get(position);
                }
    
                @Override
                public int getCount() {
                    return fragments.size();
                }
    
                @Nullable
                @Override
                public CharSequence getPageTitle(int position) {
                    return strings.get(position);
                }
            });
            //tablayout 绑定viewpage 滑动
            tabLayout.setupWithViewPager(viewPager);
        }
    }
    
    

    6.主页面 TjFragment 实现

    public class TjFragment extends BaseFragment {
       private View inflate;
       private String data;
       int page=2;
       private Gson gson;
       private ListBean listBean;
       private List<ListBean.ResultBean.NewsBean> news;
       public List<ListBean.ResultBean.BannerBean> bannerlist;
       XBanner xbanner;
       private MyListView listView;
       private PullToRefreshScrollView pullToRefreshScrollView;
       public static final String TAG="TjFragment";
       private Bundle bundle;
       private ArrayList<ListBean.ResultBean.NewsBean> newsBeans = new ArrayList<>();
       @Override
       public View getLayoutId(LayoutInflater inflater, ViewGroup container) {
           inflate = inflater.inflate(R.layout.fragment_tj, null);
           xbanner = inflate.findViewById(R.id.fragment_xbanner);
           pullToRefreshScrollView = inflate.findViewById(R.id.fragment_pulltoscview);
           listView = inflate.findViewById(R.id.fragment_listview);
           listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
               private String url1;
               private Intent intent;
               private String url;
               @Override
               public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                   intent = new Intent(getActivity(), TjActivity.class);
                   bundle = new Bundle();
                   url1 = news.get(i).getUrl();
                   if (url1!=null){
                       intent.putExtra("webpath",url1);
                       getActivity().startActivity(intent);
                   }else {
                       Log.d(TAG, "webpath 为空");
                   }
               }
           });
           pullToRefreshScrollView.setMode(PullToRefreshBase.Mode.BOTH);//设置模式
           //添加点击事件
           pullToRefreshScrollView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ScrollView>() {
               //下拉刷新
               @Override
               public void onPullDownToRefresh(PullToRefreshBase<ScrollView> refreshView) {
                   page=2;
                   newsBeans.clear();
                   new myAysnc().execute();
                   pullToRefreshScrollView.onRefreshComplete();//关闭刷新
    
               }
              //上拉加载
               @Override
               public void onPullUpToRefresh(PullToRefreshBase<ScrollView> refreshView) {
                   page++;
                       new myAysnc().execute();
                       pullToRefreshScrollView.onRefreshComplete();//关闭刷新
               }
           });
           return inflate;
       }
    
       @Override
       public void initdata() {
           if (HttpUtil.getInstance().getNet(getActivity())) {
               Toast.makeText(getActivity(), "恭喜你请求成功!", Toast.LENGTH_SHORT).show();
               new myAysnc().execute();
    
           } else {
               Toast.makeText(getActivity(), "请求失败啦!", Toast.LENGTH_SHORT).show();
           }
       }
       class myAysnc extends AsyncTask<Integer, Integer, String>  {
           String path = "http://blog.zhaoliang5156.cn/api/news/bannernews"+page+".json";
           @Override
           protected void onPostExecute(String s) {
               super.onPostExecute(s);
               Log.d("SS", "onPostExecute: "+s);
               gson = new Gson();
               listBean = gson.fromJson(s, ListBean.class);
               bannerlist = listBean.getResult().getBanner();
               news = listBean.getResult().getNews();
               xbanner.removeAllViews();
               xbanner.setData(bannerlist,null);
               newsBeans.addAll(news);
               xbanner.setmAdapter(new XBanner.XBannerAdapter() {
                   @Override
                   public void loadBanner(XBanner banner, View view, int position) {
                       Glide.with(getActivity()).load(bannerlist.get(position).getImage()).into((ImageView) view);
                   }
               });
               //刷新适配器
               ListAdapter listAdapter = new ListAdapter(newsBeans, getActivity());
               listView.setAdapter(listAdapter);
           }
           @Override
           protected String doInBackground(Integer... integers) {
               try {
                   Log.d(TAG, "dopath===: "+path);
                   data = HttpUtil.getInstance().getData(path);
               } catch (IOException e) {
                   e.printStackTrace();
               }
               return data;
           }
       }
    

    7.主页面 Activity 布局实现

    <?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=".MainActivity">
       <include
           layout="@layout/lun"
           ></include>
    
    <com.google.android.material.tabs.TabLayout
        android:layout_width="match_parent"
        app:tabTextColor="@color/colorPrimaryDark"
        app:tabSelectedTextColor="@color/colorPrimary"
        android:layout_height="wrap_content"
        android:id="@+id/table_one"
        ></com.google.android.material.tabs.TabLayout>
    
       <androidx.viewpager.widget.ViewPager
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:id="@+id/viewpager_one"
           ></androidx.viewpager.widget.ViewPager>
    </LinearLayout>
    

    8.主页面 TjFragment 布局实现

    <?xml version="1.0" encoding="utf-8"?>
    <com.handmark.pulltorefresh.library.PullToRefreshScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/fragment_pulltoscview"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".frgment.TjFragment">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            >
            <com.stx.xhb.xbanner.XBanner
                android:id="@+id/fragment_xbanner"
                android:layout_width="match_parent"
                android:layout_height="220dp">
            </com.stx.xhb.xbanner.XBanner>
    
            <com.bw.xushanshan.MyListView
                android:id="@+id/fragment_listview"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"></com.bw.xushanshan.MyListView>
        </LinearLayout>
        </com.handmark.pulltorefresh.library.PullToRefreshScrollView>
    

    想要源码评论区回复我,给你私发链接

    Kotlin基础篇【1】Android Studio 3.0 Kotlin环境配置
    Kotlin基础篇【2】初识Kotlin的意义
    Kotlin基础篇【3】Kotlin基础语法

    =======Kotlin基础篇【4】Kotlin基础语法即将更新=======

    相关文章

      网友评论

        本文标题:TabLayout+Fragment+PullToRefresh

        本文链接:https://www.haomeiwen.com/subject/xxitectx.html