- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经从 sqlite 填充了 recyclerview。当单击删除按钮时,行将从 sqlite 中删除,当单击编辑按钮时,值从 sqlite 更新,但 recyclerview 在删除或编辑后不显示更新的列表。仅在再次启动 Activity 后,回收器 View 才会显示更新的列表。我的问题是如何在从回收器 View 中删除或更新项目后立即更新回收器 View 而不刷新。
我使用recyclerview的 fragment 代码:
List<Product> productList = new ArrayList<>();
RecyclerView recyclerView;
SQLiteDatabase mDatabase;
public static ProductAdapter adapter;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
saveViewModel = ViewModelProviders.of(this).get(SaveViewModel.class);
View root = inflater.inflate(R.layout.fragment_save, container, false);
/* final TextView textView = root.findViewById(R.id.text_gallery);*/
recyclerView = root.findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mDatabase = getActivity().openOrCreateDatabase(Add_Activity.DATABASE_NAME, MODE_PRIVATE, null);
showDataFromDatabase();
saveViewModel.getText().observe(getActivity(), new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
/* textView.setText(s);*/
}
});
return root;
}
private void showDataFromDatabase() {
//we used rawQuery(sql, selectionargs) for fetching all the fields
Cursor cursorproduct = mDatabase.rawQuery(" SELECT * FROM items", null);
//if the cursor has some data
if (cursorproduct.moveToFirst()) {
//looping through all the records
do {
//pushing each record in the field list
productList.add(new Product(
cursorproduct.getInt(0),
cursorproduct.getString(1),
cursorproduct.getString(2),
cursorproduct.getString(3),
cursorproduct.getString(4),
cursorproduct.getString(5),
));
} while (cursorproduct.moveToNext());
}
if (productList.isEmpty()) {
Toast.makeText(getActivity(), "No items Found in database", Toast.LENGTH_SHORT).show();
}
//closing the cursor
cursorproduct.close();
//creating the adapter object
adapter = new ProductAdapter(getActivity(), R.layout.show_field_items, productList, mDatabase);
//adding the adapter to listview
recyclerView.setAdapter(adapter);
adapter.reloadEmployeesFromDatabase(); //this method is in prdouctadapter
adapter.notifyDataSetChanged();
}
}
查看模型类:
public class Product {
private int id;
private String date;
private String category;
private String fsub_category;
private String fname;
private String fphone;
public Product(int id, String date, String category, String fsub_category, String fname, String fphone) {
this.id = id;
this.date = date;
this.category = category;
this.fsub_category =fsub_category;
this.fname = fname;
this.fphone = fphone;
}
public int getId() {
return id;
}
public String getFname() {
return fname;
}
public String getFcategory() {
return category;
}
public String getFsub_category() {
return fsub_category;
}
public String getFphone() {
return fphone;
}
public String getFdate() {
return date;
}
}
产品适配器类:
public ProductAdapter(Context mCtx, int custom_list_item, List<Product> productList, SQLiteDatabase mDatabase) {
this.mCtx = mCtx;
this.custom_list_item = custom_list_item;
this.mDatabase = mDatabase;
this.productList = productList;
}
@NonNull
@Override
public ProductViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//inflating and returning our view holder
LayoutInflater inflater = LayoutInflater.from(mCtx);
View view = inflater.inflate(R.layout.show_field_items, null);
return new ProductViewHolder(view);
}
@Override
public void onBindViewHolder(ProductViewHolder holder, int position) {
//getting the product of the specified position
final Product product = productList.get(position);
//binding the data with the viewholder views
holder.Category.setText(product.getFcategory());
holder.Date.setText(product.getFdate());
holder.Area.setText(product.getFcategoty());
holder.editbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
updateEmployee(product);
}
});
holder.deletebtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(mCtx);
builder.setTitle("Are you sure?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String sql = "DELETE FROM items WHERE id = ?";
mDatabase.execSQL(sql, new Integer[]{product.getId()});
Snackbar.make(view, "Deleted" + product.getFcategory(), Snackbar.LENGTH_SHORT).show();
Toast.makeText(mCtx, "Deleted successfully!", Toast.LENGTH_SHORT).show();
reloadEmployeesFromDatabase(); //Reload List
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
});
}
public void reloadEmployeesFromDatabase() {
Cursor cursorproduct1 = mDatabase.rawQuery("SELECT * FROM items", null);
if (cursorproduct1.moveToFirst()) {
productList.clear();
do {
productList.add(new Product(
cursorproduct1.getInt(0),
cursorproduct1.getString(1),
cursorproduct1.getString(2),
cursorproduct1.getString(3),
cursorproduct1.getString(4),
cursorproduct1.getString(5)
));
} while (cursorproduct1.moveToNext());
}
cursorproduct1.close();
notifyDataSetChanged();
}
private void updateEmployee(final Product product) {
final AlertDialog.Builder builder = new AlertDialog.Builder(mCtx);
LayoutInflater inflater = LayoutInflater.from(mCtx);
View view = inflater.inflate(R.layout.update_form, null);
builder.setView(view);
category = view.findViewById(R.id.spiner);
final EditText editsubcat= view.findViewById(R.id.editsubcategory);
final EditText editFname = view.findViewById(R.id.editFarmerName);
final EditText editphno = view.findViewById(R.id.editFarmerphno);
String cat = category.getSelectedItem().toString().trim();
editsubcat.setText(product.getFsub_category());
editFname.setText(product.getFname());
editphno.setText(product.getFphone());
final AlertDialog dialog = builder.create();
dialog.show();
// CREATE METHOD FOR EDIT THE FORM
view.findViewById(R.id.buttonUpdateEmployee).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String Crop = category.getSelectedItem().toString().trim();
String Sub_Category = editsubcat.getText().toString().trim();
String Farmer_Name = editFname.getText().toString().trim();
String Farmer_phone_No = editphno.getText().toString().trim();
/* if (Crop.isEmpty()) {
editTextName.setError("Name can't be blank");
editTextName.requestFocus();
return;
}
if (Sub_Category.isEmpty()) {
editUsername.setError("Salary can't be blank");
editUsername.requestFocus();
return;
}//Name, Email, UserName, PhoneNo*/
String sql = "UPDATE items \n" +
"SET Category = ?, \n" +
"Sub_Category = ?,\n" +
"Farmer_Name = ?,\n" +
"Farmer_phone_No= ? \n" +
"WHERE id = ?;\n";
mDatabase.execSQL(sql, new String[]{Crop,Sub_Category, Farmer_Name, Farmer_phone_No, String.valueOf(product.getId())});
Toast.makeText(mCtx, "data Updated", Toast.LENGTH_SHORT).show();
dialog.dismiss();
List<Product> pro = productList;
productList.clear();
productList.addAll(pro);
}
});
notifyDataSetChanged();
/* notifyItemRangeChanged(0, productList.size());*/
}
/* public void updateList(List<Product> itemList)
{
this.productList.clear();
this.productList.addAll(itemList);
notifyDataSetChanged();
}*/
/* private void updateList(List<Product> products) {
this.productList.clear();
this.productList.addAll(products);
productAdapter.notifyDataSetChanged();
}
*/
@Override
public int getItemCount() {
return productList.size();
}
public void setData(List<Product> items) {
productList = items;
}
class ProductViewHolder extends RecyclerView.ViewHolder {
TextView Date, Category, Area;
Button editbtn, deletebtn;
public ProductViewHolder(View itemView) {
super(itemView);
Category = itemView.findViewById(R.id.f_category);
Date = itemView.findViewById(R.id.f_date);
Area = itemView.findViewById(R.id.f_area);
}
}
}
最佳答案
删除更新后,您还需要更新productList
,例如:
holder.deletebtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(mCtx);
builder.setTitle("Are you sure?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String sql = "DELETE FROM items WHERE id = ?";
mDatabase.execSQL(sql, new Integer[]{product.getId()});
Snackbar.make(view, "Deleted" + product.getFcategory(), Snackbar.LENGTH_SHORT).show();
Toast.makeText(mCtx, "Deleted successfully!", Toast.LENGTH_SHORT).show();
//reloadEmployeesFromDatabase(); //Reload List
productList.remove(product); //like that after notify adapter
notifyDataSetchanged();
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
});
在更新中,您需要更新productList中的产品对象:
String Crop = category.getSelectedItem().toString().trim();
String Sub_Category = editsubcat.getText().toString().trim();
String Farmer_Name = editFname.getText().toString().trim();
String Farmer_phone_No = editphno.getText().toString().trim();
// afer updating in sqlite db and also need to create setter in model
productList.get(position).setFcategory(Crop);
..........
//after pudating all feild like that just notify data set
notifyDataSetchanged();
关于java - 回收器 View 仅在再次启动 Activity 后才显示更新的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61886625/
我对 Android 很陌生,如果问题重复,请避免并发送链接。有三个 Activity A、B 和 C。 Activity A 获取一个用户名,我想在 Activity C 中显示该用户名,但我想先运
我正在尝试制作记事本应用程序,因此每次打开新笔记时,布局都会相同。另外, Activity 的数量(新注释)不应定义得尽可能多 最佳答案 如果 Activity 始终相同,您可能应该创建一个适配器,允
我有 3 个 Activity 。 主窗口 5 个按钮 在按钮的主窗口中按下此窗口打开(将其称为父窗口) 在父窗口按钮上按下此窗口打开调用它作为结束子窗口。 现在从子窗口我从父窗口获取值如下:
我遇到了一个 Activity backstack 问题。假设我的后台有 5 个 Activity :比如 Activity A、 Activity B、 Activity C、 Activity D
我正在寻找必须具有以下附加特征的 JMS 提供程序: 采用多代理,所有代理都必须处于事件状态(无单点故障) 仅在两台机器上进行扩展就足以满足我们的需求 能够保证订购(如果 1 个生产者 + 1 个消费
假设,我有一个由 TabHost 组成的选项卡 Activity 。 TabHost 包含 2 个选项卡,每两个选项卡都有一个 Activity 组。每个 Activity 组包含一项 Activit
我正在开发一个应用程序,我需要根据某些操作导航到特定 Activity 。这是一张图片 我的第一个 Activity 是 ReadingActivity。基于某些操作,用户将被带到 NewProjec
我创建了一个与服务器异步通信的应用程序。当应用程序发出服务器请求时,将创建一个带有“正在加载”通知的新对话框( Activity )。主要 Activity 实现了处理服务器响应的方法,我想在主要 A
我想在我的所有应用程序 Activity 中显示相同的选项菜单。我创建了一个实现菜单的通用 Activity ,并且我所有的进一步 Activity 都扩展了它。 问题:当我需要扩展其他特定 Acti
我有四个 Activity ,即 java 文件 - Activity1.java、activity2.java、activity3.java、activity4.java 和 xml 文件 - Ac
我有两个 Activity 。我想将数据从第二个 Activity 发送到上一个 Activity 。第一个 Activity 有自定义 ListView 和 bean 类。当我点击第二个 Activ
根 Activity 是堆栈中当前的第一个 Activity 还是 list 中指定为启动 Activity 的 Activity ? 支持应用程序 P 在启动时启动 Activity A。然后 A
你好 我想知道您在绘制 Activity 图选择“Activity ”时考虑了哪些关键点? 您如何从要建模的问题中选择 Activity ? 谢谢 最佳答案 Activity 图用于对正在开发的系统和
如何从主 Activity 启动 Activity 并在子 Activity 返回主 Activity 中退出操作后返回主 Activity ? 我已将子 Activity 作为启动器 Intent
我的工作流程如下: 登录 Activity -> ActivityB -> ActivityC -> ActivityD 我想将数据从LoginActivity传递到ActivityD,但不直接传递到
我之前曾尝试获得此问题的答案,但找不到可以解决我的问题的答案。我正在制作保存圆盘高尔夫球分数的应用程序。我的 MainActivity 有 4 个按钮。新比赛、恢复比赛、类(class)和球员。 At
我有一个 tts 非 UI 类和 Activity 类。现在在 Activity 类中,我有一个按钮,用户可以从中选择男声或女声,具体取决于我想要将字符串传递给 tts 类的选择,然后一次tts 类根
问题有点复杂,首先, Activity A 和 Activity B 的 list 中都有 android:noHistory = true 。我有一个自定义 serialized 类,假设 MyCl
在我的应用程序中,我有两个 Activity (AuthenticationActivity 和 MainActivity),每个 Activity 都有一个导航图和大量 fragment 。我创建了
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How can i use compose email activity in tabView? 我想在选项
我是一名优秀的程序员,十分优秀!