Android动态可编辑长度列表

概述

在界面实现一个列表,用户可以随意给列表新增或者删除项目,在开发中比较常用,但是真正做起来又有点花时间,今天花时间做一个,以便在以后的开发中用到。

详细

运行效果:

二、实现思路:

1、实现一个主界面,主界面放一个list用来显示这个动态的列表,还要包含一个按钮用来点击时新增列表的栏目。
2、实现列表的适配器Adapter,这里实现显示栏目布局以及删除当前栏目的接口回调。
3、在主界面列表变更中(新增or删除),能准确获取当前适配器的内容,以便不会误删。

三、实现过程:

1、实现一个主界面,主界面放一个list用来显示这个动态的列表,还要包含一个按钮用来点击时新增列表的栏目。

 

    public class MainActivity extends AppCompatActivity implements ObserveEtListener, View.OnClickListener{
        private ActivityMainBinding mViews;
        private DynamicNewAdapter dynamicNewAdapter;
        private MainViewModel mainViewModel;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mViews = DataBindingUtil.setContentView(this,R.layout.activity_main);
            mainViewModel = new ViewModelProvider(this).get(MainViewModel.class);
            dynamicNewAdapter = new DynamicNewAdapter(this);
            mViews.recycleView.setAdapter(dynamicNewAdapter);
            dynamicNewAdapter.syncSetNewData(mainViewModel.drugsBeanList);
            mViews.setOnClickListener(this);
        }
       // 删除栏目
        @Override
        public void delateObserve(int pos) {
            dynamicNewAdapter.syncSetNewData(new ArrayList<>(getAdapterDetails(pos)));
        }
        @Override
        public void onClick(View v) {
            int vId = v.getId();
            switch (vId){
                case R.id.addItem:
                    // 新增栏目
                    addItem();
                    break;
            }
        }
        /**
         * 新增栏目
         */
        private void addItem(){
            mainViewModel.drugsBeanList = getAdapterDetails(-1);
            mainViewModel.drugsBeanList.add(new DrugsBean("", "", "ml/亩"));
            dynamicNewAdapter.syncSetNewData(mainViewModel.drugsBeanList);
        }
2、实现列表的适配器Adapter,这里实现显示栏目布局以及删除当前栏目的接口回调。
    public class DynamicNewAdapter extends BaseDataBindingAdapter {
        private ObserveEtListener listener;
        private String[] numbers = Utils.getApp().getResources().getStringArray(R.array.usage_array);
        public DynamicNewAdapter(ObserveEtListener listener) {
            super(R.layout.item_dyncmic_adapter);
            this.listener = listener;
        }
        @Override
        protected void convert(@NonNull DataBindViewHolder helper, DrugsBean drugsBean) {
            helper.binding.tvNameValue.setText(drugsBean.drugName);
            helper.binding.tvUsageValue.setText(drugsBean.weigth);
            int pos = getData().indexOf(drugsBean);
            helper.binding.tvUsageUnit.setText(drugsBean.unit);
            helper.binding.spinnerUnit.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView parent, View view, int position, long id) {
                    helper.binding.tvUsageUnit.setText(numbers[position]);
                }
                @Override
                public void onNothingSelected(AdapterView parent) {
                }
            });
            if (drugsBean.unit != null && drugsBean.unit.indexOf("ml") > -1) {
                helper.binding.spinnerUnit.setSelection(0, true);
            } else {
                helper.binding.spinnerUnit.setSelection(1, true);
            }
            helper.setTag(R.id.img_del, pos);
            helper.binding.imgDel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null) {
                        int pos = (int) v.getTag();
                        notifyItemRemoved(pos);
                        getData().remove(pos);
                        listener.delateObserve(pos);
                    }
                }
            });
        }
    }
3、在主界面列表变更中(新增or删除),能准确获取当前适配器的内容,以便不会误删。
/**
     * 获取当前列表数据
     * @param pos
     * @return
     */
    private List getAdapterDetails(int pos) {
        List details = new ArrayList<>();
        int length = mViews.recycleView.getChildCount();
        for (int i = 0; i < length; i++) {
            if (pos == i)
                continue;
            ConstraintLayout ll_item = (ConstraintLayout) mViews.recycleView.getChildAt(i);
            TextView tv_name_value = ll_item.findViewById(R.id.tv_name_value);
            TextView tv_usage_value = ll_item.findViewById(R.id.tv_usage_value);
            TextView tv_usage_unit = ll_item.findViewById(R.id.tv_usage_unit);
            details.add(new DrugsBean(tv_name_value.getText().toString().trim(),
                    tv_usage_value.getText().toString().trim(), tv_usage_unit.getText().toString().trim()));
        }
        return details;
    }

四、项目文件结构截图

 

Android动态可编辑长度列表_第1张图片

你可能感兴趣的:(移动技术,android)