1

В a simple test project at GitHub отобразить макет RecyclerView с android.R.layout.simple_list_item_multiple_choice строки:RecyclerView с simple_list_item_multiple_choice внутри DialogFragment

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

. Интересно, можно ли заполнить' checkedLetters' перед тем, как вызывается 'doPositiveClick' ... –