首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从Adapter到fragment获取复选框值

如何从Adapter到fragment获取复选框值
EN

Stack Overflow用户
提问于 2018-07-12 07:01:39
回答 1查看 707关注 0票数 0

我有一个cardView自定义布局,里面有一个复选框,我在片段中的recyclerView中使用这个cardView (我有3个片段和一个适配器)。

我尝试使用不同的教程为checkbox实现setOnCheckedListener,因为我需要知道是否选中了recyclerView中的所有复选框,并将每个复选框的布尔值放入片段中的SparseBooleanArray中。

我的适配器:

public class WarmupProgramAdapter extends RecyclerView.Adapter<WarmupProgramAdapter.ProductViewHolder> {

private Context mCtx;
private List<Program> warmupProgramList;

public WarmupProgramAdapter(Context mCtx, List<Program> warmupProgramList) {
    this.mCtx = mCtx;
    this.warmupProgramList = warmupProgramList;
}

@NonNull
@Override
public ProductViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    //inflating and returning our view holder
    LayoutInflater inflater = LayoutInflater.from(mCtx);
    View view = inflater.inflate(R.layout.custom_program_card_layout, null);
    ProductViewHolder holder = new ProductViewHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(@NonNull final ProductViewHolder holder, final int position) {
    //getting the program of the specified position
    final Program program = warmupProgramList.get(position);

    //binding the data with the viewholder views
    holder.imageView.setImageDrawable(mCtx.getResources().getDrawable(program.getImage()));
    holder.tvName.setText(program.getName());
    holder.tvHow.setText(program.getHow());
    holder.tvHint.setText(program.getHint());
    holder.checkBox.setChecked(program.getDone());

    holder.checkBox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (program.getDone()) {
                program.setDone(false);
                cbWarmupProgramStateArray.put(position, false);
            } else {
                program.setDone(true);
                cbWarmupProgramStateArray.put(position, true);
            }

            int trueCount = 0;
            for (int i = 0; i < cbWarmupProgramStateArray.size(); i++) {
                if (cbWarmupProgramStateArray.get(i)) {
                    trueCount++;
                }
                if ((trueCount == WarmupFragment.programWarmupList.size())) {
                    Toast.makeText(mCtx, " ## Program done !", Toast.LENGTH_SHORT).show();
                    break;
                }
            }
        }
    });
}

@Override
public int getItemCount() {
    return warmupProgramList.size();
}

static class ProductViewHolder extends RecyclerView.ViewHolder{

    TextView tvName, tvHow, tvHint;
    ImageView imageView;
    CheckBox checkBox;

    ProductViewHolder(View itemView) {
        super(itemView);

        imageView = itemView.findViewById(R.id.iv_type_program);
        tvName = itemView.findViewById(R.id.tv_name_program);
        tvHow = itemView.findViewById(R.id.tv_how_program);
        tvHint = itemView.findViewById(R.id.tv_hint_program);
        checkBox = itemView.findViewById(R.id.cb_program);
    }
}
}

正如您所看到的,我尝试使用setOnClickListener作为复选框,我将所有的值都放在SparseBooleanArray中,但我不知道是否可以将这个数组放入片段中,也不知道这样做的方法是否正确。

My片段:

public class WarmupFragment extends Fragment {

RecyclerView recyclerViewWarmup;
RecyclerView.LayoutManager layoutManagerWarmup;
ProgramAdapter programAdapterWarmup;
public static List<Program> programWarmupList;
ArrayList<Program> programWarmupObject;

private OnFragmentInteractionListener mListener;

public WarmupFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    final View warmupView = inflater.inflate(R.layout.fragment_warmup, container, false);

    programWarmupObject = new ArrayList<>();
    programWarmupObject.clear();

    if (getArguments() != null) {
        programWarmupObject = getArguments().getParcelableArrayList("warmupProgramListForFragment");
    }

    recyclerViewWarmup = warmupView.findViewById(R.id.warmup_recycler_view);
    recyclerViewWarmup.setHasFixedSize(false);
    layoutManagerWarmup = new LinearLayoutManager(getContext());
    recyclerViewWarmup.setLayoutManager(layoutManagerWarmup);

    programWarmupList = new ArrayList<>();

    programWarmupList.addAll(programWarmupObject);

    programAdapterWarmup = new ProgramAdapter(getContext(), programWarmupList);
    recyclerViewWarmup.setAdapter(programAdapterWarmup);

    return warmupView;
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
}
}

我的程序对象:

public class Program implements Parcelable {
private int image;
private String name;
private String how;
private String hint;
private boolean isDone;

public Program(Parcel in) {
    super();
    readFromParcel(in);
}

public static final Parcelable.Creator<Program> CREATOR = new Creator<Program>() {
    @Override
    public Program createFromParcel(Parcel in) {
        return new Program(in);
    }

    @Override
    public Program[] newArray(int size) {
        return new Program[size];
    }
};

public Program(int image, String name, String how, String hint) {
    this.image = image;
    this.name = name;
    this.how = how;
    this.hint = hint;
}

public void readFromParcel(Parcel in) {
    image = in.readInt();
    name = in.readString();
    how = in.readString();
    hint = in.readString();
}

@Override
public void writeToParcel(Parcel dest, int i) {
    dest.writeInt(image);
    dest.writeString(name);
    dest.writeString(how);
    dest.writeString(hint);
}

@Override
public String toString() {
    return image + " , " + name + " , " + how + " , " + hint;
}

public int getImage() {
    return image;
}

public String getName() {
    return name;
}

public String getHow() {
    return how;
}

public String getHint() {
    return hint;
}

public boolean getDone() {
    return isDone;
}

public void setDone(boolean done) {
    isDone = done;
}

@Override
public int describeContents() {
    return 0;
}
}

提前谢谢。

(对不起,我的-not on point-英语)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-12 09:05:08

好的,你需要做的很简单。

首先,我不知道cbWarmupProgramStateArray变量是从哪里来的,我看到您正在使用它在适配器中存储布尔值,但我没有看到它在任何地方声明为字段。根据名称和使用该变量的方式,我猜测它是某种List<Boolean>

你不需要有一个List<Boolean>和一个List<Program>Program已经有一个布尔值字段,你应该用它来跟踪用户是否检查了程序。

关于与碎片的通讯。您需要在适配器中声明一个回调接口,如下所示:

public class WarmupProgramAdapter ... {

    interface AdapterCallback {
        void isAllChecked();
        void programChecked(Program program);
    }

    ...

}

您可以像这样调用回调:

//Do this..

warmupProgramList.get(position).setDone(checkBox.isChecked());
//IDK if your fragment needs to know about individual checks, just added this in case
fragmentCallback.programChecked(warmupProgramList.get(position), checkBox.isChecked());

//Instead of..
//if (checkBox.isChecked()) {
//  checkBox.setChecked(true); //There's no need to programatically set the checkbox checked, the checkbox is check before triggering the View.OnClick listener
//  cbWarmupProgramStateArray.put(position, true);
//} else {
//  checkBox.setChecked(false);
//  cbWarmupProgramStateArray.put(position, false);
//}

//And do this..

Boolean allTrue = true;
for (Program program : warmupProgramList) {
    if (!program.getDone()) {
        allTrue = false;
        break;
    }
}

if (allTrue) {
    fragmentCallback.isAllChecked();
}

//Instead of this...

//int trueCount = 0;
//for (int i = 0; i < cbWarmupProgramStateArray.size(); i++) {
//  if (cbWarmupProgramStateArray.get(i)) {
//      trueCount++;
//  }
//  if ((trueCount == WarmupFragment.programWarmupList.size())) {
//      Toast.makeText(mCtx, " ## Program done !", Toast.LENGTH_SHORT).show();
//      break;
//  }
//}

fragmentCallback字段是接口AdapterCallback。它应该由片段实现,并且您应该通过Adapter的构造函数传递它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51295264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档