2011-07-04 134 views
0

我遇到了两个列表视图的问题,每个列表视图都由一个活动生成。从列表视图A,项目列表,我可以去列表视图B,列表A的特定项目的选项。Android:从列表视图返回到列表视图的问题

问题是,当我从A到B,然后返回(使用Android后退按钮)到A,然后尝试去再一次B: (一个 - > - 后退按钮 - >一个 - >错误试图去到B时)。

我真的不知道从哪里开始寻找错误,所以我想在这里问:有同样错误的人谁解决了它,并可以共享解决方案?

谢谢!

编辑: 我张贴在这里的相关代码,正如我所说,我不知道什么可能会造成这个错误,所以我贴两个列表视图:

LISTVIEW一个:它有一个图像,紧急情况的标题和距离的细节。

public class EmergenciesList extends ListActivity { 
String[] listaEmergencias = new String[] { "Raoul Duffy con Wisconsin", 
     "Mac Iver con Moneda", "Cdte. Malbec con Barnechea", 
     "Av. Apoquindo con Pehuen", "Las Hualtatas con Indiana" }; 

String[] detalleEmergencias = new String[] { "< 50 mts", "2 km", "1,2 km", 
     "3,4 km", "350 mts" }; 

private Integer[] imgid = { R.drawable.chico, R.drawable.mediano, 
     R.drawable.grande, R.drawable.chico, R.drawable.mediano, 
     R.drawable.grande }; 

RelativeLayout layr1; 
Animation ar3; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mInflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    data = new Vector<RowData>(); 

    for (int i = 0; i < listaEmergencias.length; i++) { 
     try { 
// RowData is just a private class for the title, details, and image. 
      rd = new RowData(i, listaEmergencias[i], detalleEmergencias[i]); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     data.add(rd); 
    } 

    adapter = new CustomAdapter(this, R.layout.second_list, R.id.title, data); 
    setListAdapter(adapter); 
    getListView().setTextFilterEnabled(true); 
} 

public void onListItemClick(ListView parent, View v, int position, long id) { 
    adapter = (CustomAdapter) parent.getAdapter(); 
    data.removeAllElements(); 

    Intent singleEmergencyMenu = new Intent(EmergenciesList.this, EmergencyMenu.class); 
    Bundle container = new Bundle(); 
    container.putInt("id", position); 
    singleEmergencyMenu.putExtra("data2", container); 
    startActivity(singleEmergencyMenu); 
} 
} 

LISTVIEW乙:它具有在所述报头中的复选框并在该列表中三个元素。

public class EmergencyMenu extends ListActivity { 
String[] emergencia = new String[] { "Mostrar ubicación", 
     "Carros asignados", "Archivos" }; 
final String SETTING_EMERGENCY = "id_actual_emergency"; 
private int emergencyID = -1; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    this.emergencyID = getIntent().getBundleExtra("data2").getInt("id"); 

    ListView lv = getListView(); 
    lv.setTextFilterEnabled(true); 

    // A Header to have a single checkbox to select the emergency 
    LayoutInflater inflater = (LayoutInflater) this 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    TextView header = (TextView) inflater.inflate(
      R.layout.list_reports_header, null); 
    lv.addHeaderView(header, null, false); 

    List<String> data = new ArrayList<String>(); 

    for (int i = 0; i < emergencia.length; i++) { 
     try { 
      data.add(emergencia[i]); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 

    setListAdapter(new ArrayAdapter<String>(this, R.layout.emergency_menu, 
      data)); 

    LoadSelection(); 

    CheckBox checkBox = (CheckBox) findViewById(R.id.select_emergency_id); 
    checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton buttonView, 
       boolean isChecked) { 
      SaveSelection(); 
     } 
    }); 

    lv.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

      // Mostrar ubicación 
      if (position == 1) { 
       Toast.makeText(getApplicationContext(),"Mostrar ubicación", Toast.LENGTH_SHORT).show(); 
      } 

      // Carros asignados 
      else if (position == 2) { 
       Toast.makeText(getApplicationContext(), "Carros asignados",Toast.LENGTH_SHORT).show(); 
      } 

      // Archivos 
      else if (position == 3) { 
       Toast.makeText(getApplicationContext(), 
         "Archivos de la emergencia",Toast.LENGTH_SHORT).show(); 
      } 

     } 
    }); 
} 

@Override 
protected void onPause() { 
    SaveSelection(); 
    super.onPause(); 
} 

// save the selections in the shared preference in private mode for the 
// user 
private void SaveSelection() { 
    CheckBox checkBox = (CheckBox) findViewById(R.id.select_emergency_id); 
    if (checkBox.isChecked()) { 
     SharedPreferences settingsActivity = getPreferences(MODE_PRIVATE); 
     SharedPreferences.Editor prefEditor = settingsActivity.edit(); 
     prefEditor.putInt(SETTING_EMERGENCY, emergencyID); 
     prefEditor.commit(); 
    } 
} 

// Check the checkbox if this is the actual emergency (selected before). 
private void LoadSelection() { 
    SharedPreferences settingsActivity = getPreferences(MODE_PRIVATE); 

    if (settingsActivity.contains(SETTING_EMERGENCY)) { 
     // Checkbox de seleccionar la emergencia 
     int id_actual = settingsActivity.getInt(SETTING_EMERGENCY, -1); 
     if (emergencyID == id_actual) { 
      CheckBox checkBox = (CheckBox) findViewById(R.id.select_emergency_id); 
      checkBox.setChecked(true); 
     } 
    } 
} 

}

+0

怎么样显示堆栈跟踪 – mibollma

+0

我该如何得到它?我昨天尝试过,但Eclipse控制台只显示了手机上的应用程序部署,我找不到日志。我在Mac上,如果它也是相关的。 – Tere

回答

0

也许问题是由于实现你的意图,则必须将其声明中的类,然后在你的方法创建它。您可以按照您的方式发布代码

+0

我添加了两个listviews的代码。您可以在onListItemClick中查看listview A(“EmergenciesList”)的意图。我在应用程序的其他意图中没有遇到问题... – Tere

0

您是每次构建B ListView还是仅显示它?也许后退按钮“杀”它,然后当你试图再次显示它是空的或它指的是null的东西。向我们显示相关的代码和任何错误。总是善于使用日志来跟踪值等我没有这个特殊的问题。

+0

我编辑了问题以显示代码。回答你的问题,我处理了“onPause()”事件,但它没有解决问题...或者还有其他事情要做,所以我可以保证B列表视图不会被杀死,而只是恢复? – Tere

+0

这真的超出了我的联盟,它看起来像你有多个活动,我以前没有做过。尽管如此,你可以尝试“捕捉”后退按钮(http://stackoverflow.com/questions/2000102/android-override-back-button-to-act-like-home-button),或者更好的办法是把在你自己的“回去”按钮,所以你有控制权。 BACK,据我所知,实际上意味着*结束*活动 - onPause()可能不会被调用。无论如何你会得到什么错误?或者它不起作用? – karnok

+0

据我所知,后退按钮会触发onPause()事件,如果其他进程需要更多内存或不再可见,则会终止该活动(查看活动生命周期:http://developer.android.com/reference/android /app/Activity.html)。我试图把手册放回去,它的工作原理! (谢谢:))但是我真的很想知道问题是什么(除了其中一个Android原则是“不要偷回按钮”,所以我认为很重要......)。我没有得到任何错误,它只是停止工作,我不知道如何获得日志... – Tere