2016-04-06 43 views
0

我在RecyclerView中使用CheckedTextView。我只在xml中定義了一個checkedTextView。我用來自服務器的動態數據給recylerView充氣。現在我想只檢查選中的CheckedTextView而其他unChecked。只有一個CheckedTextView應該被選中,而其他的CheckedTextView在選中時應該保持未選中狀態。如何檢查裏面recycledView CheckedTextView而其他未經檢查

這是我寫的代碼。

public class CategoriesAdapter extends RecyclerView.Adapter<CategoriesAdapter.ViewHolder> { 
    CategoriesDTO categoriesDTO; 
    String categories[]; 

    public CategoriesAdapter(CategoriesDTO categoriesDTO){ 
     this.categoriesDTO=categoriesDTO; 
    } 
    public CategoriesAdapter(String[] categories){ 
     this.categories=categories; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.categories_layout, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     holder.category.setText(categories[position]); 
    } 


    @Override 
    public int getItemCount() { 
     return categories.length; 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder{ 

     public CheckedTextView category; 
     public ViewHolder(View itemView) { 
      super(itemView); 
      category=(CheckedTextView)itemView.findViewById(R.id.category); 
     } 
    } 
} 

這就是我設置它的方式,但它檢查了所有CheckedTextView。

recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getContext(), new RecyclerItemClickListener.OnItemClickListener() { 
      @Override 
      public void onItemClick(View view, int position) { 
       CheckedTextView checkedTextView = (CheckedTextView) view.findViewById(R.id.category); 
       checkedTextView.setChecked(true); 
       Toast.makeText(getContext(), "" + categories[position], Toast.LENGTH_SHORT).show(); 
       String url = Constants.URL_BASE_CATEGORY + categories[position]; 
       new MyAsyncTask().execute(url); 
      } 
     })); 

怎麼辦?

回答

0

嘗試使你ViewHolder實施View.OnClickListener,然後在點擊監聽器ViewHolder構造函數代替對ItemView控件是這樣的:

public ViewHolder(View itemView) { 
     super(itemView); 
     category=(CheckedTextView)itemView.findViewById(R.id.category); 
     itemView.setOnClickListener(this) 
    } 

然後在您的ViewHolder類@OverrideonClick法是這樣的:

@Override 
public void onClick(View v){ 
    ((CheckedTextView) v).toggle(); 
} 

你也想擺脫你目前實施的recyclerView.addOnItemTouchListener。 這是做什麼是放在每個單獨的查看持有人點擊監聽器,而不是整個回收站視圖。這允許您操縱特定視圖持有者所持有的視圖。希望這可以幫助!

+0

感謝您考慮應答,但這並不真正按我希望它的方式工作。首先它不會在第一次點擊時設置checkTextview。當我點擊5或6次時,它會被檢查,並且當其他textview被點擊時它不會改變它的狀態。 –

+0

對不起,我想我不太明白你想做什麼呢! – BonBon

+0

你可以根據它來編輯你的答案嗎?我已經實現了這個答案 –

1

這是因爲recyclerview重複使用了視圖,所以最好是維護一個大小爲[]的布爾數組(checkedArray[]),其中所有元素最初都是false。然後擺脫你的onItemTouchListener。所以基本上在你的onbindviewholder只是把這個 -

 holder.category.setChecked(checkedArray[position]); 

     holder.date.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      checkedArray[position] = !checkedArray[position]; 
      notifyItemChanged(position); 
     } 
     }); 
相關問題