当打开一个包含ListView的类时,应用程序崩溃

问题描述:

我有以下类,正如你看到的,它包含一个EditText,Button和列表。 我希望用户在EditText上键入一些文本,单击搜索并显示了从当打开一个包含ListView的类时,应用程序崩溃

SQLite database in the list below the button/edittext field. 
public class FindOrder extends ListActivity { 
private List<String> arr; 
private ListView listView; 
Button search; 
EditText search_field; 
String search_val; 
SQLiteDatabase db = null; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.find_order); 
    // TODO Auto-generated method stub 
    Log.e("myTag","in func"); 
    search = (Button) findViewById(R.id.search_button); 
    search_field = (EditText) findViewById(R.id.search_field); 
    search.setOnClickListener( 
      new View.OnClickListener() { 
       public void onClick(View view) { 
        search_val=search_field.getText().toString(); 
        //getOrder(search_val); 

       } 
      }); 
} 

public void getOrder(String val) { 
    Log.e("myTag","in func"); 
    String query; 
    String[] s_arr = new String[1]; 
    listView = (ListView) findViewById(R.id.listView); 
    ArrayAdapter<String> adapter; 
    arr = new ArrayList<String>(); 
    db = this.openOrCreateDatabase("DBname", MODE_PRIVATE, null); 
    query="SELECT OrderName, OrderLink, DateYear, DateMonth, DateDay, OrderPrice FROM Orders where OrderName=?"; 
    s_arr[0]=val; 
    Cursor c = db.rawQuery(query, s_arr); 
    if (c != null) { 
     if (c.moveToFirst()) { 
      do {  
       arr.add(c.getString(c.getColumnIndex(DatabaseHelper.colName))); 
       Log.e("myTag",c.getString(c.getColumnIndex(DatabaseHelper.colName))); 
      } while (c.moveToNext()); 
     } 
    } 
    c.close(); 
    //setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,arr)); 
    adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, arr); 
    listView.setAdapter(adapter); 
    TextView textview = new TextView(this); 
    LinearLayout ll2 = (LinearLayout)findViewById(R.id.linearLayout2); 
    ll2.addView(textview); 

} 
} 

结果目前每当我在主菜单按钮导致本次活动点击,我得到一个FC。 一个错误,我可以看到我的日志是:

06-02 10:32:18.387: E/AndroidRuntime(1904): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Sagi.MyOrders/com.Sagi.MyOrders.FindOrder}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list' 
与许多其他错误

一起。 但我不明白为什么我应该有.LIST属性...

XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 
    <LinearLayout 
     android:id = "@+id/linearLayout1" 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 
     <EditText 
       android:id="@+id/search_field" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:ems="10" > 
     </EditText> 
     <Button 
      android:id="@+id/search_button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Search" /> 
    </LinearLayout> 
    <LinearLayout 
     android:id = "@+id/linearLayout2" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 
    </LinearLayout> 
    <ListView 
      android:id="@+id/listView" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content"/> 
</LinearLayout> 

谢谢!

只需在xml文件中更改此行,您声明listview。

android:id="@android:id/list" 

不需要声明listview。请尝试下面的代码。

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, values); 
setListAdapter(adapter); 

请检查以下示例。

public class MyListActivity extends ListActivity { 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     String[] values = new String[] { "Android", "iPhone", "WindowsMobile", 
       "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", 
       "Linux", "OS/2" }; 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, values); 
     setListAdapter(adapter); 
    } 
} 
+0

那么应该怎样得到以下代码: listView =(ListView)findViewById(???) – SagiLow

+0

在扩展ListActivity的时候删除它。 –

+0

已删除,没有FC ...但列表没有出现,记录被查询......但没有出现。 – SagiLow

当您将ListActivity扩展到您的活动时,您的列表视图ID必须为android:id="@android:id/list"

  <ListView 
      android:id="@android:id/list" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content"/> 
+0

试过了,如果我在那里改变,我还必须在Java代码中进行更改,并获得相同的FC。在XML中的名称不应该改变,因为我对待它... – SagiLow

+0

然后把你的logcat ...后改变listview编号... –

+0

我不知道这是否已经解决或不,但我可以给意见:你无意中添加_import android.R_? –

更改的XML文件android:id="@android:id/list"

,并在Java代码中的列表视图id,

你已经使用listView = (ListView) findViewById(R.id.listView)
变化,要listView = this.getListView()

解决方法1: 在XML文件更改列表视图的ID

<ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 

并且还在你的代码中改变这行listView =(ListView)findViewById(R.id.listView);作为

listView = (ListView) findViewById(R.id.list); 

溶液2:

您的活动必须扩大活动,而不是ListActivity。