Студия 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);
    }

}
Другие вопросы по тегам