リストのような単純なRecyclerViewがあり、各ビューに異なるIDを設定し、最初のビューをクリックしてビューを追加し、クリックするとビューを削除します(最初のビューを期待してください)。正しく機能しないのは、ビューを削除してから別のビューを追加すると、新しいビューのIDが順序を壊してしまうことです。
アダプター
public class AddEventsAdapter extends RecyclerView.Adapter<AddEventsAdapter.ViewHolder> {
private List<String> items = new ArrayList<>();
public void addItem(String name) {
items.add(name);
notifyItemInserted(items.size() - 1);
}
public void removeItem(int position) {
items.remove(position);
notifyItemRemoved(position);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.add_event_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return items.size();
}
static int i;
class ViewHolder extends RecyclerView.ViewHolder{
public TextView eventName;
public RelativeLayout theLayout;
public ViewHolder(View itemView) {
super(itemView);
eventName = (TextView)itemView.findViewById(R.id.eventName);
theLayout = (RelativeLayout)itemView.findViewById(R.id.backgroundevent);
theLayout.setId(++i);
eventName.setText(String.format("", i));
theLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (v.getId() == 1){
addItem("");
}else {
removeItem(getAdapterPosition());
}
}
});
}
}
}
実装:
final AddEventsAdapter AddContainer = new AddEventsAdapter();
AddEventsRecycler.setLayoutManager(new LinearLayoutManager(this));
AddEventsRecycler.setAdapter(AddContainer);
AddEventsRecycler.setItemViewCacheSize(666);
AddContainer.addItem("");
すべての行のレイアウト:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@drawable/event_clicked_ripple"
android:clickable="true"
android:id="@+id/backgroundevent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
<TextView
android:clickable="false"
android:id="@+id/eventName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="something"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/eventImage"
android:layout_toStartOf="@+id/eventImage"
android:layout_marginRight="10dp"/>
<ImageButton
android:clickable="false"
android:id="@+id/eventImage"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@drawable/oval_shape"/>
</RelativeLayout>
私の問題は、5つのビューを追加し、2番目のビューを削除してから、別のビューを追加すると、6番目のビューではなく2番目のビューが再び追加されることです。それで、ここでの問題は、ビューを削除した後にビューをリサイクルしない方法だと思いますか?
RecyclerViewsの背後にある考え方は、指定したビューホルダーをonCreateViewHolder()
同じのビューに再利用できるということviewType
です。この振る舞いがRecyclerViewsを効率的にするものです-ビューを膨らませるのに費用がかかり、実行するのに費用がかかりますfindViewById
。
オーバーライドしなかったgetItemViewType
ため、RecyclerViewのビュータイプは1つだけです。つまり、ViewHolderは、多くのビューをスクロールしたり、ビューを削除/追加したりするときに、相互に自由にリサイクルできます。
では、コードで何が起こっているのでしょうか?ビュー番号2を削除すると、そのViewHolderがリサイクルされ、リサイクラービュープールに送り返されます。ビュー番号6を追加すると、リサイクラービューは番号2のリサイクルビューホルダーを使用します。したがって、onCreateViewHolder
呼び出されることはありません(リサイクルする追加のビューがあったため)。ただし、onBindViewHolder
と呼ばれます。したがって、ViewHolderによって表示されるデータを更新するメソッドを追加します。
public void setData(final int position) {
eventName.setText(String.format("", position));
theLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (position == 1){
addItem("");
}else {
removeItem(position);
}
}
}
onBindViewHolderでこのメソッドを呼び出します。
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.setData(position);
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加