2016-02-08 138 views
2

我创建了一个复选框,但是,每当我点击几个项目随机复选框变成点击。我有回收器视图,并且我也有一个适配器类。这里是我的CheckBox方法谁能告诉我这个问题?CheckBox状态里面RecyclerView

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); 



    } 
} 

}

+1

问题是你的适配器类里面的地方回收的观点 –

+0

什么问题呢? – Eli

+1

您发布的代码不会显示该部分,您必须在适配器上持久存储chkbox状态,并且每次onBindViewHolder被调用时重新设置复选框状态。 –

回答

0

犹未晚之后再也没有我会说,它可能会帮助其他人在这个问题上绊倒以后,所以这里去。

这可能不是有史以来最好的解决方案,但它应该工作。

在你的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); 
    } 
} 
相关问题