首页 > 解决方案 > android array adapter.notifyDataSetChanged() 正在改变项目的位置

问题描述

我有一个带有多个子元素的自定义布局的 listView 数组适配器。在getView()我将这些子视图绑定到 viewHolder 类,如下所示:

    @NonNull
    @Override
    public View getView(int position, View convertView, @NonNull ViewGroup parent) {

        // get item for selected view
        Item item = getItem(position);

        // if cell is exists - reuse it, if not - create the new one from resource
        FoldingCell cell = (FoldingCell) convertView;

        ViewHolder viewHolder;
        if (cell == null) {
            viewHolder = new ViewHolder();
            LayoutInflater vi = LayoutInflater.from(getContext());
            cell = (FoldingCell) vi.inflate(R.layout.cell, parent, false);

            viewHolder.delete = cell.findViewById(R.id.DeleteICN);
            viewHolder.delete.setTag(position);
            viewHolder.rename = cell.findViewById(R.id.renameBtn);
            viewHolder.rename.setTag(position);
            cell.setTag(viewHolder);

         ...
         ...

}
public void setDefaultRequestBtnClickListener(View.OnClickListener defaultRequestBtnClickListener) {
    this.defaultRequestBtnClickListener = defaultRequestBtnClickListener;
}

private static class ViewHolder{
    ConstraintLayout delete;
    ConstraintLayout rename;
 }

我正在deleterename视图上设置标签(位置),因此如果我删除或重命名特定元素(onclick),我可以使用标签轻松找到它。

问题是,当我使用以下代码单击重命名或删除按钮时:

 adapter.setDefaultRequestBtnClickListener(new View.OnClickListener(){
             @Override
             public void onClick(View v){              

                 Toast.makeText(rootView.getContext(), " "+v.getTag(), Toast.LENGTH_SHORT).show();

                 if(v.getId() == R.id.renameBtn){

                     System.out.println(v.getTag()); 
                     Item item = adapter.getItem(v.getTag());

                     //this changes a textView in the same listview element 
                     item.setTitle("newTitle");               

                 }
                 adapter.notifyDataSetChanged();

             }
         });

多次单击同一元素时,显示的 toast 正在更改值。但是,如果我注释掉adapter.notifyDataSetChanged()toast 为同一元素保留相同的值。这是为什么?

如果我应该发布任何其他代码,请告诉我。

标签: androidlistviewandroid-arrayadapternotifydatasetchanged

解决方案


推荐阅读