Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在DialogFragment内具有简单列表项多项选择的RecyclerView_Android_Android Recyclerview_Android Dialogfragment_Android Viewholder - Fatal编程技术网

Android 在DialogFragment内具有简单列表项多项选择的RecyclerView

Android 在DialogFragment内具有简单列表项多项选择的RecyclerView,android,android-recyclerview,android-dialogfragment,android-viewholder,Android,Android Recyclerview,Android Dialogfragment,Android Viewholder,在中,我使用android.R.layout.simple\u list\u item\u multiple\u选项显示一个RecyclerView,行布局: 在中,我实现了流行的“片段接口”模式,并希望通过其doPositiveClick()方法传递选定的行: public class SwapTilesDialogFragment extends DialogFragment { public final static String TAG = "SwapTilesDialogF

在中,我使用android.R.layout.simple\u list\u item\u multiple\u选项显示一个
RecyclerView
,行布局:

在中,我实现了流行的“片段接口”模式,并希望通过其
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();
    }
}
公共类swaptileDialogFragment扩展了DialogFragment{
公共最终静态字符串TAG=“swoptilesdialogfragment”;
私有最终静态字符串ARG=“ARG”;
公共接口MyListener{
public void doPositiveClick();
public void doNegativeClick();
}
私人MyListener mListener;
@凌驾
公共void-onAttach(上下文){
super.onAttach(上下文);
if(MyListener的上下文实例){
mListener=(MyListener)上下文;
}否则{
抛出新的ClassCastException(context.toString()+
“必须实现“+TAG+”.MyListener”);
}
}
@凌驾
公共无效连接(){
super.onDetach();
mListener=null;
}
私有类MyViewHolder
扩展RecyclerView.ViewHolder
实现View.OnClickListener{
公共MyViewHolder(视图v){
超级(五);
v、 setOnClickListener(此);
}
@凌驾
公共void onClick(视图v){
Toast.makeText(getContext(),
“您已单击“+((TextView)v).getText(),
吐司。长度(短)。show();
}
}
私人回收视图mRecyclerView;
私人私人信件;
公共静态SwaptileDialogFragment newInstance(字符[]个字母){
SwapTilesDialogFragment f=新的SwapTilesDialogFragment();
Bundle args=新Bundle();
args.putcharray(ARG,字母);
f、 设置参数(args);
返回f;
}
@凌驾
创建对话框上的公共对话框(Bundle savedInstanceState){
mLetters=getArguments().getCharArray(ARG);
mRecyclerView=new-RecyclerView(getContext());
setLayoutManager(新的LinearLayoutManager(getContext());
mRecyclerView.setAdapter(新的RecyclerView.Adapter(){
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(
android.R.layout.simple\u list\u item\u多选,
父母亲
假);
MyViewHolder vh=新的MyViewHolder(v);
返回vh;
}
@凌驾
BindViewHolder上的公共无效(MyViewHolder vh,内部位置){
TextView tv=(TextView)vh.itemView;
tv.setText(String.valueOf(mLetters[position]));
}
@凌驾
public int getItemCount(){
返回mLetters.length;
}
});
返回新的AlertDialog.Builder(getActivity())
.setIcon(R.mipmap.ic_启动器)
.setTitle(R.string.swap\u tiles\u title)
.setView(mRecyclerView)
.setPositiveButton(R.string.swap_tiles_ok,
新建DialogInterface.OnClickListener(){
public void onClick(对话框接口对话框,int whichButton){
mListener.doPositiveClick();
}
}
)
.setNegativeButton(R.string.swap\u tiles\u cancel,
新建DialogInterface.OnClickListener(){
public void onClick(对话框接口对话框,int whichButton){
mListener.doNegativeClick();
}
}
)
.create();
}
}
我的问题:


如何在用户单击RecyclerView中的一行时显示复选标记,以及如何/在何处收集所有选定行,然后再调用
doPositiveClick()

您可以执行以下操作:


有一个数组来跟踪选中的字母:

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

完成了。您现在可以从您的
活动

中检索检查过的信件。这是一个很好的建议,谢谢您+1。然而,我认为在
RecyclerView
(或适配器?)中已经有一些“数组”来保存所选行,并且更愿意使用它。。。另外,当我旋转时,复选框被重置。适配器唯一拥有的数组是您在其上创建的数组(
mLetters=getArguments().getCharArray(ARG);
)。所以你必须应用这个答案中解释的技巧。要保存旋转,您必须使用
savedInstanteceState
我想知道是否可以在调用
doPositiveClick
之前填充
checkedLetters
。。。
 public interface MyListener {
    public void doPositiveClick(List<String> checkedLetters);
    public void doNegativeClick();
}
 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());
    }
}'