Sqliteからrecyclerviewにデータを入力しました。各行をクリックすると、行はsqliteから削除されますが、recyclerviewは削除後に更新されたリストを表示しません。リサイクラービューには、アクティビティをもう一度起動した後にのみ更新されたリストが表示されます。私の質問は、更新せずにrecylcerviewからアイテムを削除した直後にrecyclerビューを更新する方法です。
以下は私のコードです
SecondActivity.Java
_import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.support.v7.widget.LinearLayoutManager;
import Android.support.v7.widget.RecyclerView;
import Android.support.v7.widget.Toolbar;
import Android.view.Menu;
import Android.view.MenuItem;
import Java.util.ArrayList;
import Java.util.List;
public class SecondActivity extends AppCompatActivity {
DatabaseHelpher helpher;
List<DatabaseModel> dbList;
RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
helpher = new DatabaseHelpher(this);
dbList= new ArrayList<DatabaseModel>();
dbList = helpher.getDataFromDB();
mRecyclerView = (RecyclerView)findViewById(R.id.recycleview);
mRecyclerView.setHasFixedSize(true);
// use a linear layout manager
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
// specify an adapter (see also next example)
mAdapter = new RecyclerAdapter(this,dbList);
mRecyclerView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged ();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_second, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case Android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}
_
DatabaseHelpher.Java
_import Android.content.ContentValues;
import Android.content.Context;
import Android.database.Cursor;
import Android.database.sqlite.SQLiteDatabase;
import Android.database.sqlite.SQLiteOpenHelper;
import Android.util.Log;
import Android.widget.Toast;
import Java.util.ArrayList;
import Java.util.List;
public class DatabaseHelpher extends SQLiteOpenHelper {
private static final String DATABASE_NAME="student";
private static final int DATABASE_VERSION = 1;
private static final String STUDENT_TABLE = "stureg";
private static final String STU_TABLE = "create table "+STUDENT_TABLE +"(name TEXT,email TEXT primary key,roll TEXT,address TEXT,branch TEXT)";
Context context;
public DatabaseHelpher(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(STU_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + STUDENT_TABLE);
// Create tables again
onCreate(db);
}
/* Insert into database*/
public void insertIntoDB(String name,String email,String roll,String address,String branch){
Log.d("insert", "before insert");
// 1. get reference to writable DB
SQLiteDatabase db = this.getWritableDatabase();
// 2. create ContentValues to add key "column"/value
ContentValues values = new ContentValues();
values.put("name", name);
values.put("email", email);
values.put("roll", roll);
values.put("address", address);
values.put("branch", branch);
// 3. insert
db.insert(STUDENT_TABLE, null, values);
// 4. close
db.close();
Toast.makeText(context, "insert value", Toast.LENGTH_LONG);
Log.i("insert into DB", "After insert");
}
/* Retrive data from database */
public List<DatabaseModel> getDataFromDB(){
List<DatabaseModel> modelList = new ArrayList<DatabaseModel>();
String query = "select * from "+STUDENT_TABLE;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query,null);
if (cursor.moveToFirst()){
do {
DatabaseModel model = new DatabaseModel();
model.setName(cursor.getString(0));
model.setEmail(cursor.getString(1));
model.setRoll(cursor.getString(2));
model.setAddress(cursor.getString(3));
model.setBranch(cursor.getString(4));
modelList.add(model);
}while (cursor.moveToNext());
}
Log.d("student data", modelList.toString());
return modelList;
}
/*delete a row from database*/
public void deleteARow(String email){
SQLiteDatabase db= this.getWritableDatabase();
db.delete(STUDENT_TABLE, "email" + " = ?", new String[] { email });
db.close();
}
}
_
DatabaseModel.Java
_public class DatabaseModel {
private String name;
private String roll;
private String address;
private String branch;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRoll() {
return roll;
}
public void setRoll(String roll) {
this.roll = roll;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBranch() {
return branch;
}
public void setBranch(String branch) {
this.branch = branch;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
_
RecyclerAdapter.Java
_import Android.content.Context;
import Android.content.Intent;
import Android.os.Bundle;
import Android.support.v7.widget.RecyclerView;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.TextView;
import Android.widget.Toast;
import Java.util.ArrayList;
import Java.util.List;
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
static List<DatabaseModel> dbList;
static Context context;
static DatabaseHelper dh;
RecyclerAdapter(Context context, List<DatabaseModel> dbList ){
this.dbList = new ArrayList<DatabaseModel>();
this.context = context;
this.dbList = dbList;
dh=new DatabaseHelper(context);
}
@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(
R.layout.item_row, null);
// create ViewHolder
ViewHolder viewHolder = new ViewHolder(itemLayoutView);
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerAdapter.ViewHolder holder, int position) {
holder.name.setText(dbList.get(position).getName());
holder.email.setText(dbList.get(position).getEmail());
}
@Override
public int getItemCount() {
return dbList.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView name,email;
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
name = (TextView) itemLayoutView
.findViewById(R.id.rvname);
email = (TextView)itemLayoutView.findViewById(R.id.rvemail);
itemLayoutView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
dh.delete(dbList.get(getAdapterPosition()).getEmail);
Toast.makeText(RecyclerAdapter.context, "you have clicked Row " + getAdapterPosition(), Toast.LENGTH_LONG).show();
}
}
}
_
mAdapter.notifyDataSetChanged ();
を使用してrecyclerviewを更新しようとしましたが、機能しません。提案してください。ありがとうございます。
配列リストとデータベースの両方からデータを削除し、リストが更新されることを通知します。
または
データベースからデータを削除し、削除後にデータベースからデータを取得し、アレイリストに新しいデータを再読み込みすると、作業が完了します
dbList.remove(getAdapterPosition());
notifyDataSetChanged();
//or use this for better perfomance.
notifyItemRemoved(getAdapterPosition());
Removeメソッドで位置を渡す
onClick
メソッド内で、1つのアイテムが削除されたことをアダプタに通知する必要があります
@Override
public void onClick(View v) {
notifyItemRemoved(this.getLayoutPosition());
}
DBからデータを削除していますが、すべてのデータをフェッチしたリストからは削除していないため、リストからデータを削除するまでは、削除されても表示されます。したがって、削除方法を変更する必要があり、リストからデータも削除する必要があります。
以下の更新された削除方法を確認してください。
@Override
public void onClick(View v) {
dh.delete(dbList.get(getAdapterPosition()).getEmail);
// These two lines added for remove data from adapter also.
dbList.remove(getAdapterPosition());
notifyDataSetChanged();
Toast.makeText(RecyclerAdapter.context, "you have clicked Row " + getAdapterPosition(), Toast.LENGTH_LONG).show();
}
情報を再読み込みしてみてください。
これを変える
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case Android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
これに:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
dbList = helpher.getDataFromDB();
mAdapter = new RecyclerAdapter(this,dbList);
mRecyclerView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged ();
switch (item.getItemId()) {
case Android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
これにより、クリックするたびにRecyclerVuewの情報が再読み込みされます。
// Adapterクラスでインターフェースを定義します
private static ItemClickListener itemClickListener;
public interface ItemClickListener {
void onItemClick(int position, View v);
}
と方法
public void setOnItemClickListener(ItemClickListener myClickListener) {
RecyclerAdapter.itemClickListener = myClickListener;
}
viewHolderのonClickメソッドで
@Override
public void onClick(View v) {
dh.delete(dbList.remove(getAdapterPosition()).getEmail);
itemClickListener.onItemClick(getLayoutPosition(), v);
Toast.makeText(RecyclerAdapter.context, "you have clicked Row " + getAdapterPosition(), Toast.LENGTH_LONG).show();
}
アクティビティのonCreate()またはonResume()メソッド内
mAdapter.setOnItemClickListener(new RecyclerAdapter.ItemClickListener() {
@Override
public void onItemClick(int position, View v) {
mAdapter.notifyDataSetChanged();
}
});
notifyItemRemoved()
の代わりにnotifyDataSetChanged()
を使用してください
アクティビティで削除操作を実行した後にrecreate()を呼び出すと、アクティビティを更新できます。わたしにはできる。これがあなたにもうまくいくことを願っています。
このようにしてください
builder.setNeutralButton("Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
PersonDBHelper dbHelper = new PersonDBHelper(mContext);
dbHelper.deletePersonRecord(person.getId(), mContext);
mPeopleList.remove(position);
mRecyclerV.removeViewAt(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, mPeopleList.size());
notifyDataSetChanged();
}
});
リサイクルリストの再起動時に使用する方法
を使用してarrayListからリストデータを削除します
arrayList.remove(position);
そして、を使用してアダプタを更新します。
mAdapter.notifyDataSetChanged ();