1

RecyclerView에서 모든 체크 박스를 선택 해제하려고합니다. 그러나이 오류가 표시됩니다. 다음은 LogCat이 가리키는 클래스입니다.ItemView가 null이 아니어도됩니다.

java.lang.IllegalArgumentException: itemView may not be null 
      at android.support.v7.widget.RecyclerView$ViewHolder.<init>(RecyclerView.java:10314) 
      at br.com.ufrn.marceloaugusto.tasklist.adapter.ProdutoAdapter$ProdutosViewHolder.<init>(ProdutoAdapter.java:0) 
      at br.com.ufrn.marceloaugusto.tasklist.MainActivity.onOptionsItemSelected(MainActivity.java:93) 

MainActivity.java

public class MainActivity extends BaseActivity { 

    //private SQLiteDatabase banco; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     setUpToolbar(); 

     if (savedInstanceState == null) { 
      FragmentProdutos frag = new FragmentProdutos(); 
      getSupportFragmentManager().beginTransaction().add(R.id.container, frag).commit(); 
     } 

     //FAB 
     findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       snack(view, "Adicionar produto"); 
      } 
     }); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     if (item.getItemId() == R.id.action_desmarkAll) { 
      RecyclerView recycler = (RecyclerView) findViewById(R.id.recyclerView); 
      ProdutoAdapter.ProdutosViewHolder holder = null; 
      int id = 0; 
      for (int i = 0; i < recycler.getAdapter().getItemCount(); i++) { 
       holder = new ProdutoAdapter.ProdutosViewHolder(recycler.getChildAt(i)); **//Line 93** 
       if (holder.checkBox.isChecked()) { 
        holder.checkBox.setChecked(false); 
       } 
      } 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    }} 

ProdutoAdapter.java는

public class ProdutoAdapter extends RecyclerView.Adapter<ProdutoAdapter.ProdutosViewHolder> { 
private final Context context; 
private final List<Produto> produtos; 
//Interface para expor os eventos de toque na lista 
private ProdutoOnClickListener produtoOnClickListener; 
private ProdutoOnCheckListener produtoOnCheckListener; 

public ProdutoAdapter(Context context, List<Produto> produtos, ProdutoOnClickListener produtoOnClickListener, ProdutoOnCheckListener produtoOnCheckListener) { 
    this.context = context; 
    this.produtos = produtos; 
    this.produtoOnClickListener = produtoOnClickListener; 
    this.produtoOnCheckListener = produtoOnCheckListener; 
} 

@Override 
public int getItemCount() { 
    return this.produtos != null ? this.produtos.size() : 0; 
} 

@Override 
public ProdutosViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(context).inflate(R.layout.adapter_produto, parent, false); 
    ProdutosViewHolder holder = new ProdutosViewHolder(view); 
    return holder; 
} 

@Override 
public void onBindViewHolder(final ProdutosViewHolder holder, final int position) { 
    Produto p = produtos.get(position); 
    holder.tNome.setText(p.getNome()); 
    //holder.tPreco.setText(String.valueOf(p.getPreco())); 
    if (produtoOnClickListener != null) { 
     holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       produtoOnClickListener.onClickProduto(view, position); 
      } 
     }); 
    } 
    if (produtoOnCheckListener != null) { 
     holder.checkBox.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       produtoOnCheckListener.onCheckProduto(view, position); 
      } 
     }); 
    } 
} 

public interface ProdutoOnClickListener { 
    public void onClickProduto(View view, int idx); 
} 

public interface ProdutoOnCheckListener { 
    public void onCheckProduto(View view, int position); 
} 

public static class ProdutosViewHolder extends RecyclerView.ViewHolder { 
    public TextView tNome; 
    //public TextView tPreco; 
    CardView cardView; 
    public CheckBox checkBox; 
    public ProdutosViewHolder(View view) { 
     super(view); 
     tNome = (TextView) view.findViewById(R.id.nomeProduto); 
     //tPreco = (TextView) view.findViewById(R.id.precoProduto); 
     cardView = (CardView) view.findViewById(R.id.card_view); 
     checkBox = (CheckBox) view.findViewById(R.id.checkProduto); 
    } 
} 

} getChildAtViewGroup의 방법입니다

답변

0

방법은, 그래서 recycler.getChildAt(i) 당신을 위해 null 될 것입니다. 귀하의 경우에는 produtos 목록을 사용해야하며 그것을 반복하고 해당 필드를 "checked"상태로 "false"로 설정하고 어댑터의 notifyDataSetChanged() 메소드를 호출하면 onBindViewHolder()이 소유자의 checkBox 값을 자동으로 변경합니다.

그래서 대신

for (int i = 0; i < recycler.getAdapter().getItemCount(); i++) { 
       holder = new ProdutoAdapter.ProdutosViewHolder(recycler.getChildAt(i)); **//Line 93** 
       if (holder.checkBox.isChecked()) { 
        holder.checkBox.setChecked(false); 
       } 
      } 

사용이 하나

for (Product product : produtos){ 
    product.setChecked(false); 
} 
recycler.getAdapter().notifyDataSetChanged(); 

나는 수업 프로젝트는 방법이있다 supppose.

+0

답장을 보내 주셔서 감사합니다. 하지만 내 체크 박스에는 Produto와 관련이 없습니다. –

+0

@MarceloAugusto, recycllerview의 항목이 모델을 나타내므로이 경우 제품이어야합니다. 항목의 모든보기는 좋은 디자인의 모델에서 검색되어야합니다. –

+0

알다시피, 확인란은 항목의 일부 속성을 나타내므로 제품의 일부 필드 일 수 있습니다.이 체크 상자를 도입하면 어딘가에 사용되므로 제품의이 필드를 사용하여 특정 제품 "확인"됩니다. –

0

RecyclerView에서 항목보기는 재활용되어 목록에있는 항목 수만큼 항목보기를 갖지 않습니다. 대신 그 itemviews 재활용 및 productos 목록의 differents 요소를 보여줍니다.

문제는 당신이 목록의 길이가 for 루프에 있지만 그 안에 많은 요소가없는 itemviews에 액세스하기 위해 해당 색인을 사용하고 있다는 것입니다.

대신 Producto.class에 변수를 정의하고 항목의 CheckBox를 선택/선택 취소 할 때마다 업데이트해야합니다. 모든 선택을 해제하고 통화 할 때 false로이 변수를 설정

adapter.notifyDataSetChanged(); 

UPDATE :

ProdutoAdapter.java

onBindViewHolder 같은 목록 produtos 및 업데이트에 액세스하는 방법을 정의합니다

if (produtoOnCheckListener != null) { 
    holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
      produtos.get(position).setCheckBoxState(b); 
      produtoOnCheckListener.onCheckProduto(view, position); 
     } 
    }); 
} 

MainActivity.class ProductoAdapter 변수를 정의하고 productos를 updat에 나열하도록 액세스하십시오. e 각 제품의 부울 값

[...] 
ProductoAdapter productoAdapter = new ProductoAdapter(); 
[...] 

for (int i = 0; i < productoAdapter.getItemCount(); i++) { 
    productoAdapter.getListProductos().get(i).setCheckBoxState(false);  
} 
productoAdapter.notifyDataSetChanged(); 
+0

답변 해 주셔서 감사합니다. 나는이 수정을했지만 체크 박스는 업데이트되지 않습니다. –

+0

@MarceloAugusto 업데이트 확인 – jorgeavilae