динамически обновлять RecyclerView при изменении набора данных базы данных SqLite - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть довольно простая реализация таблицы лидеров рекордов, которая сохраняет имя, предоставленное пользователем, вместе с его или ее счетом. К сожалению, после возврата к активности с высокими оценками RecyclerView будет показывать только заполненную ранее оценку, а не новую, только что введенную. Я использую метод notifyDatasetChanged () в асинхронной задаче. Все еще безуспешно. Любые указатели очень ценятся.

Высокая оценка активности:

public class HighscoreActivity extends AppCompatActivity implements View.OnClickListener{

SQLiteDatabase db;
ArrayList<String> nameList;
ArrayList<String> scoreList;
RecyclerView recyclerView;
ScoreRecViewAdapter scoreRecViewAdapter;
Button buttonStart;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_highscore);

    buttonStart = findViewById(R.id.buttonStart);
    buttonStart.setOnClickListener(this);

    // create lists and table
    nameList = new ArrayList<>();
    scoreList = new ArrayList<>();
    db = this.openOrCreateDatabase("Scores", MODE_PRIVATE, null);
    db.execSQL("CREATE TABLE IF NOT EXISTS scores(name VARCHAR, score VARCHAR)");

    //Cursor c = db.rawQuery("SELECT * FROM scores", null);
    Cursor c = db.rawQuery("SELECT * FROM scores ORDER BY score DESC", null);

    // Fill list
    int nameIndex = c.getColumnIndex("name");
    int scoreIndex = c.getColumnIndex("score");

    while ( c.moveToNext() ){
        nameList.add(c.getString(nameIndex));
        scoreList.add(c.getString(scoreIndex));
    }

    // put data in rec view
    recyclerView = findViewById(R.id.recView);
    scoreRecViewAdapter = new ScoreRecViewAdapter(this, nameList, scoreList);
    recyclerView.setAdapter(scoreRecViewAdapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    // enter new user data
    Intent getter = getIntent();
    String nameExtra = getter.getStringExtra("name");
    String scoreExtra = getter.getStringExtra("score");

    if( nameExtra != null && scoreExtra != null) {
        // perform async task
        new InsertIntoDatabase().execute(nameExtra, scoreExtra);
    }
}

@Override
public void onClick(View view) {
    if (view.getId() == R.id.buttonStart) {
        Intent actorQuizz = new Intent(this, MainActivity.class);
        startActivity(actorQuizz);
    }
}

public class InsertIntoDatabase extends AsyncTask<String, Integer, String> {

    @Override
    protected String doInBackground(String... strings) {
        db.execSQL("INSERT INTO scores (name, score) VALUES ('" + strings[0] + "', '" + strings[1] +"')");
        Log.i("score saved", "success");
        return "success";
    }

    @Override
    protected void onPostExecute(String s) {
        //nameList.clear();
        //scoreList.clear();

        Cursor c = db.rawQuery("SELECT * FROM scores", null);

        // Fill list
        int nameIndex = c.getColumnIndex("name");
        int scoreIndex = c.getColumnIndex("score");

        while ( c.moveToNext() ){
            nameList.add(c.getString(nameIndex));
            scoreList.add(c.getString(scoreIndex));
        }

        scoreRecViewAdapter.notifyDataSetChanged();
    }
}

}

и адаптер повторного просмотра:

открытый класс ScoreRecViewAdapter расширяет RecyclerView.Adapter {

Context mContext;
ArrayList<String> nameList;
ArrayList<String> scoreList;

public ScoreRecViewAdapter (Context context, ArrayList<String> nameList, ArrayList<String> scoreList) {
    this.mContext = context;
    this.nameList = nameList;
    this.scoreList = scoreList;
}


@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(mContext).inflate(R.layout.rec_menu,parent, false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    holder.nameView.setText(nameList.get(position));
    holder.scoreView.setText(scoreList.get(position));
}

@Override
public int getItemCount() {
    return nameList.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
    TextView nameView;
    TextView scoreView;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        nameView = itemView.findViewById(R.id.textViewName);
        scoreView = itemView.findViewById(R.id.textViewScore);
    }
}
}
...