У меня есть довольно простая реализация таблицы лидеров рекордов, которая сохраняет имя, предоставленное пользователем, вместе с его или ее счетом.
К сожалению, после возврата к активности с высокими оценками 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);
}
}
}