Android 无法从阵列适配器中更新数据

Android 无法从阵列适配器中更新数据,android,android-listview,android-arrayadapter,notifydatasetchanged,Android,Android Listview,Android Arrayadapter,Notifydatasetchanged,Im使用带有so的阵列适配器显示线性布局列表。布局有3个文本字段和一个隐藏按钮,单击列表项时会显示该按钮。我试图做的是将onclicklistener附加到按钮,该按钮将从arraylist/adapter中删除该行并更新数据集。我有以下代码: public class CheckAdapter extends ArrayAdapter<Check> { Context context; int layoutResourceId; ArrayList<C

Im使用带有so的阵列适配器显示线性布局列表。布局有3个文本字段和一个隐藏按钮,单击列表项时会显示该按钮。我试图做的是将onclicklistener附加到按钮,该按钮将从arraylist/adapter中删除该行并更新数据集。我有以下代码:

public class CheckAdapter extends ArrayAdapter<Check> {
    Context context;
    int layoutResourceId;
    ArrayList<Check> data = null;

    public CheckAdapter(Context context, int resource, ArrayList<Check> objects) {
        super(context, resource, objects);
        this.context = context;
        this.layoutResourceId = resource;
        this.data = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

        if(convertView == null){
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            convertView = inflater.inflate(layoutResourceId, parent, false);

            holder = new ViewHolder(convertView.findViewById(R.id.checklistRoot));
            holder.checkName = (TextView) convertView.findViewById(R.id.checklistname);
            holder.checkNumber = (TextView) convertView.findViewById(R.id.checklistnumber);
            holder.checkTotal = (TextView) convertView.findViewById(R.id.checklisttotal);
            holder.deleteButton = (Button) convertView.findViewById(R.id.deletecheck);

            holder.swipeButtons();

            convertView.setTag(holder);
        }
        else
        {
            holder = (ViewHolder)convertView.getTag();
            holder.swipeButtons();
        }

        String name = data.get(position).getName();
        Double total = data.get(position).getAmmount();
        Long number = data.get(position).getCheckNumber();

        holder.checkName.setText(name);
        holder.checkNumber.setText(number.toString());
        holder.checkTotal.setText(total.toString());

        holder.deleteButton.setTag(position);
        holder.deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Integer position = (Integer) view.getTag();
                Log.d("Check Adapter", "Button Clicked: " + position);
                data.remove(position);
                notifyDataSetChanged();
            }
        });
        return convertView;

    }

    static class ViewHolder{
        TextView checkName;
        TextView checkNumber;
        TextView checkTotal;
        Button deleteButton;
        View rootView;


        ViewHolder(View rootView) {
            this.rootView = rootView;
        }

        public void swipeButtons(){
            rootView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    deleteButton.setVisibility(View.VISIBLE);
                    return false;
                }
            });
        }
    }
}
公共类CheckAdapter扩展了ArrayAdapter{
语境;
国际布局资源;
ArrayList数据=null;
公共CheckAdapter(上下文上下文、int资源、ArrayList对象){
超级(上下文、资源、对象);
this.context=上下文;
this.layoutResourceId=资源;
这个数据=对象;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder=null;
if(convertView==null){
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
convertView=充气机。充气(layoutResourceId,父项,false);
holder=新的ViewHolder(convertView.findViewById(R.id.checklistRoot));
holder.checkName=(TextView)convertView.findViewById(R.id.checklistname);
holder.checkNumber=(TextView)convertView.findViewById(R.id.checklistnumber);
holder.checkTotal=(TextView)convertView.findViewById(R.id.checklisttotal);
holder.deleteButton=(Button)convertView.findViewById(R.id.deletecheck);
支架。开关按钮();
convertView.setTag(支架);
}
其他的
{
holder=(ViewHolder)convertView.getTag();
支架。开关按钮();
}
字符串名称=data.get(position).getName();
Double total=data.get(position.getamount();
Long number=data.get(position.getCheckNumber();
holder.checkName.setText(名称);
holder.checkNumber.setText(number.toString());
holder.checkTotal.setText(total.toString());
holder.deleteButton.setTag(位置);
holder.deleteButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
整数位置=(整数)视图。getTag();
Log.d(“检查适配器”,“点击按钮:+位置”);
数据删除(位置);
notifyDataSetChanged();
}
});
返回视图;
}
静态类视窗夹{
文本视图检查名称;
文本视图检查编号;
文本视图检查总数;
按钮删除按钮;
视图根视图;
ViewHolder(视图根视图){
this.rootView=rootView;
}
公共无效swipeButtons(){
setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图、运动事件、运动事件){
deleteButton.setVisibility(View.VISIBLE);
返回false;
}
});
}
}
}
我的日志显示我已将正确的位置发送到数据中。删除(位置);但是,ListView似乎没有更新,数据似乎仍然存在。有什么建议吗


非常感谢

您还可以尝试使用
getView
方法本身提供的位置值。 同时移除行
holder.deleteButton.setTag(位置)来自getView方法

因此,您的代码如下所示:

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

        // --- Your other code ---//


        holder.deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                data.remove(position);
                notifyDataSetChanged();
            }
        });
        return convertView;

    }

希望这对您有所帮助。

您也可以尝试使用
getView
方法本身提供的位置值。 同时移除行
holder.deleteButton.setTag(位置)来自getView方法

因此,您的代码如下所示:

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

        // --- Your other code ---//


        holder.deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                data.remove(position);
                notifyDataSetChanged();
            }
        });
        return convertView;

    }

希望这能对您有所帮助。

ListView listvw=(ListView)家长如何;listvw.invalidateViews();您可以使用接口并在arrayadapter构造函数中传递其实例。在deletebutton ClickListener中,您可以调用此接口并向activity发送消息,在activity中,您可以在adapater实例上调用notifyDataSetChanged();listvw.invalidateViews();您可以使用接口并在arrayadapter构造函数中传递其实例。在deletebutton ClickListener中,您可以调用此接口并向activity发送消息,在activity中,您可以在adapater实例上调用notifyDataSetChanged()。这很有效!我在猜测数据。罪魁祸首是删除(整数)而不是整数。非常感谢。@User22791我会在适配器外部设置Click Listener,特别是我不会提及holder,因为维护该代码可能会很困难。然而,它工作得很好,这就是OP想要的。这起作用了!我在猜测数据。罪魁祸首是删除(整数)而不是整数。非常感谢。@User22791我会在适配器外部设置Click Listener,特别是我不会提及holder,因为维护该代码可能会很困难。然而,它工作得很好,这就是OP想要的。