1

a simple test project at GitHub我顯示RecyclerViewandroid.R.layout.simple_list_item_multiple_choice行佈局:RecyclerView與DialogFragment的內部simple_list_item_multiple_choice

app screenshot

SwapTilesDialogFragment我已經實現流行的「片段接口」圖案,並希望通過選擇的行通過其doPositiveClick()方法:

public class SwapTilesDialogFragment extends DialogFragment { 

    public final static String TAG = "SwapTilesDialogFragment"; 

    private final static String ARG = "ARG"; 

    public interface MyListener { 
     public void doPositiveClick(); 
     public void doNegativeClick(); 
    } 

    private MyListener mListener; 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 

     if (context instanceof MyListener) { 
      mListener = (MyListener) context; 
     } else { 
      throw new ClassCastException(context.toString() + 
        " must implement " + TAG + ".MyListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 

     mListener = null; 
    } 

    private class MyViewHolder 
      extends RecyclerView.ViewHolder 
      implements View.OnClickListener { 

     public MyViewHolder(View v) { 
      super(v); 
      v.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      Toast.makeText(getContext(), 
        "You have clicked " + ((TextView) v).getText(), 
        Toast.LENGTH_SHORT).show(); 
     } 
    } 

    private RecyclerView mRecyclerView; 
    private char[] mLetters; 

    public static SwapTilesDialogFragment newInstance(char[] letters) { 
     SwapTilesDialogFragment f = new SwapTilesDialogFragment(); 

     Bundle args = new Bundle(); 
     args.putCharArray(ARG, letters); 
     f.setArguments(args); 

     return f; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     mLetters = getArguments().getCharArray(ARG); 

     mRecyclerView = new RecyclerView(getContext()); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 
     mRecyclerView.setAdapter(new RecyclerView.Adapter<MyViewHolder>() { 

      @Override 
      public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
       View v = LayoutInflater.from(parent.getContext()).inflate(
         android.R.layout.simple_list_item_multiple_choice, 
         parent, 
         false); 
       MyViewHolder vh = new MyViewHolder(v); 
       return vh; 
      } 

      @Override 
      public void onBindViewHolder(MyViewHolder vh, int position) { 
       TextView tv = (TextView) vh.itemView; 
       tv.setText(String.valueOf(mLetters[position])); 
      } 

      @Override 
      public int getItemCount() { 
       return mLetters.length; 
      } 
     }); 

     return new AlertDialog.Builder(getActivity()) 
       .setIcon(R.mipmap.ic_launcher) 
       .setTitle(R.string.swap_tiles_title) 
       .setView(mRecyclerView) 
       .setPositiveButton(R.string.swap_tiles_ok, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton) { 
           mListener.doPositiveClick(); 
          } 
         } 
       ) 
       .setNegativeButton(R.string.swap_tiles_cancel, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton) { 
           mListener.doNegativeClick(); 
          } 
         } 
       ) 
       .create(); 
    } 
} 

我的問題:

如何顯示用戶在RecyclerView中單擊某一行時的複選標記以及在我致電doPositiveClick()之前如何/如何收集所有選定的行?

回答

1

你可以沿着下面的內容:


有一個數組,以保持檢查信件的軌跡:

private List<String> checkedLetters = new ArrayList<>(); 

修改你的聽衆:

public interface MyListener { 
    public void doPositiveClick(List<String> checkedLetters); 
    public void doNegativeClick(); 
} 

你ViewHolder:

private class MyViewHolder 
     extends RecyclerView.ViewHolder 
     implements View.OnClickListener { 

    private CheckedTextView mCheckedText; 

    public MyViewHolder(View v) { 
     super(v); 
     v.setOnClickListener(this); 
     mCheckedText = (CheckedTextView)itemView; 
    } 

    @Override 
    public void onClick(View v) { 
     Toast.makeText(getContext(), 
       "You have clicked " + ((TextView) v).getText(), 
       Toast.LENGTH_SHORT).show(); 

     toggle(); 
    } 

    private void toggle(){ 

     if(mCheckedText.isChecked()) 
      checkedLetters.remove(LETTERS[getAdapterPosition()]); 
     else 
      checkedLetters.add(LETTERS[getAdapterPosition()]); 

     mCheckedText.setChecked(!mCheckedText.isChecked()); 
    } 
}' 

完成。您現在可以從Activity

+0

中檢索選中的字母這是很好的建議,謝謝+1。不過,我認爲'RecyclerView'(或適配器?)中已經有一些「數組」來容納選定的行,並且傾向於使用它......此外,當我旋轉時,複選框將被重置。 –

+2

適配器所擁有的唯一數組就是您在其上創建的數組('mLetters = getArguments()。getCharArray(ARG);')。所以你必須應用這個答案中解釋的技巧。爲了節省旋轉,你必須使用'savedInstanteceState' – Budius

+0

我想知道是否可以在調用doPositiveClick之前填充checkedLetters ... –

相關問題