簡體   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