这是我的QuestionHolder
:
private class QuestionHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private JSONObject question;
private CheckBox checkBox;
private TextView question_txt;
public QuestionHolder(final LayoutInflater inflater, ViewGroup parent) {
super(inflater.inflate(R.layout.question_item, parent, false));
checkBox = (CheckBox) itemView.findViewById(R.id.question_checkbox);
checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//try {
//Toast.makeText(getActivity(), "ID: " + question.get("_id"), Toast.LENGTH_SHORT).show();
//} catch (JSONException e) { }
// TODO: If this was checked then add the question's id to the answered list
}
});
question_txt = (TextView) itemView.findViewById(R.id.question);
itemView.setOnClickListener(this);
}
在这里,我绑定
questiontxt
:public void bind(JSONObject question) {
this.question = question;
try {
question_txt.setText(question.getString("_question"));
} catch (JSONException je) { }
}
@Override
public void onClick(View v) {
// TODO: If this was checked then add the question's id to the answered list
}
}
这是扩展
QuestionHolder
的我的适配器:private class QuestionAdapter extends RecyclerView.Adapter<QuestionHolder> {
private JSONArray questions;
public QuestionAdapter(JSONArray questions) {
this.questions = questions;
}
@Override
public QuestionHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
return new QuestionHolder(LayoutInflater.from(getActivity()), parent);
}
这是
onBindViewHolder
:@Override
public void onBindViewHolder(QuestionHolder holder, int position) {
try {
final JSONObject question = questions.getJSONObject(position);
holder.bind(question);
} catch (JSONException je) { }
}
@Override
public int getItemCount() {
return questions.length();
}
}
这是
QuestionHolder
:private class QuestionHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private JSONObject question;
private CheckBox checkBox;
private TextView question_txt;
public QuestionHolder(final LayoutInflater inflater, ViewGroup parent) {
super(inflater.inflate(R.layout.question_item, parent, false));
checkBox = (CheckBox) itemView.findViewById(R.id.question_checkbox);
checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//try {
//Toast.makeText(getActivity(), "ID: " + question.get("_id"), Toast.LENGTH_SHORT).show();
//} catch (JSONException e) { }
// TODO: If this was checked then add the question's id to the answered list
}
});
question_txt = (TextView) itemView.findViewById(R.id.question);
itemView.setOnClickListener(this);
}
public void bind(JSONObject question) {
this.question = question;
try {
question_txt.setText(question.getString("_question"));
} catch (JSONException je) { }
}
@Override
public void onClick(View v) {
// TODO: If this was checked then add the question's id to the answered list
}
}
最佳答案
这是因为滚动时会回收ViewHolder
。因此,您需要保留每个项目位置的CheckBox状态。您可以使用SparseBooleanArray进行处理。
您可以执行以下操作:
private class QuestionAdapter extends RecyclerView.Adapter<QuestionHolder> {
SparseBooleanArray checkedItems = new SparseBooleanArray();
...
@Override
public void onBindViewHolder(QuestionHolder holder, int position) {
try {
final JSONObject question = questions.getJSONObject(position);
// Remember to change access modifier of checkBox in your ViewHolder
// Get the state from checkedItems. If no previous value, it will return false.
holder.checkBox.setChecked(checkedItems.get(position));
// This is a sample. Do not use create listener here.
checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// save the check state
checkedItems.put(position, true);
}
holder.bind(question);
} catch (JSONException je) { }
}
...
}