2017-02-21 16 views
1

2日後にsqliteデータベースにデータを挿入するとすぐに私のRecyclerViewが更新できない理由がわかりません。Sqliteデータベースに新しいデータが追加されたときにrecyclerviewを更新する方法

私はnofityDataSetChangedswapAdapter、このような多くの方法をしようとしてきたが、まだ私の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.quearyData("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

位置が正しい限り、notifyItemInsertednotifyDataSetChangedの両方を実行する必要はありません。前者のみを実行する必要はありません。しかしすべての通知メソッドは、ビューを更新します。また、実際のデータセットが更新されていることを確認する必要があります。で

Pet myPet = new Pet(...); 
boolean isSuccessful = db.insert(myPet.getName(), ..., ...); 
if (isSuccessful) { 
    mAdapter.add(myPet); 
} 

:あなたのコンテキストで

:私は更新されていないので、

あなたのコードを読み取っているので、PHPのコードスタイルの従うためにあなたの元のサンプルが、基本的にはカードですアダプタ:一般的なルールとして

public void add(Pet pet) { 
    mData.insert(0, pet); 
    notifyItemInserted(0); 
} 

restrict responsibility 。あなたが自分の所有者(この場合はアダプタ)の外部からメソッドを通知するための位置や呼び出しのようなものを手動で追跡しなければならない場合、何かが間違っています。

もう1つの方法は、Loaderを使用して自動的に変更を監視することです。

関連する問題