已经过了2天,我仍然无法弄清楚当我在RecyclerView
数据库中插入数据时,我的sqlite
无法立即更新。
我一直尝试使用nofityDataSetChanged
和swapAdapter
等多种方法,但我的RecyclerView
仍然不会更新,为了更新它,我需要在添加数据之前转到另一个活动RecyclerView
。
所以有人能告诉我我做错了吗?
继承我的查询代码
public void AddData(){
reg_pet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
items=new ArrayList<>();
final int position=0;
adapter=new reg_Adapter(getActivity(),items);
boolean insterdata = myDB.insertDataToPetRegister(pet_name.getText().toString(),
spin_type.getSelectedItem().toString(), spin_breed.getSelectedItem().toString());
if (insterdata = true) {
adapter.notifyItemInserted(position);
adapter.notifyDataSetChanged();
pet_name.setText("");
Toast.makeText(getActivity(), "Your Pet has been Registered", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getActivity(), "Your Pet has not been Registerd", Toast.LENGTH_LONG).show();
}
}
});
}
我的适配器
public class reg_Adapter extends RecyclerView.Adapter<reg_ViewHolder> {
Activity activity;
Register_pet_database register_pet_database;
List<db_getItem> items;
db_getItem adapter;
DBAdapter dbAdapter;
public reg_Adapter(Activity activity, List<db_getItem> items) {
this.activity = activity;
this.items = items;
}
public reg_ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.reg_pet_recycler, parent, false);
return new reg_ViewHolder(view);
}
@Override
public void onBindViewHolder(reg_ViewHolder holder, final int position) {
holder.pet_name.setText(items.get(position).getPet_name());
holder.pet_type.setText(items.get(position).getPet_type());
holder.pet_breed.setText(items.get(position).getPet_breed());
holder.btndel.setTag(items.get(position).getPet_name());
holder.btndel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
register_pet_database=new Register_pet_database(v.getContext());
Integer deleted =register_pet_database.deleteData(v.getTag().toString());
if (deleted > 0) {
items.remove(position);
notifyItemRemoved(position);
Toast.makeText(v.getContext(), "Pet Has been Remove", Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(v.getContext(), "Pet not Removed", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public int getItemCount() {
return items.size();
}
}
我片段中的代码
public class pet_tab extends Fragment {
RecyclerView recyclerView;
Register_pet_database register_pet_database;
ArrayList<db_getItem> arrayList;
reg_Adapter reg_adapter;
db_getItem item;
ImageButton btndel;
TextView pet_name;
Cursor c;
public pet_tab() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view= inflater.inflate(R.layout.fragment_pet_tab, container, false);
recyclerView=(RecyclerView)view.findViewById(R.id.reg_pet_recycler);
btndel=(ImageButton)view.findViewById(R.id.btndel);
loadDb();
return view;
}
public void loadDb(){
register_pet_database=new Register_pet_database(getActivity());
DBAdapter db=new DBAdapter(getActivity());
db.openDB();
arrayList=new ArrayList<>();
c=register_pet_database.queryData("select * from Pet_Registered");
final int position=0;
try {
if(c!=null){
if(c.moveToFirst()){
do {
db_getItem item = new db_getItem();
item.setPet_name(c.getString(1));
item.setPet_type(c.getString(2));
item.setPet_breed(c.getString(3));
arrayList.add(item);
}while(c.moveToNext());
}
}
}catch (SQLException e){
e.printStackTrace();
}
reg_Adapter adapter=new reg_Adapter(getActivity(),arrayList);
recyclerView.setHasFixedSize(true);
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(linearLayoutManager);;
recyclerView.swapAdapter(adapter,false);
}
}
答案 0 :(得分:0)
只要您的位置正确,就不需要同时执行前者notifyItemInserted
和notifyDataSetChanged
。但通知方法的所有操作都是刷新视图。您还必须确保实际数据集已更新。
由于PHP代码样式,您的代码是读卡和关注的卡,所以我没有更新您的原始样本,但基本上:
在您的上下文中:
Pet myPet = new Pet(...);
boolean isSuccessful = db.insert(myPet.getName(), ..., ...);
if (isSuccessful) {
mAdapter.add(myPet);
}
在适配器中:
public void add(Pet pet) {
mData.insert(0, pet);
notifyItemInserted(0);
}
作为一般规则,restrict responsibility。如果您发现自己必须手动跟踪位置和调用以从其所有者外部通知方法(在本例中为适配器),那么就会出现问题。
另一个选择是依靠Loader自动监控更改
答案 1 :(得分:0)
查看Android Jetpack的Room Persistence库和分页库。
Room Persistence Library 在SQLite上提供了一个抽象层,以在利用SQLite的全部功能的同时允许更健壮的数据库访问。
该库可帮助您在运行应用程序的设备上创建应用程序数据的缓存。此缓存充当您应用程序的唯一事实来源,无论用户是否有Internet连接,都允许用户查看应用程序中关键信息的一致副本。
Paging Library 帮助您一次加载和显示小块数据。按需加载部分数据可减少网络带宽和系统资源的使用。 该库支持以下数据架构: