Android动态删减ListView,类似学习经历增删,钉钉物品领用

在ListView删减中遇到问题,删除对应item后dataList中没有进行及时更新,可能会造成如下问题:

1、删除最后一项,新增一项后出现默认值为此前删除的内容;

2、删除中间项,但是中间项的内容没有删除,实际效果为删除最后一项。

演示效果图如下,时长38s:

主要代码如下:

package com.example.administrator.dynamiclistview;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Looper;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;

public class MainActivity extends AppCompatActivity {
    private TextView add;
    private PickAdapter adapter;
    private   ArrayList<HashMap<String, Object>> dataList=new ArrayList<>();
    private Context context;
    private ListView pickList;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViews();
        initViews();
    }

    protected void findViews() {
        context=MainActivity.this;
        pickList=(ListView)findViewById(R.id.pick_list);
        add=(TextView)findViewById(R.id.add);
    }

    protected void initViews() {
            HashMap<String, Object> map = new HashMap<>();
            map.put("name","");
            map.put("number","");
            dataList.add(map);
            adapter = new PickAdapter(context, dataList);
            pickList.setAdapter(adapter);
            add.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    HashMap<String, Object> map = new HashMap<>();
                    map.put("name","");
                    map.put("number","");
                    dataList.add(map);
                    adapter.notifyDataSetChanged();
                    //刷新页面
                    setListViewHeightBasedOnChildren(pickList);
                }
            });
    }
    //构建adapter
    private class PickAdapter extends BaseAdapter {
        private LayoutInflater inflater;
        Context context;
        String func;
        private PickAdapter(Context context, ArrayList<HashMap<String,Object>> dataList){
            inflater=LayoutInflater.from(context);
            this.context=context;
        }

        @Override
        public int getCount() {
            return dataList.size();
        }

        @Override
        public Object getItem(int position) {
            return dataList.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
                final PickAdapter.ViewHolder holder;
                if (convertView == null) {
                    convertView = inflater.inflate(R.layout.item_pick, parent, false);
                    holder = new PickAdapter.ViewHolder();
                    holder.pick_name = (EditText) convertView.findViewById(R.id.name_input);
                    holder.pick_item = (EditText) convertView.findViewById(R.id.number_input);
                    holder.pick_number = (TextView) convertView.findViewById(R.id.pick_number);
                    holder.delete = (TextView) convertView.findViewById(R.id.delete);
                    convertView.setTag(holder);
                } else {
                    holder = (PickAdapter.ViewHolder) convertView.getTag();
                }
                final HashMap map = dataList.get(position);
                if (holder.pick_name.getTag() instanceof TextWatcher || holder.pick_name.getTag() instanceof TextWatcher) {
                    holder.pick_name.removeTextChangedListener((TextWatcher) (holder.pick_name.getTag()));
                    holder.pick_item.removeTextChangedListener((TextWatcher) (holder.pick_item.getTag()));
                }
                if (map.get("name").equals("")) {holder.pick_name.setText("");
                } else {
                    holder.pick_name.setText( map.get("name").toString());
                }
                if (map.get("number").equals("")) {
                    holder.pick_item.setText("");
                } else {
                    holder.pick_item.setText( map.get("number").toString());
                }
                //创建监听器绑定Name,变动时进行存储,Number同理,也可以在删除或者增加时先存储数据再进行增删操作。
                TextWatcher name = new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {}

                    @Override
                    public void afterTextChanged(Editable s) {
                        holder.pick_name.getText().toString();
                        if (holder.pick_name.getText().toString().equals("")) {
                            dataList.get(position).put("name", "");
                        } else
                            dataList.get(position).put("name", holder.pick_name.getText().toString());
                    }
                };
                TextWatcher number = new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {}
                    @Override
                    public void afterTextChanged(Editable s) {
                        holder.pick_item.getText().toString();
                        if (holder.pick_item.getText().toString().equals("")) {
                            dataList.get(position).put("number", "");
                        } else
                            dataList.get(position).put("number", holder.pick_item.getText().toString());
                    }
                };
                if (dataList.size() == 1) {
                    //只有一项不能删除
                    holder.delete.setVisibility(View.GONE);
                } else holder.delete.setVisibility(View.VISIBLE);
                holder.delete.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        new AlertDialog.Builder(context)
                                .setTitle("你确定要删除" + holder.pick_number.getText().toString() + "吗?")
                                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        dataList.remove(position);
                                        adapter.notifyDataSetChanged();
                                        setListViewHeightBasedOnChildren(pickList);
                                    }
                                })
                                .setNegativeButton("取消", null)
                                .show().setCanceledOnTouchOutside(false);
                    }
                });
                holder.pick_number.setText("物品明细(" + (position + 1) + ")");
                holder.pick_name.addTextChangedListener(name);
                holder.pick_item.addTextChangedListener(number);
                holder.pick_name.setTag(name);
                holder.pick_item.setTag(number);
            return convertView;
        }

        class ViewHolder {
            TextView pick_name;
            TextView pick_item;
            TextView pick_number;
            TextView delete;
        }
    }

    /**
     * 为了解决ListView在ScrollView中只能显示一行数据的问题
     *
     * @param listView
     */
    public static void setListViewHeightBasedOnChildren(ListView listView) {
        // 获取ListView对应的Adapter
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            return;
        }

        int totalHeight = 0;
        for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目
            View listItem = listAdapter.getView(i, null, listView);

            listItem.measure(0, 0); // 计算子项View 的宽高
            totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight
                + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        // hisListView.getDividerHeight()获取子项间分隔符占用的高度
        // params.height最后得到整个ListView完整显示需要的高度
        listView.setLayoutParams(params);
    }


}

主界面xml如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/root_layout"
    android:background="#FFFFFF"
    android:clickable="true"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:paddingBottom="60dp"
            android:layout_marginTop="10dp"
            >

            <ListView
                android:id="@+id/pick_list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/yl_bg_gray"
                android:divider="@color/divider"
                android:dividerHeight="0dp"></ListView>
            <LinearLayout
                android:layout_width="match_parent"
                android:id="@+id/add_layout"
                android:orientation="vertical"
                android:layout_height="wrap_content">
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="1dp"
                    android:background="#F7F7F7"
                    android:visibility="visible" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textColor="#2e9eff"
                    android:textSize="16sp"
                    android:id="@+id/add"
                    android:layout_gravity="center"
                    android:gravity="center"
                    android:padding="5dp"
                    android:text="+增加物品明细"/>
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="1dp"
                    android:background="#F7F7F7"
                    android:visibility="visible" />
            </LinearLayout>


        </LinearLayout>
    </ScrollView>


</LinearLayout>

单个item的xml如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:background="@color/yl_title_white"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <RelativeLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_marginTop="10dp"
        android:background="@color/yl_title_white"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/pick_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="14sp"
            android:padding="5dp"
            android:text="物品明细"/>

        <TextView
            android:id="@+id/delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"

            android:padding="5dp"
            android:textColor="@color/yl_system_blue"
            android:text="删除"
            android:textSize="14sp" />
    </RelativeLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"

        >


        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:orientation="horizontal"
            android:paddingBottom="8dp"
            android:paddingTop="8dp"
            android:gravity="center_vertical"
            android:layout_height="wrap_content">

            <TextView

                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="3dp"
                android:gravity="center"
                android:layout_marginLeft="20dp"
                android:textSize="17sp"
                android:text="申领物品" />

            <EditText
                android:id="@+id/name_input"
                android:layout_height="wrap_content"
                android:layout_width="match_parent"
                android:padding="5dp"
                android:textSize="17sp"
                android:layout_marginRight="30dp"
                android:gravity="center"
                android:background="@color/yl_bg_gray"
                android:hint="请输入"
                android:textColorHint="@color/yl_tx_gray" />
        </LinearLayout>



        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:orientation="horizontal"
            android:paddingBottom="8dp"
            android:paddingTop="8dp"
            android:gravity="center_vertical"
            android:layout_height="wrap_content">

            <TextView

                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="3dp"
                android:gravity="center"
                android:layout_marginLeft="20dp"
                android:textSize="17sp"
                android:text="申领数量" />

            <EditText
                android:id="@+id/number_input"
                android:layout_height="wrap_content"
                android:layout_width="match_parent"
                android:padding="5dp"
                android:textSize="17sp"
                android:layout_marginRight="30dp"
                android:gravity="center"
                android:background="@color/yl_bg_gray"
                android:hint="请输入"
                android:textColorHint="@color/yl_tx_gray" />
        </LinearLayout>

    </LinearLayout>

</LinearLayout>

下载地址:

https://download.csdn.net/download/weixin_40299948/11156278

github链接:

https://github.com/Black-Mango/dynamicListView

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值