【发布时间】:2017-08-01 12:31:14
【问题描述】:
所以我有一个包含 CardView 的 RecyclerView,并且我的 Activity 中有一个按钮,每次单击它都会向 RecyclerView 添加一张新卡片。
在每张卡片中,我都有另一个按钮,当按下该按钮时,会删除被触摸的 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());
}
});
}
}
这是我的适配器:
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());
}
}
}
添加 3 个元素时的日志:
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 个元素时没有日志
然后在再次添加 2 个元素时记录:
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
这是一个显示问题的视频:
【问题讨论】:
-
问题:你如何区分新旧的?
-
@Mani 我在每个卡片视图中都有一个 EditText,例如,我在卡片视图中写了一些内容,然后将其删除,然后我尝试添加一个新内容,然后出现带有文本的旧内容。
-
在 onBindViewHolder() 方法中可以打印 mDataset.get(i) 的日志并在此处发布日志吗?
-
@Mani 好的,我添加了它们,但在我看来它们并没有透露任何内容。因为显示的文本来自文本视图,而不是编辑文本中显示的文本。
-
为什么
notifyItemRangeChanged()被用于removeAt()?被移除的项目之后的项目是否被更改?
标签: java android android-cardview android-recyclerview