【问题标题】:CheckBox state inside RecyclerViewRecyclerView 中的 CheckBox 状态
【发布时间】:2016-05-17 22:19:54
【问题描述】:

我创建了一个复选框,但是,每当我单击一些项目时,随机复选框就会被单击。我有一个回收站视图,也有一个适配器类。这是我的 CheckBox 方法,谁能告诉我问题所在?

public void CheckBox(View view) {
    final CheckBox checkBox = (CheckBox)view;
    if (checkBox.isChecked()) {

        System.out.println("SET TO CHECKED");
        //Input instance of selected course(CHECKED)
        // TODO: 2/5/16 Need to pass in Persisted ID
        mVolleySingleton = VolleySingleton.getInstance();
        mRequestQueue = mVolleySingleton.getRequestQueue();
        CharSequence ID_PUT_COURSES = ((TextView) ((RelativeLayout) view.getParent()).getChildAt(1)).getText();
        System.out.println(PUT);

        String URL_PUT_COURSES = "URL"+ID_PUT+"\n";
        System.out.print(PUT);
        StringRequest UrlPut = new StringRequest(Request.Method.PUT, URL_PUT, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                System.out.println(response + "reponse");

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
                System.out.println("************Answer" + error + "error");
            }
        });
        mRequestQueue.add(UrlPutCourses);
        System.out.println("Added");
    }

else{
        System.out.println("SET TO UNCHECKED");
        //delete instance of selected course(UNCHECKED)
        mVolleySingleton = VolleySingleton.getInstance();
        mRequestQueue = mVolleySingleton.getRequestQueue();
        // TODO: 2/5/16 Need to pass in Persisted ID
        CharSequence DELETE = ((TextView) ((RelativeLayout) view.getParent()).getChildAt(1)).getText();
        System.out.print(ID_PUT_COURSES);
        String UR_DELETE = "URL"+ DELETE;
        StringRequest UrlDeleteCourses = new StringRequest(Request.Method.DELETE, UR_DELETE, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                System.out.println(response + "reponse");
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
                System.out.println("************Answer" + error + "error");
            }
        });
        mRequestQueue.add(UR_DELETE);
        System.out.println("Deleted");
    }

}



ublic class AdapterSearch extends RecyclerView.Adapter<AdapterSearch.ViewSearch>{
private LayoutInflater mLayoutInflater;
private ArrayList<Search> ListSearch=new ArrayList<>();
public AdapterSearch(Context context){

    mLayoutInflater=LayoutInflater.from(context);

}
public void setListSearch(ArrayList<Search> ListSearch){
    this.ListSearch=ListSearch;
    notifyItemRangeChanged(0,ListSearch.size());
}

@Override
public ViewSearch onCreateViewHolder(ViewGroup parent, int viewType) {
    View view= mLayoutInflater.inflate(R.layout.custom_search,(ViewGroup)null);
    ViewSearch holder=new ViewSearch(view);
    return holder;
}

@Override
public void onBindViewHolder(ViewSearch holder, int position) {
    Search currentSearch=ListSearch.get(position);
    holder.mSearchText.setText(currentSearch.getMtitle());
    holder.mAnswerPointsSearch.setText(currentSearch.getMkey());
    holder.mSearchId.setText(currentSearch.getMid());
    holder.mCourseId.setText(currentSearch.getCourseId());
}

@Override
public int getItemCount() {
    return ListSearch.size();
}
public void setFilter(ArrayList<Search> Search) {
    ListSearch = new ArrayList<>();
    ListSearch.addAll(Search);
    notifyDataSetChanged();
}

static class ViewSearch extends RecyclerView.ViewHolder{
    private TextView mSearchText;
    private TextView mAnswerPointsSearch;
    private TextView mSearchId;
    private TextView mCourseId;



    public ViewSearch (View view){
        super(view);
        mSearchText=(TextView)itemView.findViewById(R.id.SearchText);
        mAnswerPointsSearch=(TextView)itemView.findViewById(R.id.AnswerPointsSearch);
        mSearchId=(TextView)itemView.findViewById(R.id.SearchId);
        mCourseId=(TextView)itemView.findViewById(R.id.CourseTextView);



    }
}

}

【问题讨论】:

  • 问题在你的适配器类中,它回收视图
  • 问题出在哪里?
  • 您发布的代码没有显示该部分,您必须在适配器上保持 chkbox 状态,并且每当调用 onBindViewHolder 时再次重新设置复选框状态..
  • 我发布了我的适配器类,你能详细解释一下吗...?
  • 您没有设置您的 chbox 状态,因此请查看此线程以了解如何做到这一点。祝你好运:stackoverflow.com/questions/32427889/…

标签: java android checkbox request


【解决方案1】:

迟到总比我说的好,它可能会帮助其他人以后偶然发现这个问题,所以就这样吧。

这可能不是最好的解决方案,但应该可以。

在您的Search 类中,您有一些变量,例如titlekey。添加booleanisChecked,默认为false。还要创建匹配的 getter 和 setter。 (我在这个例子中使用isChecked() & setChecked()

在您的 onBindViewHolder() 方法中,添加以下行:

CheckBox checkBox = (CheckBox) itemView.findViewById(R.id.CheckBoxID);
// Instantiating the checkbox

holder.checkBox.setChecked(currentSearch.isChecked());
// Every time the holder (one list item) is shown, this gets called. 
// It sets the checked state based on what's stored in currentSearch.

checkBox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (checkBox.isChecked()) {
                currentSearch.setChecked(true)
            } else {
                currentSearch.setChecked(false);
            }
        });
}
// This listens for clicks on the checkbox, and changes the checked state of
// the boolean in currentSearch to the correct state based on 
// what it already was on.

请注意,我之前没有使用过复选框,所以有些事情(比如设置选中状态)可能与我上面描述的略有不同,但这应该是一个工作基础。

您可能还希望复选框仅在您单击按钮或类似的东西之前保持不变,然后将它们重置。您可能想为此添加一个简单的 for 循环,例如:

public void resetAllCheckBoxes() {
    for (Search s : ListSearch) {
        s.setChecked(false);
    }
}

【讨论】:

    猜你喜欢
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多