A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【济南中心】Android课程同步笔记智慧北京:Day06(中)

webview的基本设置引言
由于市面上应用基本上本地+HTML进行混合开发。
本地开发就是使用android系统提供的一些组件来实现
而HTML开发就是使用WebView加载的一个网页,进行开发。
因此,我们有必要更加深入了解一下WebView的使用。
回顾
大家回顾一下:
之前在查看新闻详情界面,我们对WebView有个简单认识。
WebView的基本使用
使用WebView的loadUrl加载一个简单的网页
使用WebView的WebSetting,来修改网页的字体大小。
实现步骤第一步:创建布局文件
创建布局文件,引入WebView控件
[XML] 纯文本查看 复制代码
<?xml version="1.0" encoding="utf-8"?>[/align]<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.itheima.webview_base.MainActivity">

    <RelativeLayout
        android:id="@+id/rl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="goBack"
            android:text="后退"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="javaCallJs"
            android:layout_centerInParent="true"
            android:text="javaCallJs"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="goForward"
            android:layout_alignParentRight="true"
            android:text="前进"/>
    </RelativeLayout>

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/rl"></WebView>
</RelativeLayout>
第二步WebView支持js
webView.getSettings().setJavaScriptEnabled(true);
第三步WebView加载一个网页
//加载网页webView.loadUrl(url);
第四步WebView中加载网页
webView.setWebViewClient(new WebViewClient(){
    //页面加载完成@Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
         }
});
第五步WebView加载一个asset目录下的网页
//加载assets目录下的网页webView.loadUrl("file:///android_asset/demo.html");
第六步WebView支持后退和前进功能
后退操作
//回退public void goBack(View view){
    if(webView.canGoBack()){
        webView.goBack();
    }
}
前进操作
public void goForward(View view){
    if(webView.canGoForward()){
        webView.goForward();
    }
}
强调WebViewClient对象使用
注意:WebView的SetWebViewClient方法,传递的WebViewClient对象。
[Java] 纯文本查看 复制代码
webView.setWebViewClient(new WebViewClient(){[/align]    //页面加载完成
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
         }
});
WebViewClient的作用
帮助WebView处理各种通知、请求事件的
WebViewClient的方法说明:
shouldOverrideUrlLoading(WebView view, String url)
点击请求时,如果是链接是才会调用。
重写此方法返回true:表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。
这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的
onReceivedError(WebView view, int errorCode, String description, String failingUrl)// (报告错误信息)
onPageStarted(WebView view, String url, Bitmap favicon) //这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应
onPageFinished(WebView view, String url) //在页面加载结束时调用。同样道理,我们知道一个页面载入完成,于是我们可以关闭loading 条,切换程序动作
WebChromeClient对象的使用
可以调用webView的setWebChromeClient方法设置WebChromeClient对象。
webView.setWebChromeClient(new WebChromeClient());

WebChromeClient的作用:
主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等

常见的方法说明:
onJsAlert (WebView上alert无效,需要定制WebChromeClient处理弹出)
onJsPrompt
        显示一个提示对话框
onJsConfirm
        显示一个确认对话框
onProgressChanged
显示webview加载的进度
onReceivedTitle
获取加载网站的标题
问题
问题1:如何让WebView中加载网页?
l 给WebView设置WebViewClient对象
l WebViewClient的作用:
n 帮助WebView处理各种通知、请求事件的
问题2:WebView中的WebViewClient和WebChromeClient对象的区别?
l WebViewClient的作用:
n 帮助WebView处理各种通知、请求事件的
l WebChromeClient的作用:
n 主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等
java和javaScript之间的互调引言
在开发中经常会有这样的需求,就是点击Html的条目或者图片时,打开本地的组件
比如:当点击一个图片时,会打开一个activity,查看图片详情。
实现这样的功能,就涉及到android 和 js之间相互交互了。
接下来,我看一下如何实现android和js进行交互?
实现步骤Android调用js代码
[Java] 纯文本查看 复制代码
public void javaCallJs(View view){
    webView.loadUrl("javascript:wave()");
}
Js调用android代码
Android中提供对象,传递给js
[Java] 纯文本查看 复制代码
//把java里面的对象传递给js
webView.addJavascriptInterface(new JsCallJava() {
    @JavascriptInterface
    @Override
    public void onCallback() {
        Toast.makeText(getApplicationContext(),"JavaScript调用的java代码",Toast.LENGTH_SHORT).show();
    }
}, "demo");
注意:js调用android中的方法,一定使用@JavascriptInterface进行注解

Js执行android代码
[Java] 纯文本查看 复制代码
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<script language="javascript">
    /* This function is invoked by the activity */
    function wave() {
        alert("Android调用Js啦");
    }
</script>
<body>
    <!-- Js调用Android代码 -->
    <a>点我!</a>
</body>

</html>

强调
除了以上WebView的使用,还有一些比较常见的使用。
WebView设置缓存
缓存设置
        setCacheMode(int mode)
                WebSettings.LOAD_CACHE_ELSE_NETWORK
                        只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据
                WebSettings.LOAD_CACHE_ONLY
                        只加载缓存
                WebSettings.LOAD_DEFAULT
                        根据cache-control决定是否从网络上取数据 cache-control:?  
                                private(内容只缓存到私有缓存中)
                                public(所有内容都将被缓存)
                                no-cache(所有内容都不会被缓存)
                                max-age=xxx(缓存的内容将在 多长时间后失效)
                WebSettings.LOAD_NO_CACHE
        清理缓存
                webview.clearCache(true);
                deleteDatabase("webview.db");
WebView自适应屏幕
        WebSettings.setUseWideViewPort(true);
                webview推荐使用的窗口, 将图片调整到适合webview的大小
        WebSettings.setLoadWithOverviewMode(true);
                设置webview加载的页面的模式, 缩放至屏幕的大小
WebView的Cookie的设置
Cookie设置(保存用户登录状态)
        创建CookieSyncManager实例
                CookieSyncManager.createInstance(this);
        获取CookieManager管理器实例
                cookieManager = CookieManager.getInstance();
        设置支持cookie
                cookieManager.setAcceptCookie(true);
        设置cookie值
                cookieManager.setCookie(“"name=xxx;age=18"”, cookie);
        通过CookieSyncManager
                CookieSyncManager.getInstance().sync();
        获取cookie值
                String cookie_value = cookieManager.getCookie(url);
        移除cookie
                 cookieManager.removeAllCookie();
CookieSyncManager.getInstance().sync();  
问题
问题1:如何实现android和js相互交互?
l js调用android代码
        提供java对象,给webview
                webView.addJavascriptInterface(new JSObject(), "Android");
        提供js,调用java对象
                 Android.JsCallAndroid(toast)
l android调用js
        Webview.loadUrl("javascript:changeInputValue('哈哈 js 您好')");
        function changeInputValue(content){
document.getElementById("put_id").value=content;
}

360新闻-从服务器获取分类数据引言
有时候,新闻的显示不只是一种分类,而是不同中分类。

像这样的效果,显示不同分类的新闻如何实现呢?
回顾
大家回顾一下:
ListView可以通过多种行试图方式来实现不同分类新闻。
重写BaseAdapter的getItemViewType和 getItemCount方法
来创建不同分类的条目来实现
RecyclerView是否也可以实现不同分类的条目吗?
是可以的!
好! 接下来,我们看一下!
实现步骤第一步从服务器获取360分类的新闻数据
解压360后台数据,到tomecat下的webapp目录下:

第二步创建工程添加依赖库
[Java] 纯文本查看 复制代码
dependencies {[/align]    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.jakewharton:butterknife:8.4.0'
    apt 'com.jakewharton:butterknife-compiler:8.4.0'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.zhy:okhttputils:2.6.2'
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.android.support:recyclerview-v7:23.4.0'
    compile files('libs/photoview.jar')
}
第三步初始化MainActivity
布局实现:
[XML] 纯文本查看 复制代码
<?xml version="1.0" encoding="utf-8"?>
<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.itheima.a360news.MainActivity">

   <android.support.v7.widget.RecyclerView
       android:id="@+id/rv"
       android:layout_width="match_parent"
       android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</RelativeLayout>
 
第四步绑定控件联网获取数据
[Java] 纯文本查看 复制代码
@BindView(R.id.rv)
    RecyclerView rv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        //RecyclerView的初始化
        rv.setLayoutManager(new LinearLayoutManager(this));
        rv.addItemDecoration(new RecycleViewDivider(this,LinearLayoutManager.HORIZONTAL,1, Color.BLACK));
        String url = "http://10.0.2.2:8080/360/list1.json";
        //联网获取数据
        OkHttpUtils
                .get()
                .url(url)
                .build()
                .execute(new StringCallback() {
                    @Override
                    public void onError(Call call, Exception e, int id) {
                    }
                    @Override
                    public void onResponse(String response, int id) {
                        ResuleBean resuleBean = new Gson().fromJson(response, ResuleBean.class);
                        rv.setAdapter(new NewsAdapter(resuleBean.data,getApplicationContext()));
                    }
                });
    }
}

第五步封装结果bean
[Java] 纯文本查看 复制代码
public class ResuleBean {[/align]    public List<NewsData> data;
    public int error;

    public class NewsData{
        public int id;
        public List<String> imgs;
        public String title;
        public String weburl;
    }
}
第六步将结果数据转化为javaBean对象
[Java] 纯文本查看 复制代码
//联网获取数据
OkHttpUtils
        .get()
        .url(url)
        .build()
        .execute(new StringCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {

            }

            @Override
            public void onResponse(String response, int id) {
                ResuleBean resuleBean = new Gson().fromJson(response, ResuleBean.class);
                rv.setAdapter(new NewsAdapter(resuleBean.data,getApplicationContext()));
            }
        });


360新闻-新闻分类适配器引言
从服务器端成功获取数据以后,下面我们将数据绑定到RecyclerView中进行显示
实现步骤
第一步初始化RecycerView
[Java] 纯文本查看 复制代码
//RecyclerView的初始化
//设置线性的布局管理器
rv.setLayoutManager(new LinearLayoutManager(this));
//设置分割线
rv.addItemDecoration(new RecycleViewDivider(this,LinearLayoutManager.HORIZONTAL,1, Color.BLACK));
 
 

第二步创建新闻分类适配器
在适配器中根据getItemViewType方法,来区分条目的类型
[Java] 纯文本查看 复制代码
public class NewsAdapter extends RecyclerView.Adapter {

    private List<ResuleBean.NewsData> newsDataList;
    private Context context;

    public NewsAdapter(List<ResuleBean.NewsData> newsDataList, Context context) {
        this.newsDataList = newsDataList;
        this.context = context;
    }

    //区分条目的类型
    @Override
    public int getItemViewType(int position) {
        ResuleBean.NewsData newsData = newsDataList.get(position);
        if (newsData.imgs.size() == 3) {//显示三张图片
            return 0;
        } else if (newsData.imgs.size() == 0) {//显示文字
            return 1;
        } else if (newsData.imgs.size() == 1) {//显示一张图片和文字
            return 2;
        }
        return super.getItemViewType(position);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == 0) {//显示三张图片
            View view = LayoutInflater.from(context).inflate(R.layout.item1, parent, false);
            return new ViewHolder1(view);
        } else if (viewType == 1) {//显示文字
            View view = LayoutInflater.from(context).inflate(R.layout.item2, parent, false);
            return new ViewHolder2(view);
        } else if (viewType == 2) {//显示一张图片和文字
            View view = LayoutInflater.from(context).inflate(R.layout.item3, parent, false);
            return new ViewHolder3(view);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final ResuleBean.NewsData newsData = newsDataList.get(position);
        if (newsData.imgs.size() == 3) {//显示三张图片
            ViewHolder1 viewHolder1 = (ViewHolder1) holder;
            viewHolder1.tvTitle.setText(newsData.title);
            Picasso.with(context).load(newsData.imgs.get(0)).into(viewHolder1.iv1);
            Picasso.with(context).load(newsData.imgs.get(1)).into(viewHolder1.iv2);
            Picasso.with(context).load(newsData.imgs.get(2)).into(viewHolder1.iv3);
            //条目的点击事件
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(context,NewsDetailActivity.class);
                    intent.putExtra("url",newsData.weburl);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(intent);
                }
            });
        } else if (newsData.imgs.size() == 0) {//显示文字
            ViewHolder2 viewHolder2 = (ViewHolder2) holder;
            viewHolder2.tvTitle.setText(newsData.title);
        } else if (newsData.imgs.size() == 1) {//显示一张图片和文字
            ViewHolder3 viewHolder3 = (ViewHolder3) holder;
            viewHolder3.tvTitle.setText(newsData.title);
            Picasso.with(context).load(newsData.imgs.get(0)).into(viewHolder3.iv1);
        }


    }

    @Override
    public int getItemCount() {
        return newsDataList != null ? newsDataList.size() : 0;
    }

    static class ViewHolder1 extends RecyclerView.ViewHolder {
        @BindView(R.id.tv_title)
        TextView tvTitle;
        @BindView(R.id.iv1)
        ImageView iv1;
        @BindView(R.id.iv2)
        ImageView iv2;
        @BindView(R.id.iv3)
        ImageView iv3;

        ViewHolder1(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }

    static class ViewHolder2 extends RecyclerView.ViewHolder {
        @BindView(R.id.tv_title)
        TextView tvTitle;

        ViewHolder2(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }

    static class ViewHolder3 extends RecyclerView.ViewHolder {
        @BindView(R.id.iv1)
        ImageView iv1;
        @BindView(R.id.tv_title)
        TextView tvTitle;

        ViewHolder3(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }
 
 
第三步:给RecyclerView设置分类适配器
[Java] 纯文本查看 复制代码
//联网获取数据[/align]OkHttpUtils
        .get()
        .url(url)
        .build()
        .execute(new StringCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {

            }

            @Override
            public void onResponse(String response, int id) {
                //将结果数据转换为javaBean对象
                ResuleBean resuleBean = new Gson().fromJson(response, ResuleBean.class);
                //设置适配器
                rv.setAdapter(new NewsAdapter(resuleBean.data,getApplicationContext()));
            }
        });
 
 
第四步三种分类的布局实现
第一种类型的分类
[XML] 纯文本查看 复制代码
<?xml version="1.0" encoding="utf-8"?>[/align]<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:paddingBottom="10dp"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="新闻内容"
        android:textColor="#000"
        android:textSize="16sp"
        android:maxLines="1"
        android:ellipsize="end"
        android:padding="10dp"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <ImageView
            android:layout_width="0dp"
            android:layout_height="60dp"
            android:layout_weight="1"
            android:layout_margin="2dp"
            android:src="@mipmap/ic_launcher"
            android:scaleType="fitXY"
            android:id="@+id/iv1"/>
        <ImageView
            android:layout_width="0dp"
            android:layout_height="60dp"
            android:layout_weight="1"
            android:layout_margin="2dp"
            android:src="@mipmap/ic_launcher"
            android:scaleType="fitXY"
            android:id="@+id/iv2"/>
        <ImageView
            android:layout_width="0dp"
            android:layout_height="60dp"
            android:layout_weight="1"
            android:layout_margin="2dp"
            android:src="@mipmap/ic_launcher"
            android:scaleType="fitXY"
            android:id="@+id/iv3"/>
    </LinearLayout>

</LinearLayout>
第二种类型的分类
[XML] 纯文本查看 复制代码
<?xml version="1.0" encoding="utf-8"?>[/align]<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:paddingBottom="10dp"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="新闻内容"
        android:textSize="16sp"
        android:maxLines="1"
        android:ellipsize="end"
        android:textColor="#000"
        android:padding="10dp"/>

</LinearLayout>
第三种类型的分类
[XML] 纯文本查看 复制代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:paddingBottom="10dp"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_margin="2dp"
        android:src="@mipmap/ic_launcher"
        android:scaleType="fitXY"
        android:id="@+id/iv1"/>

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="新闻内容"
        android:textSize="16sp"
        android:layout_gravity="center_vertical"
        android:maxLines="1"
        android:ellipsize="end"
        android:textColor="#000"
        android:padding="10dp"/>


</LinearLayout>
第五步根据条目类型创建不同分类的条目
[Java] 纯文本查看 复制代码
public class NewsAdapter extends RecyclerView.Adapter {

    private List<ResuleBean.NewsData> newsDataList;
    private Context context;

    public NewsAdapter(List<ResuleBean.NewsData> newsDataList, Context context) {
        this.newsDataList = newsDataList;
        this.context = context;
    }

    //区分条目的类型
    @Override
    public int getItemViewType(int position) {
        ResuleBean.NewsData newsData = newsDataList.get(position);
        if (newsData.imgs.size() == 3) {//显示三张图片
            return 0;
        } else if (newsData.imgs.size() == 0) {//显示文字
            return 1;
        } else if (newsData.imgs.size() == 1) {//显示一张图片和文字
            return 2;
        }
        return super.getItemViewType(position);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == 0) {//显示三张图片
            View view = LayoutInflater.from(context).inflate(R.layout.item1, parent, false);
            return new ViewHolder1(view);
        } else if (viewType == 1) {//显示文字
            View view = LayoutInflater.from(context).inflate(R.layout.item2, parent, false);
            return new ViewHolder2(view);
        } else if (viewType == 2) {//显示一张图片和文字
            View view = LayoutInflater.from(context).inflate(R.layout.item3, parent, false);
            return new ViewHolder3(view);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final ResuleBean.NewsData newsData = newsDataList.get(position);
        if (newsData.imgs.size() == 3) {//显示三张图片
            ViewHolder1 viewHolder1 = (ViewHolder1) holder;
            viewHolder1.tvTitle.setText(newsData.title);
            Picasso.with(context).load(newsData.imgs.get(0)).into(viewHolder1.iv1);
            Picasso.with(context).load(newsData.imgs.get(1)).into(viewHolder1.iv2);
            Picasso.with(context).load(newsData.imgs.get(2)).into(viewHolder1.iv3);
            //条目的点击事件
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(context,NewsDetailActivity.class);
                    intent.putExtra("url",newsData.weburl);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(intent);
                }
            });
        } else if (newsData.imgs.size() == 0) {//显示文字
            ViewHolder2 viewHolder2 = (ViewHolder2) holder;
            viewHolder2.tvTitle.setText(newsData.title);
        } else if (newsData.imgs.size() == 1) {//显示一张图片和文字
            ViewHolder3 viewHolder3 = (ViewHolder3) holder;
            viewHolder3.tvTitle.setText(newsData.title);
            Picasso.with(context).load(newsData.imgs.get(0)).into(viewHolder3.iv1);
        }


    }

    @Override
    public int getItemCount() {
        return newsDataList != null ? newsDataList.size() : 0;
    }

    static class ViewHolder1 extends RecyclerView.ViewHolder {
        @BindView(R.id.tv_title)
        TextView tvTitle;
        @BindView(R.id.iv1)
        ImageView iv1;
        @BindView(R.id.iv2)
        ImageView iv2;
        @BindView(R.id.iv3)
        ImageView iv3;

        ViewHolder1(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }

    static class ViewHolder2 extends RecyclerView.ViewHolder {
        @BindView(R.id.tv_title)
        TextView tvTitle;

        ViewHolder2(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }

    static class ViewHolder3 extends RecyclerView.ViewHolder {
        @BindView(R.id.iv1)
        ImageView iv1;
        @BindView(R.id.tv_title)
        TextView tvTitle;

        ViewHolder3(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }
 
 
第六步根据条目类型绑定View
[Java] 纯文本查看 复制代码
public class NewsAdapter extends RecyclerView.Adapter {[/align]
    private List<ResuleBean.NewsData> newsDataList;
    private Context context;

    public NewsAdapter(List<ResuleBean.NewsData> newsDataList, Context context) {
        this.newsDataList = newsDataList;
        this.context = context;
    }

    //区分条目的类型
    @Override
    public int getItemViewType(int position) {
        ResuleBean.NewsData newsData = newsDataList.get(position);
        if (newsData.imgs.size() == 3) {//显示三张图片
            return 0;
        } else if (newsData.imgs.size() == 0) {//显示文字
            return 1;
        } else if (newsData.imgs.size() == 1) {//显示一张图片和文字
            return 2;
        }
        return super.getItemViewType(position);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == 0) {//显示三张图片
            View view = LayoutInflater.from(context).inflate(R.layout.item1, parent, false);
            return new ViewHolder1(view);
        } else if (viewType == 1) {//显示文字
            View view = LayoutInflater.from(context).inflate(R.layout.item2, parent, false);
            return new ViewHolder2(view);
        } else if (viewType == 2) {//显示一张图片和文字
            View view = LayoutInflater.from(context).inflate(R.layout.item3, parent, false);
            return new ViewHolder3(view);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final ResuleBean.NewsData newsData = newsDataList.get(position);
        if (newsData.imgs.size() == 3) {//显示三张图片
            ViewHolder1 viewHolder1 = (ViewHolder1) holder;
            viewHolder1.tvTitle.setText(newsData.title);
            Picasso.with(context).load(newsData.imgs.get(0)).into(viewHolder1.iv1);
            Picasso.with(context).load(newsData.imgs.get(1)).into(viewHolder1.iv2);
            Picasso.with(context).load(newsData.imgs.get(2)).into(viewHolder1.iv3);
            //条目的点击事件
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(context,NewsDetailActivity.class);
                    intent.putExtra("url",newsData.weburl);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(intent);
                }
            });
        } else if (newsData.imgs.size() == 0) {//显示文字
            ViewHolder2 viewHolder2 = (ViewHolder2) holder;
            viewHolder2.tvTitle.setText(newsData.title);
        } else if (newsData.imgs.size() == 1) {//显示一张图片和文字
            ViewHolder3 viewHolder3 = (ViewHolder3) holder;
            viewHolder3.tvTitle.setText(newsData.title);
            Picasso.with(context).load(newsData.imgs.get(0)).into(viewHolder3.iv1);
        }


    }

    @Override
    public int getItemCount() {
        return newsDataList != null ? newsDataList.size() : 0;
    }

    static class ViewHolder1 extends RecyclerView.ViewHolder {
        @BindView(R.id.tv_title)
        TextView tvTitle;
        @BindView(R.id.iv1)
        ImageView iv1;
        @BindView(R.id.iv2)
        ImageView iv2;
        @BindView(R.id.iv3)
        ImageView iv3;

        ViewHolder1(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }

    static class ViewHolder2 extends RecyclerView.ViewHolder {
        @BindView(R.id.tv_title)
        TextView tvTitle;

        ViewHolder2(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }

    static class ViewHolder3 extends RecyclerView.ViewHolder {
        @BindView(R.id.iv1)
        ImageView iv1;
        @BindView(R.id.tv_title)
        TextView tvTitle;

        ViewHolder3(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }








1 个回复

倒序浏览
多谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马