gpt4 book ai didi

java - Android:将 View 添加到网格 RecyclerView

转载 作者:行者123 更新时间:2023-12-01 10:05:11 26 4
gpt4 key购买 nike

我使用 GridLayoutManager 创建了一个 RecyclerView,我想在每次单击按钮时向网格添加一个自定义 View ,每个 View 必须有一个不同的 ID,当单击该 View 时,它会被销毁。

发生的情况是,如果我添加 5 个 View ,然后单击第 3 个 View 将其销毁,那么下次我添加 View 时,它会再次添加第 3 个 View ,而不是新的第 6 个 View 。

自定义 View 布局 (grid_item_button.xml)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#864643">

<Button
android:id="@+id/grid_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<EditText
android:id="@+id/editName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:ems="2"
android:textColor="#ffffff"/>

<TextView
android:id="@+id/ClassName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="hmm"
android:textColor="#ffffff"/>

MyAdapter.java

class MyAdapter extends RecyclerView.Adapter<MyAdapter.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.grid_item_button, 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 implements View.OnClickListener {

private Button button;
private TextView ClassName;

public ViewHolder(View itemView) {
super(itemView);
ClassName = (TextView) itemView.findViewById(R.id.ClassName);
button = (Button) itemView.findViewById(R.id.grid_button);
button.setOnClickListener(this);
ClassName.setId(++i);
}

@Override
public void onClick(View v) {
removeItem(getAdapterPosition());
}
}

}

activity_main.xml

<ScrollView 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"
tools:context="m.testingsubjects.MainActivity">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<Button
android:id="@+id/button_add_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<android.support.v7.widget.RecyclerView
android:layout_marginTop="50dp"
android:id="@+id/recycler_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

</LinearLayout>

</ScrollView>

MainActivity.java

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


RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
assert recyclerView != null;
recyclerView.setLayoutManager(new GridLayoutManager(this, NUMBER_COLUMNS));
recyclerView.addItemDecoration(new SampleItemDecoration());
final MyAdapter adapter = new MyAdapter();
recyclerView.setAdapter(adapter);
recyclerView.setNestedScrollingEnabled(false);

adapter.addItem("");

findViewById(R.id.button_add_item).setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
adapter.addItem("");
}
});


}

所以我需要的是在单击 View 时销毁它,而不是只是暂时删除它,因为它似乎正在发生。

最佳答案

您错过了 onBindViewHolder 实现。这很重要,因为 Android 使用它来更新重用 View 的内容。检查onBindViewHolder documentation

实际发生的情况是,android 将您的第 6 个内容添加到第 3 个 View (因为它已被破坏,系统希望重用此资源),但它不知道如何刷新内容,因此它与前一个内容一起显示。

Android 仅使用几个 View 来显示适配器中的所有数据。当RecycleView需要一个新的ViewHolder时,它会调用onCreateViewHolder,否则它会使用onBindViewHolder,并且您必须指定如何更新重用ViewHolder

的内容

关于java - Android:将 View 添加到网格 RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36530265/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com