0

我正在使用 android studio 制作我的第一个 android 应用程序。在这个应用程序中,我有一个包含 12 个类(12 个项目)的列表视图。单击一个类后,它会进入一个包含该类的 10 个项目的选项卡式活动。在每个标签页上,我都有一个评分栏,让人们对项目进行评分。

我为列表视图设置了一个活动,为这 12 个选项卡式活动设置了 12 个独立活动。从 listview 到每个选项卡式活动的代码如下所示:

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的经验,所以我不知道从哪里开始解决问题。任何想法表示赞赏!非常感谢提前!!

4

1 回答 1

0

首先,如果您的所有选项卡活动都相似,您可以只创建一个活动而不是在您的案例 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);
    }

}
于 2017-08-12T21:39:38.380 回答