Студия Android: от ListView до Activity с вкладками, сохранение рейтинга в рейтингах на вкладках
Я делаю свое первое приложение для Android, используя Android Studio. В этом приложении у меня есть список с 12 классами (12 предметов). После нажатия на один класс, он входит в вкладку с 10 предметами этого класса. На каждой вкладке у меня есть строка рейтинга, чтобы позволить людям оценивать элемент.
Я установил действие для просмотра списка и 12 независимых действий для этих 12 действий с вкладками. Код из списка для каждого действия с вкладками выглядит так:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if(i==0){
Intent intent = new Intent(ListViewActivity.this, TabbedActivity1.class);
intent.putExtra("styleName", STYLE_NAMES[i]);
intent.putExtra("styleExample",STYLE_EXAMPLES[i]);
startActivity(intent);
}
else if(i==1){
Intent intent = new Intent(ListViewActivity.this, TabbedActivity2.class);
intent.putExtra("styleName", STYLE_NAMES[i]);
intent.putExtra("styleExample",STYLE_EXAMPLES[i]);
startActivity(intent);
}
...... // skip the other 10 tabbed activities.
}
Теперь проблема в том, что: после того, как я завершил оценку действий с вкладками, я возвращаюсь к действию ListView и снова нажимаю на каждое действие с вкладками, оценки исчезают.
Я предполагаю, что причина в том, что в моем коде каждый раз, когда я нажимаю на элемент, он открывает новое действие с вкладками, хотя тот же макет, содержимое не сохраняется.
Поэтому мне было интересно, нужно ли мне что-то делать в активности ListView, чтобы сохранить рейтинги. Я искал соответствующие вопросы, но я обнаружил, что в их сценариях каждый элемент списка представляет собой просто строку рейтинга. Но здесь мой элемент списка представляет собой вкладку с 10 рейтингами.
Поэтому я понятия не имею, как это сделать. У меня нет опыта в Android Studio, поэтому я не знаю, с чего начать, чтобы решить проблему. Любая идея приветствуется! Заранее большое спасибо!!
1 ответ
Прежде всего, если все ваши действия на вкладках схожи, вы можете просто создать одно действие вместо того, чтобы их было много в вашем случае 12 и передать конкретный контент и состояния через намерение.
Основной подход к вашему вопросу заключается в том, чтобы хранить рейтинговые состояния в вашем основном действии, и когда вы открываете вкладку каждый раз, когда нажимаете на элементы списка, отправляете оценку соответствующего действия с намерением. Затем в вашей вкладке активности обновите курс с ним.
Для достижения этого мы будем использовать startActivityForResult
вместо startActivity
потому что нам нужна вкладка активности, чтобы вернуть последнее состояние рейтинговых баров.
Вы можете увидеть базовый пример, показанный ниже здесь:
public class ListViewActivity extends AppCompatActivity {
private static final int REQUEST_RATE = 1;
private SparseIntArray rates = new SparseIntArray();
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent = new Intent(ListViewActivity.this, TabActivity.class);
intent.putExtra("styleName", STYLE_NAMES[i]);
intent.putExtra("styleExample", STYLE_EXAMPLES[i]);
intent.putExtra("position", i);
intent.putExtra("rating", rates.get(i, 0));
startActivityForResult(intent, REQUEST_RATE);
}
}
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_RATE:
if(resultCode == RESULT_OK) {
//retrieve and save rates
Bundle extras = data.getExtras();
int position = extras.getInt("position");
int rating = extras.getInt("rating");
rates.put(position, rating);
}
break;
}
}
}
public class TabActivity extends AppCompatActivity {
private RatingBar ratingBar;
private int position;
@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tab);
Bundle extras = getIntent().getExtras();
position = extras.getInt("position");
int rating = extras.getInt("rating");
ratingBar.setRating(rating);
}
@Override protected void onDestroy() {
//send current rating to list activity before we leave
setResult();
super.onDestroy();
}
private void setResult() {
Intent intent = new Intent();
intent.putExtra("position", position);
intent.putExtra("rating", ratingBar.getRating());
setResult(RESULT_OK, intent);
}
}