webview+httputil+HTTPURLConnection+AsyncTask+Channel.+XlistView

//需要的权限

    <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>

//主视图Main的xml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值