2012-03-24 51 views
2

这是我的代码,我知道有一个小错误在某处,但作为Android的noob我无法弄清楚。我已经完成了我的搜索,但无济于事。ListView中的textview.setText()导致强制关闭

的SimpleListActivity.java:

public class SimpleListActivity extends ListActivity { 
    /** Called when the activity is first created. */ 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      setListAdapter(new myArrayAdapter(this, COUNTRIES)); 

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

      lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
       // When clicked, show a toast with the TextView text 
       Toast.makeText(getApplicationContext(), ((TextView) view).getText(), 
        Toast.LENGTH_SHORT).show(); 
      } 
      }); 
     } 

     static final String[] COUNTRIES = new String[] { 
      "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", 
      "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina", 
      "Armenia", "Aruba", "Australia", "Austria" 
      }; 
} 

main.xml中:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 

</LinearLayout> 

list_item.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LinearLayout2" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
     <CheckBox 
      android:id="@+id/checkBox1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      > 
      </CheckBox> 

     <TextView 
      android:id="@+id/textView1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="TextView"> 
      </TextView> 

</LinearLayout> 

myArrayAdapter.java:

public class myArrayAdapter extends ArrayAdapter<String> { 

    private final Context context; 
    private final String[] values; 

    public myArrayAdapter(Context context, String[] values) { 
     super(context, R.layout.list_item, values); 
     this.context = context; 
     this.values = values; 
    } 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View rowView = inflater.inflate(R.layout.list_item, parent, false); 

     TextView textView = (TextView) rowView.findViewById(R.id.textView1); 
     CheckBox checkbox = (CheckBox) rowView.findViewById(R.id.checkBox1); 
     textView.setText(values[position]); 
     return rowView; 
    } 

} 

我不明白为什么我们将主布局用作ContentView。我的意思是官方的listview教程不使用它,而且列表工作得很好。但我在网上发现,当我使用findViewById时,我得使用setContentView(R.layout.main);。我不明白,如果ID不在主视图中,那我为什么要使用它。

此外,这个应用程序的力量关闭。我已将问题范围缩小到textView.setText(values[position]);。我哪里错了?

更新:我删除的setContentView因为这是给它的解决方案张贴在这里另一个错误:ListView whose id attribute is 'android.R.id.list' Error when I have the ListView id set correctly

这里的移除的setContentView后的logcat:

03-24 10:55:01.558: E/AndroidRuntime(7279): FATAL EXCEPTION: main 
03-24 10:55:01.558: E/AndroidRuntime(7279): java.lang.NullPointerException 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at com.deepakmittal.simplelist.myArrayAdapter.getView(myArrayAdapter.java:32) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.widget.AbsListView.obtainView(AbsListView.java:1467) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.widget.ListView.makeAndAddView(ListView.java:1745) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.widget.ListView.fillDown(ListView.java:670) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.widget.ListView.fillFromTop(ListView.java:727) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.widget.ListView.layoutChildren(ListView.java:1598) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.widget.AbsListView.onLayout(AbsListView.java:1273) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.view.View.layout(View.java:7192) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.view.View.layout(View.java:7192) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1047) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.view.View.layout(View.java:7192) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.view.View.layout(View.java:7192) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1145) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1865) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.os.Looper.loop(Looper.java:130) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at android.app.ActivityThread.main(ActivityThread.java:3835) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at java.lang.reflect.Method.invoke(Method.java:507) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
03-24 10:55:01.558: E/AndroidRuntime(7279):  at dalvik.system.NativeStart.main(Native Method) 

线32所对应的TextView。的setText(值[位置]);

+0

你可以发布logcat? – dcow 2012-03-24 04:08:33

+0

发表了logcat。 – 2012-03-24 05:34:11

回答

2

ListActivity的默认布局由屏幕中央的单个全屏列表组成。但是,如果您愿意,可以通过在onCreate()中使用setContentView()设置您自己的视图布局来自定义屏幕布局。要做到这一点,你自己的视图必须包含一个ID为“@ + id/list”的ListView对象......所以只有当你需要一个自定义的布局时,你应该使用setContentView()或者其他方法。不需要使用R. layout.main ..现在为您的应用程序的力量关闭..你应该张贴的logcat的......所以,这将是很容易找出错误所在.. 和我不认为有任何错误 ...除了改变

android:id="@+id/listView1" in main.xml 

to 

android:id="@+id/list" 

因为我复制代码和尝试..它只是对我很好..

+0

这解释了很多。你能发布一个链接,谈论默认布局,我不知道他们存在,直到你说。我也发布了logcat。 – 2012-03-24 05:34:53

+3

http://developer.android.com/reference/android/app/ListActivity.html – 5hssba 2012-03-24 05:37:49

+0

如果您的问题得到解决,请将答案标记为已接受..这样人们就不会尝试找到错误是什么......在已经解决的问题中.. =] – 5hssba 2012-03-24 06:25:42

-1

试试这个代码

ArrayAdapter<String> adapter; 

static final String[] COUNTRIES = new String[] { 
      "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", 
      "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina", 
      "Armenia", "Aruba", "Australia", "Austria" 
      }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.edit); 

     lv = (ListView) findViewById(R.id.edit_lv); 
     arrayList = new ArrayList<HashMap<String, String>>(); 

     mDbHelper = new Database_creat(Show.this); 
     mDbHelper.Open(); 
     adapter= new ArrayAdapter<String> 
          (this,ndroid.R.layout.simple_list_item_1,COUNTRIES); 



     lv.setAdapter(adapter); 
     lv.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
       // TODO Auto-generated method stub 

      } 

     }); 

    } 
1

而是这个

 
View rowView = inflater.inflate(R.layout.list_item, parent, false); 

使用:

 
View rowView = inflater.inflate(R.layout.list_item, null); 

0

没有查看您的logcat,我要去猜测你的问题实际上在于事实上,你提供了一个ArrayAdapter而不是请求的ListAdapter的setListAdapter(ListAdapter) - 但是这个不应该编译..

另一种可能性是,你是非常dereferrencing'值'数组(即访问值[位置]超出界限的位置)。

是的 - 我猜测是设置ListView,你的ListViewActivity将遍历列表'获取视图',直到它得到一个空视图。你需要做的是检查那个位置是在值数组的边界。如果是这样,像通常那样设置文本视图。如果不是,则返回null。

+0

setListAdapter与ArrayAdapter一起工作正常,您可以在http://developer.android.com/resources/tutorials/views/hello-listview.html中看到 此代码只是该代码的扩展版本。我试图把复选框放在列表项旁边。我试图在getView()中返回null,但它仍然不起作用。我发布了logcat。 – 2012-03-24 05:36:09

+0

有趣。是的,这些只是我的一些猜测而没有尝试任何东西。 – dcow 2012-03-24 10:04:13