Skip to content

Latest commit

 

History

History
202 lines (169 loc) · 7.39 KB

README-cn-ViewGroup_after_1.5.0.md

File metadata and controls

202 lines (169 loc) · 7.39 KB

ViewGroup 篇:

适用于任意ViewGroup。像LinearLayout,ScrollView以及自定义的ViewGroup(流式布局、九宫格balabala)。

相关博文:

https://gold.xitu.io/post/584d52fdb123db00661c59fa

1 单Item列表

效果如图:

margin等属性都是正常显示的

用法:

建议使用Builder模式构建VGUtil:

                new VGUtil.Builder()
                        .setParent(llUseMore)
                        .setAdapter(new SingleAdapter<K50Bean>(this, mDatas, R.layout.item_50k) {
                            @Override
                            public void onBindViewHolder(ViewGroup parent, ViewHolder holder, K50Bean data, int pos) {
                                holder.setText(R.id.tv, data.getName());
                            }
                        })
                        .build()
                        .bind();

2 多Item、同种数据类型列表

效果如图:

多种Item,数据结构相同。

用法:

数据结构相同依然可以给Adapter传入泛型,避免强转:

        //设置OnItemClickListener
        OnItemClickListener onItemClickListener = new OnItemClickListener() {
            @Override
            public void onItemClick(ViewGroup parent, View itemView, int position) {
                Toast.makeText(MulTypeActivity.this, "通过OnItemClickListener设置:" + position, Toast.LENGTH_SHORT).show();
            }
        };

        //多种ItemViewType,但是数据结构相同,可以传入数据结构泛型,避免强转
        //2017 06 12 V1.8.0 建议使用Builder模式构建VGUtil
        new VGUtil.Builder()
                .setParent(linearLayout)
                .setAdapter(new MulTypeAdapter<MulTypeBean>(this, initDatas()) {
                    @Override
                    public void onBindViewHolder(ViewGroup parent, ViewHolder holder, final MulTypeBean data, int pos) {
                        holder.setText(R.id.tvWords, data.getName() + "");
                        Glide.with(MulTypeActivity.this)
                                .load(data.getAvatar())
                                .into((ImageView) holder.findViewById(ivAvatar));
                        //#### Adapter.onBindView()里设置 优先级更高
                        holder.itemView.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                Toast.makeText(mContext, "onBindView里设置:文字是:" + data.getName(), Toast.LENGTH_SHORT).show();
                            }
                        });
                    }

                })
                .setOnItemClickListener(onItemClickListener)
                .build()
                .bind();

3 多Item、多种数据类型列表

效果如图:

这次用横向展示 多种Item,数据结构不同。

用法:

如果数据结构不同,则不用传入泛型,但是使用时需要强转:

        //V1.8.0 建议使用Builder模式构建VGUtil
        new VGUtil.Builder()
                .setParent((ViewGroup) findViewById(R.id.activity_mul_type_mul_bean))
                .setAdapter(new MulTypeAdapter(this, datas) {
                    @Override
                    public void onBindViewHolder(ViewGroup parent, ViewHolder holder, IMulTypeHelper data, int pos) {
                        switch (data.getItemLayoutId()) {
                            case R.layout.item_mulbean_1:
                                MulBean1 mulBean1 = (MulBean1) data;
                                Glide.with(MulTypeMulBeanActivity.this)
                                        .load(mulBean1.getUrl())
                                        .into((ImageView) holder.itemView);
                                break;
                            case R.layout.item_mulbean_2:
                                MulBean2 mulBean2 = (MulBean2) data;
                                TextView tv = (TextView) holder.itemView;
                                tv.setText(mulBean2.getName());
                        }
                    }

                })
                .build()
                .bind();

数据结构:

public class MulBean1 implements IMulTypeHelper {
    private String url;
    @Override
    public int getItemLayoutId() {
        return R.layout.item_mulbean_1;
    }
}
public class MulBean2 implements IMulTypeHelper {
    private String name;
    @Override
    public int getItemLayoutId() {
        return R.layout.item_mulbean_2;
    }
}

Item1布局是一个ImageView,Item2布局是一个TextView

4 Item点击事件

item的点击和长按等事件,有两种方法设置,这里以点击事件为例,长按事件同理:

4.1 Adapter.onBindView()里设置

Adapter.onBindView()方法里能拿到ItemView,自然就可以设置各种事件。类似RecyclerView。

在这里设置优先级更高。原因后文会提到。

@Override
            public void onBindView(ViewGroup parent, View itemView, final MulTypeBean data, int pos) {
                ....
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Toast.makeText(mContext, "onBindView里设置:文字是:" + data.getName(), Toast.LENGTH_SHORT).show();
                    }
                });
            }

4.2 通过VGUtil.Builder()设置

可以在VGUtil.Builder()作为参数传入.

优先级比Adapter.onBindView()里设置低,原因后文会提到。

        //设置OnItemClickListener
        OnItemClickListener onItemClickListener = new OnItemClickListener() {
            @Override
            public void onItemClick(ViewGroup parent, View itemView, int position) {
                Toast.makeText(MulTypeActivity.this, "通过OnItemClickListener设置:" + position, Toast.LENGTH_SHORT).show();
            }
        };
        new VGUtil.Builder()
                .setParent(linearLayout)
                .setAdapter(adapter)
                .setOnItemClickListener(onItemClickListener)
                .setOnItemLongClickListener(longClickListener)
                .build()
                .bind();

5 刷新方法

5.1 API:

   Adapter.notifyDatasetChanged();

5.2 用法:

        final SingleAdapter adapter1 = new SingleAdapter<K50Bean>(this, mDatas, R.layout.item_50k) {
            @Override
            public void onBindViewHolder(ViewGroup parent, ViewHolder holder, K50Bean data, int pos) {
                holder.setText(R.id.tv, data.getName());
            }
        };

        //单一ItemView
        //ViewGroupUtils.addViews(llCurrent, adapter1);
        final VGUtil vgUtil = new VGUtil(llCurrent, adapter1, new OnItemClickListener() {
            @Override
            public void onItemClick(ViewGroup parent, View itemView, int position) {
                Toast.makeText(LinearLayoutActivity.this, "position:" + position + "被删除了", Toast.LENGTH_SHORT).show();
                mDatas.remove(position);
                adapter1.notifyDatasetChanged();
            }
        });
        //刷新刷新刷新
        vgUtil.bind();