Android:通过片段

时间:2016-04-22 22:04:04

标签: java android android-recyclerview

问题:

我通过点击将视图添加到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个?

1 个答案:

答案 0 :(得分:0)

简易解决方案

我不是在ViewHolder中分配onLongClickListener,而是将click侦听器指定为适配器创建中构造函数的一部分。这样,当您在onCreateViewHolder中创建视图持有者时,您将为视图持有者提供适配器传递的单击侦听器的新视图。这是更好的,因为它将click事件与ViewHolder的工作分离,并让创建适配器的活动处理单击时发生的事件。 (创建的对话框片段也与Activity生命周期相关联,为什么不在那里创建它!)。

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

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

以下列出了我的建议:

  1. 向回收站视图适配器的构造函数添加单击侦听器。
  2. 在活动中创建适配器时传递onLongClickListener对象。
  3. 为onCreateViewHolder中传递给适配器的点击侦听器分配视图。
  4. 在适配器活动中创建的单击侦听器中,创建对话框片段并指定一个新的单击侦听器来处理按下所需的按钮。此单击侦听器也是Activity的一部分。
  5. 在对话框片段中膨胀视图时,为目标按钮指定您分配给对话框片段的监听器。
  6. 从RecyclerView适配器中删除视图(或项目)的逻辑将在您分配给新对话框片段的单击侦听器中。您还需要引用当前正在删除的项目(通过参数执行)。

    高级解决方案

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