RecyclerView多布局实现

实现效果

多布局.gif

实现原理

为recyclerview设置GridLayoutManager,通过重写adapter中的onAttachedToRecyclerView方法,在该方法中使用GridLayoutManager.setSpanSizeLookup方法获取每个item所占用的列;并在自定义recyclerview.adapter文件中根据viewtype加载不同的布局。

  • step1:根据需要写出3个item布局文件(布局比较简单,就是普通的item布局文件,此处就不再贴出)
  • step2:创建Adapter文件
public class Weather_Details_Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context context;
    private List<Weather.HeWeather5Bean.DailyForecastBean> daily_list;
    private Weather.HeWeather5Bean.SuggestionBean suggestion;
    private Weather weather;
    private Weather.HeWeather5Bean.NowBean now;
    private List<HashMap<String,String>> mSuggest=new ArrayList<>();
    private int item_size;

    public void setContext(Context context) {
        this.context = context;
    }

    public void setWeather(Weather weather) {
        this.weather=weather;
        daily_list=weather.getHeWeather5().get(1).getDaily_forecast();
        suggestion=weather.getHeWeather5().get(1).getSuggestion();
        now=weather.getHeWeather5().get(1).getNow();
        mSuggest=getSuggest();
        item_size=daily_list.size()+6;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layout=LayoutInflater.from(context);
//此处的viewtype来自于getItemViewType(int position)方法返回的值;
//根据不同的viewtype,此处返回对应的holder
        switch (viewType){
            case Variable.weather_item_type_1:
                return new Weather_Holder(layout.inflate(R.layout.now_weather_item,parent,false));
            case Variable.weather_item_type_2:
                return new Day_Holder(layout.inflate(R.layout.day_weather_item,parent,false));
            default:
                return new Live_Holder(layout.inflate(R.layout.live_weather_item,parent,false));
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
      //此处为不同的holder对象绑定相对应的数据
        if (holder instanceof Weather_Holder){
            ((Weather_Holder) holder).mCity.setText(weather.getHeWeather5().get(1).getBasic().getCity());
            ((Weather_Holder) holder).msuggest.setText(suggestion.getSport().getTxt());
            ((Weather_Holder) holder).mTemp.setText(now.getTmp());
            ((Weather_Holder) holder).mWeather.setText(daily_list.get(0).getCond().getTxt_d()+"~"+
            daily_list.get(0).getCond().getTxt_n());
            ((Weather_Holder) holder).mtemperature.setText(daily_list.get(0).getTmp().getMax()+"~"+daily_list.get(0).getTmp().getMax());
            ((Weather_Holder) holder).mDate.setText(weather.getHeWeather5().get(1).getBasic().getUpdate().getLoc());
            ((Weather_Holder) holder).mAir.setText(weather.getHeWeather5().get(1).getAqi().getCity().getQlty());
        }else if (holder instanceof Day_Holder){
            ((Day_Holder) holder).mDate.setText(daily_list.get(position).getDate());
            ((Day_Holder) holder).mTemp.setText(daily_list.get(position).getTmp().getMax()+"~"+
                    daily_list.get(position).getTmp().getMin());
            ((Day_Holder) holder).mWeather.setText(daily_list.get(position).getCond().getTxt_d()+"转"
                    +daily_list.get(position).getCond().getTxt_n());
            ((Day_Holder) holder).mWind.setText(daily_list.get(position).getWind().getDir()+"-"+
            daily_list.get(position).getWind().getSc());
        }else if (holder instanceof Live_Holder){
            ((Live_Holder) holder).mTitle.setText(mSuggest.get(position-3).get("title"));
            ((Live_Holder) holder).mResult.setText(mSuggest.get(position-3).get("result"));
            ((Live_Holder) holder).mContent.setText(mSuggest.get(position-3).get("content"));
        }
    }

    private List<HashMap<String,String>> getSuggest(){
        String[] title=new String[]{context.getString(R.string.comfort),context.getString(R.string.car),
                context.getString(R.string.dress),context.getString(R.string.cold),context.getString(R.string.trvavel),
                context.getString(R.string.ultraviolet)};
        String[] result=new String[]{suggestion.getComf().getBrf(),suggestion.getCw().getBrf(),suggestion.getDrsg().getBrf(),
        suggestion.getFlu().getBrf(),suggestion.getTrav().getBrf(),suggestion.getUv().getBrf()};
        String[] content=new String[]{suggestion.getComf().getTxt(),suggestion.getCw().getTxt(),suggestion.getDrsg().getTxt(),
                suggestion.getFlu().getTxt(),suggestion.getTrav().getTxt(),suggestion.getUv().getTxt()};
        for (int i=0;i<6;i++){
            HashMap<String,String> map=new HashMap<>();
            map.put("title",title[i]);
            map.put("result",result[i]);
            map.put("content",content[i]);
            mSuggest.add(map);
        }
        return mSuggest;
    }

    @Override
    public int getItemCount() {
        return item_size;
    }
//使用该方法根据position返回相应的viewtype
    @Override
    public int getItemViewType(int position) {
        switch (position){
            case 0:
                return Variable.weather_item_type_1;
            case 1:case 2:
                return Variable.weather_item_type_2;
            default:
                return Variable.weather_item_type_3;
        }
    }
//为不同的布局创建不同的holder
    class Weather_Holder extends RecyclerView.ViewHolder{

        private TextView mCity,mTemp,mAir,mDate,mWeather,mtemperature,msuggest;

        public Weather_Holder(View itemView) {
            super(itemView);
            mCity= (TextView) itemView.findViewById(R.id.city);
            mTemp= (TextView) itemView.findViewById(R.id.temp);
            mAir= (TextView) itemView.findViewById(R.id.air);
            mDate= (TextView) itemView.findViewById(R.id.date);
            mWeather= (TextView) itemView.findViewById(R.id.weather);
            mtemperature= (TextView) itemView.findViewById(R.id.temperature);
            msuggest= (TextView) itemView.findViewById(R.id.suggest);
        }
    }

    class Day_Holder extends RecyclerView.ViewHolder{

        private TextView mDate,mTemp,mWeather,mWind;

        public Day_Holder(View itemView) {
            super(itemView);
            mDate= (TextView) itemView.findViewById(R.id.day_date);
            mTemp= (TextView) itemView.findViewById(R.id.day_temp);
            mWeather= (TextView) itemView.findViewById(R.id.day_weather);
            mWind= (TextView) itemView.findViewById(R.id.day_wind);
        }
    }

    class Live_Holder extends RecyclerView.ViewHolder{

        private TextView mTitle,mResult,mContent;

        public Live_Holder(View itemView) {
            super(itemView);
            mTitle= (TextView) itemView.findViewById(R.id.live_title);
            mContent= (TextView) itemView.findViewById(R.id.live_content);
            mResult= (TextView) itemView.findViewById(R.id.live_result);
        }
    }
//设置不同的viewtype所占用的列
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        Logger.d("onAttach");
        RecyclerView.LayoutManager layout=recyclerView.getLayoutManager();//获取布局管理器对象
        Logger.d(layout instanceof GridLayoutManager);
        if (layout instanceof GridLayoutManager){
            final GridLayoutManager manager= ((GridLayoutManager) recyclerView.getLayoutManager());
            manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    int type=getItemViewType(position);//根据position获取item对应的viewtype
                    switch (type){
                        case Variable.weather_item_type_1:
                            return manager.getSpanCount();//返回总列数,表示该item独占一行
                        case Variable.weather_item_type_2:
                            Logger.t("adapter").d(manager.getSpanCount());
                            return manager.getSpanCount()/2;//表示item占一半的列
                        default:
                            return manager.getSpanCount();
                    }
                }
            });
        }
    }
}
  • step3:在activity中使用recyclerview
        mRecyclerView= (RecyclerView) findViewById(R.id.weather_list);
        mAdapter=new Weather_Details_Adapter();
        mAdapter.setContext(this);//向adapter中传递上下文
        mAdapter.setWeather(weather);//向adapter中传递获取的天气数据
        mRecyclerView.setLayoutManager(new GridLayoutManager(this,4, GridLayoutManager.VERTICAL,false));//设置布局管理器
        mRecyclerView.setAdapter(mAdapter);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容