【问题标题】:i want to delete item from listview without restarting actitvity我想从列表视图中删除项目而不重新启动活动
【发布时间】:2019-05-29 11:30:23
【问题描述】:

我想在长按该项目时删除一个列表视图项目。删除项目后,我需要重新启动活动以查看更改,但我想立即查看更改

我已经尝试过 notifyDataSetChanged();但它不起作用我从 sqlite 数据库中获取数据并将其放入 hashmaps 并将其发送到自定义适配器 长按时会从数据库中删除一行,但列表视图中不会发生任何更改。

@Override
public View getView( final  int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    ImageView imageView = view.findViewById(R.id.detailsimage);
    CardView cardView = view.findViewById(R.id.detailcardView);
    TextView textmo =view.findViewById(R.id.detailsmo);
    TextView texttu =view.findViewById(R.id.detailstu);
    TextView textwe =view.findViewById(R.id.detailswe);
    TextView textth =view.findViewById(R.id.detailsthu);
    TextView  textfr =view.findViewById(R.id.detailsfri);
    TextView textsa =view.findViewById(R.id.detailssat);
    TextView textsu =view.findViewById(R.id.detailssun);

    final databasehandler db = new databasehandler(context);
    cardView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {

            db.deleteTitle(position+1);
            Toast.makeText(context,Integer.toString(position),Toast.LENGTH_SHORT).show();
            notifyDataSetChanged();

            return true;
        }
    });

    imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            HashMap<String, String> hashmap= arrayList.get(position);
            String string= hashmap.get("repeat");
            string = Objects.requireNonNull(string).trim();


            Toast.makeText(context,string,Toast.LENGTH_SHORT).show();
        }
    });

    HashMap<String, String> hashmap= arrayList.get(position);
    String string= Objects.requireNonNull(hashmap.get("repeat")).trim();
   String[] separated = Objects.requireNonNull(string).split("");

                        }
            }}
 return view;
 }
}

【问题讨论】:

  • 您必须从列表中删除该项目才能看到更改。

标签: android listview baseadapter


【解决方案1】:

你不应该调用notifyDataSetChanged它会刷新整个列表,这会影响性能

cardView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        db.deleteTitle(position+1);
        yourArrayList.remove(position);
        Toast.makeText(context,Integer.toString(position),Toast.LENGTH_SHORT).show();
        notifyItemRemoved(position);
        return true;
    }
});

【讨论】:

    【解决方案2】:

    将列表传递给适配器并更改此块

    cardView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
    
            db.deleteTitle(position+1);
            yourList.remove(position);
         Toast.makeText(context,Integer.toString(position),Toast.LENGTH_SHORT).show();
            notifyDataSetChanged();
    
            return true;
        }
    });
    

    【讨论】:

      【解决方案3】:

      好吧,您应该在自定义适配器中重新加载数据。根据您的描述,我理解它没有以任何方式与数据库绑定,那么为什么即使在调用notifyDataSetChange() 之后它也会重新加载? notifyDataSetChange 在您的适配器中注册了实际的观察者时有效。

      查看LoadersContent Providers,以便在ListView 中自动反映数据库状态。这是链接 - https://developer.android.com/guide/components/loaders

      【讨论】:

        【解决方案4】:

        请创建自定义数组列表:-

        List<Integer> al = new ArrayList<>(); 
            al.add("item 1"); 
            al.add("item 2"); 
            al.add("item 3"); 
            al.add("item 4"); 
            al.add("item 5");   
        

        设置适配器:-

        StableArrayAdapter adapter = new StableArrayAdapter(this,
                    android.R.layout.simple_list_item_1, a1);
            listview.setAdapter(adapter);
        

        从位置移除项目

        al.remove(position); 
        

        现在刷新列表视图适配器:-

        adapter.notifyDataSetChanged();
        

        【讨论】:

          猜你喜欢
          • 2017-03-15
          • 2019-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多