在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链接: