web-dev-qa-db-ja.com

sqliteからアイテムを削除した後、RecyclerViewは更新されませんか?

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を更新しようとしましたが、機能しません。提案してください。ありがとうございます。

6
iCoders

配列リストとデータベースの両方からデータを削除し、リストが更新されることを通知します。

または

データベースからデータを削除し、削除後にデータベースからデータを取得し、アレイリストに新しいデータを再読み込みすると、作業が完了します

dbList.remove(getAdapterPosition());
notifyDataSetChanged();
//or use this for better perfomance.
notifyItemRemoved(getAdapterPosition());

Removeメソッドで位置を渡す

7
J.D.

onClickメソッド内で、1つのアイテムが削除されたことをアダプタに通知する必要があります

@Override
public void onClick(View v) {
    notifyItemRemoved(this.getLayoutPosition());
}
3
M.Usman

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();
    }
2
Vickyexpert

情報を再読み込みしてみてください。

これを変える

@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();
        }
    });
1
Amit

notifyItemRemoved()の代わりにnotifyDataSetChanged()を使用してください

0

アクティビティで削除操作を実行した後にrecreate()を呼び出すと、アクティビティを更新できます。わたしにはできる。これがあなたにもうまくいくことを願っています。

0
Shinde Ajay

このようにしてください

  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();
                }
            });

リサイクルリストの再起動時に使用する方法

0
Usman Ali

を使用してarrayListからリストデータを削除します

 arrayList.remove(position);

そして、を使用してアダプタを更新します。

 mAdapter.notifyDataSetChanged ();
0
Naveen T P