前言

每个人每天都会在浏览器上看一些最新的新闻,作为一个IT程序员你们会发现,她们的布局排版都是有区别的,有时候同一个样式的条目有4、5条 界面一样,下面又出现1 条不一样的条目,这样的效果是不是很美观,这在Android称为多布局,下面来简单实现一下,大概理解下


使用

1.RecyclerView

利用Adapter的getItemViewType()方法返回不同的VIEW_TYPE,利用求末取余的算法获取到当前位置的条目,然后在onCreateViewHolder中设置对应的ViewHolder 。

    final int VIEW_TYPE = 3;    final int TYPE_1    = 0;    final int TYPE_2    = 1;    final int TYPE_3    = 2; /**     * 获取每个位置的View     *     * @param position     * @return     */    @Override    public int getItemViewType(int position) {        int p = position % VIEW_TYPE;        if (p == 0) {            return TYPE_1;        } else if (p == 1) {            return TYPE_2;        } else {            return TYPE_3;        }    }   @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        if (viewType == TYPE_1) {            View view = View.inflate(mContext, R.layout.adapter, null);            return new MyViewHolder(view);        } else if (viewType == TYPE_2) {            View view2 = View.inflate(mContext, R.layout.adapter2, null);            return new MyViewHolder2(view2);        } else {            View view3 = View.inflate(mContext, R.layout.adapter3, null);            return new MyViewHolder3(view3);        }    }

这个方法是给每一个ViewHolder设置数据

@Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        MyViewHolder holder1 = null;        MyViewHolder2 holder2 = null;        MyViewHolder3 holder3 = null;        if (holder instanceof MyViewHolder) {            holder1 = (MyViewHolder) holder;        } else if (holder instanceof MyViewHolder2) {            holder2 = (MyViewHolder2) holder;        } else {            holder3 = (MyViewHolder3) holder;        }    }

完整代码:

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {    Context       mContext;    List mList;    final int VIEW_TYPE = 3;    final int TYPE_1    = 0;    final int TYPE_2    = 1;    final int TYPE_3    = 2;    public MyAdapter(Context context, List list) {        mContext = context;        mList = list;    }    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        if (viewType == TYPE_1) {            View view = View.inflate(mContext, R.layout.adapter, null);            return new MyViewHolder(view);        } else if (viewType == TYPE_2) {            View view2 = View.inflate(mContext, R.layout.adapter2, null);            return new MyViewHolder2(view2);        } else {            View view3 = View.inflate(mContext, R.layout.adapter3, null);            return new MyViewHolder3(view3);        }    }    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        MyViewHolder holder1 = null;        MyViewHolder2 holder2 = null;        MyViewHolder3 holder3 = null;        if (holder instanceof MyViewHolder) {            holder1 = (MyViewHolder) holder;        } else if (holder instanceof MyViewHolder2) {            holder2 = (MyViewHolder2) holder;        } else {            holder3 = (MyViewHolder3) holder;        }    }    /**     * 获取每个位置的View     *     * @param position     * @return     */    @Override    public int getItemViewType(int position) {        int p = position % VIEW_TYPE;        if (p == 0) {            return TYPE_1;        } else if (p == 1) {            return TYPE_2;        } else {            return TYPE_3;        }    }    @Override    public int getItemCount() {        if (mList != null) {            return mList.size();        }        return 0;    }    class MyViewHolder extends RecyclerView.ViewHolder {        public MyViewHolder(View itemView) {            super(itemView);        }    }    class MyViewHolder2 extends RecyclerView.ViewHolder {        public MyViewHolder2(View itemView) {            super(itemView);        }    }    class MyViewHolder3 extends RecyclerView.ViewHolder {        public MyViewHolder3(View itemView) {            super(itemView);        }    }}

2.ListView

ListView比RecyclerView多了getViewTypeCount() 布局数量 的方法

  //  总共有几种布局    @Override    public int getViewTypeCount() {        return VIEW_TYPE;    }

完整代码:

public class MyAdapter2 extends BaseAdapter {    private List list;    private Context       ctx;    final int VIEW_TYPE = 3;    final int TYPE_1    = 0;    final int TYPE_2    = 1;    final int TYPE_3    = 2;    public MyAdapter2(List list, Context ctx) {        super();        this.list = list;        this.ctx = ctx;    }    //  获取Item的View的类型    @Override    public int getItemViewType(int position) {        int i = position % VIEW_TYPE;        if (i == 0) {            return TYPE_1;        } else if (i == 1) {            return TYPE_2;        } else {            return TYPE_3;        }    }    //  总共有几种布局    @Override    public int getViewTypeCount() {        return VIEW_TYPE;    }    @Override    public int getCount() {        return list.size();    }    @Override    public Object getItem(int position) {        return list.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        MyViewHolder holder1 = null;        MyViewHolder2 holder2 = null;        MyViewHolder3 holder3 = null;        int type = getItemViewType(position);        if (convertView == null) {            //设置布局和找ID            switch (type) {                case TYPE_1:                    convertView = View.inflate(ctx, R.layout.adapter, null);                    holder1 = new MyViewHolder(convertView);                    convertView.setTag(holder1);                    break;                case TYPE_2:                    convertView = View.inflate(ctx, R.layout.adapter2, null);                    holder2 = new MyViewHolder2(convertView);                    convertView.setTag(holder2);                    break;                case TYPE_3:                    convertView = View.inflate(ctx, R.layout.adapter3, null);                    holder3 = new MyViewHolder3(convertView);                    convertView.setTag(holder3);                    break;            }        } else {            //设置复用            switch (type) {                case TYPE_1:                    holder1 = (MyViewHolder) convertView.getTag();                    break;                case TYPE_2:                    holder2 = (MyViewHolder2) convertView.getTag();                    break;                case TYPE_3:                    holder3 = (MyViewHolder3) convertView.getTag();                    break;            }        }        //设置数据        switch (type) {            case TYPE_1:                break;            case TYPE_2:                break;            case TYPE_3:                break;        }        return convertView;    }    private class MyViewHolder {        public MyViewHolder(View convertView) {        }    }    private class MyViewHolder2 {        public MyViewHolder2(View convertView) {        }    }    private class MyViewHolder3 {        public MyViewHolder3(View convertView) {        }    }}

MainActivity.java

public class MainActivity extends AppCompatActivity {    RecyclerView mRecy;    ListView     mLv;    List mList = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initList();        initView();    }    private void initList() {        for (int i = 0; i < 100; i++) {            mList.add(i);        }    }    private void initView() {        mRecy = findViewById(R.id.mRecy);        mLv = findViewById(R.id.mLv);        //        mRecy.setLayoutManager(new LinearLayoutManager(this));        //        mRecy.setAdapter(new MyAdapter(this, mList));        mLv.setAdapter(new MyAdapter2(mList,this));    }}

效果图:

扩展文章:RecyclerView仿今日头条新闻列表多item实现

更多相关文章

  1. 可左右两侧挤压傍边布局的Android抽屉
  2. 老罗的Android视频教程整理之常用布局
  3. android开发动态页面时常用的LayoutInflater实例化的三种方式
  4. Android中的布局方式(一)
  5. win10下使用Fiddler进行网络抓包
  6. android 属性系统,SystemProperties 的简介
  7. Android绘图机制(三) ViewGroup类的延伸
  8. Android(安卓)TextView字体样式设置
  9. android 下使用GPS 无法获取经纬度的解决方法

随机推荐

  1. Android实现字幕滚动的方法
  2. 如何搭建Repo服务器端
  3. Android NDK入门理解
  4. Android 控件Edittext详解
  5. android耳机状态的检测
  6. 「转」Android Design in Action —— 十
  7. A015-布局之LinearLayout
  8. Android数据存储方式:SharePreference、SQ
  9. androidManifest.xml之uses-permission(
  10. Android(安卓)app图标总是显示默认的机器