繁体   English   中英

Android:通过片段删除回收器视图

[英]Android: removing recycler view through fragment

题:

我点击一下即可将视图添加到recyclerview中。 当我单击视图时,它会打开一个DialogFragment,如何通过DialogFragment删除该视图(通过单击视图中的按钮来实现)?

适配器:

public class SubjectsAdapter extends RecyclerView.Adapter<SubjectsAdapter.ViewHolder> {

    public List<String> items = new ArrayList<>();
    public Activity mcontext;

    public SubjectsAdapter(Activity context) {
        this.mcontext=context;

    }

    public void addItem(String name) {
        items.add(name);
        notifyItemInserted(items.size() - 1);
    }

    public void removeItem(int position) {
        items.remove(position);
        notifyItemRemoved(position);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.grid_item_button, parent, false);
        view.requestFocus();
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.setButtonName(items.get(position));
    }

    @Override
    public int getItemCount() {
        return items.size();
    }


    int i = 100;
    public EditText EditName;

    class ViewHolder extends RecyclerView.ViewHolder{

        public Button GridButton;
        public SharedPreferences prefs;

        public ViewHolder(View itemView) {
            super(itemView);

            GridButton = (Button) itemView.findViewById(R.id.grid_button);
            EditName = (EditText) itemView.findViewById(R.id.editName);
            ClassName = (TextView) itemView.findViewById(R.id.ClassName);
            prefs = mcontext.getPreferences(Context.MODE_PRIVATE);

            GridButton.setId(++i);

            EditName.requestFocus();

            //Showing the DialogFragment
            GridButton.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    Fragment_Subject_Edit editFragment = Fragment_Subject_Edit.newInstance();

                    Bundle data = new Bundle();
                    data.putInt("ID", v.getId());
                    editFragment.setArguments(data);

                    editFragment.show(mcontext.getFragmentManager(), "Title");
                    return false;
                }
            });
        }

        public void setButtonName(String buttonName) {
            GridButton.setText(buttonName);
        }
    }
}

在活动中添加视图:

    recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
    final SubjectsAdapter adapter = new SubjectsAdapter(this);
    recyclerView.addItemDecoration(new SampleItemDecoration());
    recyclerView.setAdapter(adapter);
    recyclerView.setItemViewCacheSize(15);
    recyclerView.setNestedScrollingEnabled(false);


 @Override
 public void onClick(View v) {           

       adapter.addItem(prefs.getString("key1", null));

  }

我从卢卡斯·克劳福德(Lucas Crawford)那里得到的答案是正确的,尽管我做错了:

1:

public Activity mcontext;
public View.OnLongClickListener LongClicking;

public SubjectsAdapter(Activity context, View.OnLongClickListener longClick) {
    this.mcontext = context;
    this.LongClicking = longClick;
}

2:

View.OnLongClickListener LongClicker;
...
...
...
        adapter = new SubjectsAdapter(this, LongClicker);
        recyclerView.setAdapter(adapter);

3:

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View view = inflater.inflate(R.layout.grid_item_button, parent, false);
    view.setOnLongClickListener(LongClicking);
    return new ViewHolder(view);
}

4:

        fm = getFragmentManager();
        ClassEditor = new Fragment_Subject_Edit();

        LongClicker = new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            Bundle data = new Bundle();
            data.putInt("ID", v.getId());
            ClassEditor.setArguments(data);
            ClassEditor.show(fm, "Title");
            return false;
        }
    };

当我长按按钮时,在视图中的任何地方都没有任何反应,这些步骤有什么问题,以及如何执行数字5?

简易解决方案

与其在ViewHolder中分配onLongClickListener,不如在适配器创建过程中将click侦听器分配为构造函数的一部分。 这样,当您在onCreateViewHolder中创建视图持有者时,可以为适配器提供的传递给其的单击侦听器为该视图持有者提供新视图。 这样比较好,因为它可以将click事件与ViewHolder的工作分离开来,并且可以让创建适配器的活动处理单击事件。 (创建的对话框片段也与活动生命周期相关联,为什么不在那里创建它!)。

接下来,在对话框片段的创建中添加一个单击侦听器,可以将其作为带有getter / setter的成员变量。 然后,当您扩展对话框片段视图时,片段中的按钮将被分配为单击侦听器。 这样,您就可以在Activity中监听所有click事件,并在适配器和对话框片段中使用相同的策略。

可以提供所需的代码IF。 我希望这是有道理的。

这是我建议的清单:

  1. 将单击侦听器添加到回收器视图适配器的构造函数。
  2. 在活动中创建适配器时,传递onLongClickListener对象。
  3. 为视图分配在onCreateViewHolder中传递给适配器的单击侦听器。
  4. 在您的适配器活动中创建的点击侦听器内,创建对话框片段并分配一个新的点击侦听器以处理所需的按钮按下。 此点击侦听器也是“活动”的一部分。
  5. 放大对话框片段中的视图时,请为目标按钮提供您分配给该对话框片段的侦听器。

从RecyclerView适配器删除视图(或项目)的逻辑是在您分配给新对话框片段的Click侦听器中。 您还需要引用当前要删除的项目(您可以通过自变量进行引用)。

进阶解决方案

一个更高级的解决方案是使用EventBus之类的东西来处理事件监听。 它清理了很多代码来使用它。 另一个是奥托广场。 它做同样的事情,我个人使用Otto进行事件驱动的侦听,而不是传递点击侦听器。 您只需在适配器中设置一个单击侦听器,以发布活动正在监听的事件,然后触发对话框片段的创建,就可以消除将单击侦听器传递到回收站适配器的需要。 然后,对话框片段将通过在片段内创建并分配一个新的侦听器来执行相同的操作,该侦听器将发布另一个活动正在监听的事件,该事件与删除特定适配器项有关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM