旋转后保持视图状态/方面

时间:2014-10-02 13:35:53

标签: android gridview android-adapter

在我的应用程序中,我使用文件中的随机数据填充GridView的适配器。数据作为每个项目的TextView显示给用户。如果用户触摸某个项目,该项目将更改背景颜色。

问题是,如果用户触摸某个项目然后旋转设备,该项目将返回其原始方面(使用正常的背景颜色)

我尝试过不同的方法:

  • 实施我自己的适配器
  • 扩展BaseAdapter
  • 使用ArrayAdapter
  • 使用TextView的选择器
  • 使用自定义样式扩展TextView项目(来自herehere
  • 在GridView的onItemClick(AdapterView<?> parent, View view, int position, long id)
  • 中禁用视图

我想要做的是在旋转设备时保持视图的颜色/样式/方面

注意

为什么我从文件中直接加载数据?

该文件包含不同的字词。每次玩家开始活动(这是一个游戏)时,GridView中会显示随机顺序的不同单词。用户必须指向正确的单词。如果用户犯了错误,该单词会改变颜色(实际上,我更喜欢禁用View)。重复该过程,直到用户做出正确的选择。

2 个答案:

答案 0 :(得分:0)

您可以使用onSaveInstanceState保存列表的选定状态。

当您单击列表中的项目时,您可以将状态分配给布尔数组。

在Fragment / Activity中实现onSaveInstanceState方法。

public void onSaveInstanceState(Bundle outState) {

  super.onSaveInstanceState(outState);
  outState.putBooleanArray(BundleArgs.STATES, mAdapter.getStates());

}

然后在onCreateView中将这些值传递给适配器。

 if (savedInstanceState != null) {   
     states = savedInstanceState.getBooleanArray(BundleArgs.STATES);
   //Declare adapter and pass states to it
   myAdapter = new Adapter(context, values, states);
 }

答案 1 :(得分:0)

这是我在SO上多次重复看到的一个错误。

代表数据的dataview完全不同的实体,应该单独处理。

您需要将数据的状态保存在另一个数据元素中,并在轮换期间保留该数据元素。例如(这只是一个例子,有几种方法):

// possible states
private static final int NORMAL = 0;
private static final int RIGHT = 1;
private static final int WRONG = 2;
Map<String, Integer> states; // here you keep the states

然后在每次点击时,检查答案并更改颜色的代码:

// process the click/state change
states.put(word, newState);

然后轮换:

public void onSaveInstanceState(Bundle outState) {
    outState.putSerializable("states", states);
}

并在创建

// onCreate
if (savedInstanceState != null) {
   states = (Map<String, Integer>) savedInstanceState.getSerializable("states");
} else {
   states = new HashMap<String, Integer>();
}

然后返回自定义适配器,您必须检查状态并相应地修改视图。

// inside getView
int state = 0
if(states.containsKey(word)){
   state = states.get(word).intValue();
}
switch(state){
   // deal with the cases and set the color
}