2017-10-12 88 views
-2

我在添加超過1行(項目)在我的RecyclerView中的問題,該項目覆蓋前一個,當我點擊按鈕,但如果我創建一個列表<>在onCreate上硬編碼的數據,它的工作原理是在RecyclerView中添加多於一行。按照代碼:RecyclerView - 我不能添加超過1行

ListChecklistAdapter

public class ListChecklistAdapter extends RecyclerView.Adapter<ListChecklistAdapter.ListChecklistViewHolder> { 
    private List<Checklist> mChecklist; 
    private Context mCtx; 

    public ListChecklistAdapter(Context ctx, List<Checklist> checklists) { 
     mCtx = ctx; 
     mChecklist = checklists; 
    } 

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

    @Override 
    public void onBindViewHolder(ListChecklistViewHolder holder, int position) { 
     holder.cbItem.setText(mChecklist.get(position).getDescricao()); 
     holder.cbItem.setChecked(mChecklist.get(position).isCheckado()); 
    } 

    @Override 
    public int getItemCount() { 
     return mChecklist.size(); 
    } 

    public class ListChecklistViewHolder extends RecyclerView.ViewHolder { 
     @BindView(R.id.item_checkbox) 
     CheckBox cbItem; 

     public ListChecklistViewHolder(View view) { 
      super(view); 
      ButterKnife.bind(this, view); 
     } 
    } 

    public void refreshData(List<Checklist> item) { 
     this.mChecklist.clear(); 
     this.mChecklist.addAll(item); 
     notifyDataSetChanged(); 
    } 
} 

item_checklist

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <CheckBox 
     android:id="@+id/item_checkbox" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="5dp" 
     android:paddingLeft="6dp" 
     android:text=" " 
     tools:text="Exemplo de item de lista" /> 

</RelativeLayout> 

MainActivity

public class MainActivity extends AppCompatActivity { 
    @BindView(R.id.rcv_lista) 
    RecyclerView rvLista; 
    int valor; 
    private List<Checklist> lista; 
    private ListChecklistAdapter listChecklistAdapter; 
    @BindView(R.id.btn_add_item) 
    Button btnAdd; 

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

    } 

    private int cont() { 
     return valor++; 
    } 

    public void novoItem(View view) { 
     lista = new ArrayList<>(); 
     lista.add(new Checklist("Item " + (cont() + 1), true)); 
     loadRecycler(lista); 
    } 

    private void loadRecycler(List<Checklist> lista) { 
     if (listChecklistAdapter == null) { 
      Log.i("LOG", "IF"); 

      listChecklistAdapter = new ListChecklistAdapter(this, lista); 

      rvLista.setAdapter(listChecklistAdapter); 
      rvLista.setLayoutManager(new LinearLayoutManager(getApplicationContext())); 
      rvLista.addItemDecoration(new DividerItemDecoration(this, 1)); 
      return; 
     } else { 
      Log.i("LOG", "ELSE"); 
      listChecklistAdapter.refreshData(lista); 
      listChecklistAdapter.onAttachedToRecyclerView(rvLista); 
     } 
    } 
} 

activity_main

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:padding="16dp" 
    tools:context="teste.com.br.recyclercomcheckbox.MainActivity"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/rcv_lista" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <Button 
     android:id="@+id/btn_add_item" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="right" 
     android:layout_marginTop="5dp" 
     android:background="@android:color/transparent" 
     android:onClick="novoItem" 
     android:paddingLeft="20dp" 
     android:paddingRight="20dp" 
     android:text="+ novo item" 
     android:textColor="#009688" /> 

</LinearLayout> 
+1

移動lista = new ArrayList <>();脫離你的novoItem方法。初始化它只有一次 – nomag

回答

0

只需從refreshData()方法刪除此行this.mChecklist.clear();

public void refreshData(List<Checklist> item) { 
    this.mChecklist.addAll(item); 
    notifyDataSetChanged(); 
} 
+0

*代碼中的問題是,每當你設置新的適配器*不,只有第一次 - 讀取代碼... *你使用listChecklistAdapter.notifyDataSetChanged(); *它被稱爲novoItem-> loadRecycler-> listChecklistAdapter.refreshData-> notifyDataSetChanged – Selvin

+2

問題是每次創建新列表 – nomag

+0

@Selvin是否檢查了他的'public void refreshData(List item)'他首先清除了整個列表而不是添加新的 –

0

@Nilesh Rathod解決了這個問題!我剛從ListCheckAdapter.java > refreshData() 中刪除this.mChecklist.clear();感謝大家的幫忙!