0

因此,我有一個包含CardView的RecyclerView,並且在我的活動中有一個按鈕,每次點擊它都會向RecyclerView添加一張新卡。爲什麼RecyclerView添加最後​​一個CardView被刪除?

而在每張卡片中,我有另一個按鈕,當按下時,刪除CardView被觸摸。

問題是我向RecyclerView添加了新行,然後刪除了一些行,然後再次添加行時,新添加的行是我之前刪除的舊行。

我該如何解決這個問題?

這是我的活動:

public class MainActivity extends AppCompatActivity { 

    private ArrayList exercises; 
    private Button btnNewExercise; 
    private RecyclerView recyclerView; 
    int i = 0; 

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

    private void initViews() { 
     recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
     recyclerView.setHasFixedSize(true); 
     RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); 
     recyclerView.setLayoutManager(layoutManager); 
     exercises = new ArrayList<>(); 

     final RecyclerView.Adapter adapter = new RecyclerViewAdapter(exercises); 
     recyclerView.setAdapter(adapter); 

     btnNewExercise = (Button) findViewById(R.id.btnNewExercise); 


     btnNewExercise.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       exercises.add("Test" +i); 
       i++; 

       adapter.notifyDataSetChanged(); 
       adapter.notifyItemInserted(exercises.size()); 
      } 
     }); 


    } 
} 

這是我的適配器:增加3個元素時

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { 

    private ArrayList<String> mDataset; 


    public RecyclerViewAdapter(ArrayList myDataset) { 
     mDataset = myDataset; 
    } 

    @Override 
    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_view_row, viewGroup, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(final RecyclerViewAdapter.ViewHolder viewHolder, int i) { 
     viewHolder.tv_exercise.setText(mDataset.get(i)); 
    } 

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

    public class ViewHolder extends RecyclerView.ViewHolder{ 

     private TextView tv_exercise; 
     private Button btnEliminarRow; 

     public ViewHolder(View view) { 
      super(view); 
      tv_exercise = (TextView)view.findViewById(R.id.exercise_text); 
      btnEliminarRow = (Button) view.findViewById(R.id.btnEliminarRow); 
      final View posas = view; 


      btnEliminarRow.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        removeAt(getAdapterPosition()); 
       } 
      }); 
     } 

     public void removeAt(int position) { 
      mDataset.remove(position); 
      notifyItemRemoved(position); 
      notifyItemRangeChanged(position, mDataset.size()); 
     } 
    } 
} 

日誌:

07-31 19:02:57.643 21770-21770/com.ravelinx.prueba I/System.out: Test0 
07-31 19:02:58.070 21770-21770/com.ravelinx.prueba I/System.out: Test0 
07-31 19:02:58.128 21770-21770/com.ravelinx.prueba I/System.out: Test1 
07-31 19:02:58.505 21770-21770/com.ravelinx.prueba I/System.out: Test0 
07-31 19:02:58.536 21770-21770/com.ravelinx.prueba I/System.out: Test1 
07-31 19:02:58.569 21770-21770/com.ravelinx.prueba I/System.out: Test2 

當刪除2個元素沒有日誌

Th

07-31 19:04:24.426 22679-22679/com.ravelinx.prueba I/System.out: Test0 
07-31 19:04:24.467 22679-22679/com.ravelinx.prueba I/System.out: Test3 
07-31 19:04:24.727 22679-22679/com.ravelinx.prueba I/System.out: Test0 
07-31 19:04:24.769 22679-22679/com.ravelinx.prueba I/System.out: Test3 
07-31 19:04:24.787 22679-22679/com.ravelinx.prueba I/System.out: Test4 

下面是一個視頻顯示問題:

https://www.youtube.com/watch?v=TgFomjUJq8c

+0

問:你如何較新的區分和更舊的? – Mani

+0

@Mani我在每個卡片視圖中都有一個EditText,例如我在卡片視圖中寫入一些東西然後刪除它,然後我嘗試添加一個新的,然後出現舊文本。 – ravelinx

+0

在onBindViewHolder()方法中,您可以打印mDataset.get(i)的日誌並在此處發佈日誌? – Mani

回答

0

UPDATE可疑上setHasFixedSize(true)造成整個問題向現有的代碼庫本身刪除這又增加2元,當連接日誌行應該工作。


添加addItem()像這樣的RecyclerViewAdapter.java

public void addItem(String item, int position) { 
    this.mDataset.add(position, item); 
    notifyItemInserted(position); 
} 

而更換的體btnNewExercise.setOnClickListener()如下

{ 
    exercises.add("Test" +i); 
    i++; 
    adapter.addItem("test", adapter.getCount()); 
} 
+0

這是一個好主意,現在在適配器中添加該項目,但現在嘗試它Cardview沒有出現,就像recycleview不是更新但dataSet添加它們,因爲在日誌中我可以看到它的大小增加。 – ravelinx

+0

更新:我在notifyItemInserted之前添加了notifyDataSetChanged,但問題仍在發生中我刪除了一個cardview,並在再次添加項目時再次出現。 – ravelinx

+1

在Activity的initViews()中刪除recycler.setHasFixedSize(true) – Mani

相關問題