java - RecyclerView 仅在编辑要添加的下一个项目时显示项目
问题描述
我目前正在我的应用程序中构建一个活动,其中使用 FAB 添加产品。单击 FAB 会打开一个带有 startActivityForResult 的新弹出活动,其中会填写一个表单并通过 Parcelable 对象发回。
我现在面临的问题是,添加产品后,它不会显示在 RecyclerView 中,但是当我再次单击 FAB 时,第二次我开始编辑表单内的任何字段(例如,任何 EditText)下一个产品,我看到前一个产品出现在我的弹出表单后面的背景中。当我完成第二个产品时,它不会出现,直到我开始编辑第三个,等等。
我浏览了 XML,对我来说似乎没问题......并尝试阅读几种解决方案(以及我的代码一次又一次),但它们都没有真正有帮助。
相关代码(我放了......我忽略了一些与这种情况无关的代码):从主要活动(其中产品旨在显示):
'''
public class EditOffersActivity extends AppCompatActivity {
...
private ArrayList<Offer> offers_list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_products);
offers_list = new ArrayList<>();
...
RecyclerView rvOffers = findViewById(R.id.offers_RecyclerView);
OfferAdapter adapter = new OfferAdapter(offers_list);
rvOffers.setAdapter(adapter);
rvOffers.setLayoutManager( new LinearLayoutManager(this));
// Setting up the FAB so it leads to the Product Details Pop-up
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(EditOffersActivity.this, ProductDetailsPopupActivity.class);
startActivityForResult(intent, HTZ_ADD_OFFER); // HTZ_ADD_OFFER = 1
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Offer created_offer = data.getParcelableExtra("offer");
offers_list.add(created_offer);
}
}
'''
适配器:'''
public class OfferAdapter extends android.support.v7.widget.RecyclerView.Adapter<OfferAdapter.OfferViewholder> {
private ArrayList<Offer> mOffers;
public OfferAdapter(ArrayList<Offer> offers) {
mOffers = offers;
}
@Override
public OfferViewholder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
Context context = viewGroup.getContext();
int layoutIdForListItem = R.layout.item_product;
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(layoutIdForListItem, viewGroup, false);
OfferViewholder viewHolder = new OfferViewholder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(OfferViewholder holder, int position) {
Offer current_offer = mOffers.get(position);
... // a lot of binding code
}
@Override
public int getItemCount() {
return mOffers.size();
}
class OfferViewholder extends RecyclerView.ViewHolder {
TextView name_TextView;
TextView time_TextView;
...
public OfferViewholder(View itemView) {
super(itemView);
// Init all views
name_TextView = itemView.findViewById(R.id.product_item_name_TextView);
time_TextView = itemView.findViewById(R.id.product_item_time_TextView);
...
}
}
}
'''
以及在用户单击“完成”后关闭它的弹出活动的位:“”
mPublishButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(p_photo_url == null) {
...
} else {
// Create offer from user input
Offer n_offer = new Offer (...)
);
...
// Return offer to EditOffersActivity
Intent resultIntent = new Intent();
resultIntent.putExtra("offer", n_offer); // Offer is Parcelable
setResult(HTZ_ADD_OFFER, resultIntent);
finish();
}
}
});
'''
和 RecyclerView 的 XML:
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/offers_RecyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
tools:itemCount="3"
tools:listitem="@layout/item_product"
tools:orientation="vertical"
tools:scrollbars="horizontal"
tools:spanCount="1">
解决方案
您可以使用 notifydatasetchanged 如下代码:
mPublishButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(p_photo_url == null) {
...
} else {
// Create offer from user input
Offer n_offer = new Offer (...)
);
...
// Return offer to EditOffersActivity
Intent resultIntent = new Intent();
resultIntent.putExtra("offer", n_offer); // Offer is Parcelable
setResult(HTZ_ADD_OFFER, resultIntent);
OfferAdapter.notifydatasetchanged();
finish();
}
}
});
OfferAdapter.notifydatasetchanged();// 方法将刷新在您的视图中设置的适配器。并且值将被刷新。
不要忘记欣赏和喜欢答案。
推荐阅读
- ios - 我应该如何使用 Swift 访问 iOS 上的数据库实例
- apache-kafka - 如何在应用程序属性中有多个 kafka 消费者组
- excel - 有没有更有效的方法来编写具有相对单元格引用计算的 VBA?
- css - 文本区域宽度超出引导模式
- html - 如何用 CSS 制作 4 个角几何对象?
- javascript - 错误:配置验证错误:子“JWT_SECRET”失败,因为[需要“JWT_SECRET”]
- python - scipy中的多个约束
- xml - 获取包含 X 字符串的节点
- java - 如何设置组合框编辑器事件处理程序
- python - 在 AWS Sagemaker 中运行 xgb_model.fit() 时出现“[0]#011train-merror:0.17074#011validation-merror:0.1664”错误是什么?