【问题标题】:Removing an item from ListView inside a custom adapter从自定义适配器内的 ListView 中删除项目
【发布时间】:2013-04-17 15:01:41
【问题描述】:

我有一个包含“删除”按钮的自定义列表视图项。我创建了一个名为LazyListAdapter 的自定义适配器,它扩展了BaseAdapter。在我覆盖的 getView 方法中,我将此按钮的 onclick 方法设置如下:

@Override
public View getView(final int pos, View convertView, ViewGroup parent) {

     View v = convertView;

     // Some other things...

     ImageButton removeFav = (ImageButton) v.findViewById(R.id.removeFavorites);

     removeFav.setOnClickListener(new OnClickListener() {

     @Override
     public void onClick(View v) {

          // I delete the object from Parse database here,
          // Therefore I want the view to disappear here
     }
}

如何使用此 onclick 方法中的代码删除或以某种方式隐藏相应的视图?还是我应该改变我的方法?

非常感谢您。

【问题讨论】:

  • onClick()中调用notifyDataSetChanged()
  • 您的列表中有多少项?您可能需要考虑重用视图
  • 平均而言,我的浏览量不会超过 20-30 次,尽管它会从一个用户变为另一个用户。我不知道如何重用视图。
  • notifyDataSetChanged() 实际上工作得非常完美。非常感谢@SankarV

标签: android listview android-listview custom-adapter


【解决方案1】:

试试这个

@Override
public View getView(final int pos, View convertView, ViewGroup parent) {

    View v = convertView;

    // Some other things...

    ImageButton removeFav = (ImageButton) v.findViewById(R.id.removeFavorites);

    removeFav.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {

       // After you delete the object from Parse database here,
       notifyDataSetChanged();

    }
}

【讨论】:

  • @ecem:请在此处说明您要进行的编辑。这是一个很好的做法,每当您进行编辑时,请在此处留言。
  • 我只更改了间距,以便代码对未来的访问者更具可读性。仅此而已。
  • 这正常吗?我的意思是,我还想显示典型的确认消息(你确定,是/否)。我应该将该代码放在适配器中吗?谢谢。 @Ankit
  • 是的,你可以写一个dialog fragment并在每个删除按钮的onClick中启动它。确保为每一行维护唯一的 ID。
【解决方案2】:

尝试使用 parent.removeViewAt(position)。

【讨论】:

  • 这是我在使用您的答案时遇到的错误,java.lang.UnsupportedOperationException: removeViewAt(int) is not supported in AdapterView
【解决方案3】:

您可以像示例中那样在 getview 方法中删除一个项目

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

    ViewHolder viewHolder;

    if (convertView == null) {

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.list_row, null, false);
        viewHolder = new ViewHolder();
        viewHolder.img = (ImageView) convertView.findViewById(R.id.img);
        convertView.setTag(viewHolder);

    } else {
        // we call the view created before to not create a view in each time
        viewHolder = (ViewHolder) convertView.getTag();
    }

    final int imgId = imageId.get(position);

    viewHolder.img.setImageResource(imgId);

    viewHolder.img.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(context, "Clicked " + imgId, Toast.LENGTH_SHORT)
                    .show();
        }
    });

    // Create a generic swipe-to-dismiss touch listener.
    viewHolder.img.setOnTouchListener(new SwipeDismissTouchListener(
            viewHolder.img, null,
            new SwipeDismissTouchListener.DismissCallbacks() {
                @Override
                public boolean canDismiss(Object token) {
                    return true;
                }

                @Override
                public void onDismiss(View view, Object token) {

                    Log.d(TAG, "Image ıd" + imgId);


                    imageId.remove(position);
                    remove(position);

                    notifyDataSetChanged();
                }
            }));

    return convertView;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多