2 Stimmen

textview.setText() in ListView verursacht Force Close

Hier ist mein Code, ich weiß, es gibt einen kleinen Fehler irgendwo, aber als ein Noob in Android kann ich nicht herausfinden, es. Ich habe meine Suche getan, aber ohne Erfolg.

Die 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;
    }

}

Ich verstehe nicht, warum wir das Hauptlayout als ContentView verwenden. Ich meine, das offizielle Listview-Tutorial verwendet es nicht und die Liste funktioniert einwandfrei. Aber ich habe im Netz gefunden, dass wenn ich findViewById verwende, ich Folgendes verwenden muss setContentView(R.layout.main); . Ich verstehe nicht, wenn die ID nicht in der Hauptansicht ist, warum sollte ich sie dann verwenden.

Außerdem schließt sich diese App zwangsweise. Ich habe das Problem eingegrenzt auf textView.setText(values[position]); . Was mache ich falsch?

更新情報 : Ich habe setContentView entfernt, da es einen anderen Fehler verursachte, dessen Lösung hier veröffentlicht ist: ListView, dessen id-Attribut 'Android.R.id.list' ist Fehler, wenn ich die ListView id richtig eingestellt habe

Hier ist das Logcat nach dem Entfernen von setContentView:

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)

Die Zeile 32 entspricht textView.setText(values[position]);

2voto

5hssba Punkte 8049

ListActivity hat ein Standardlayout, das aus einer einzelnen, bildschirmfüllenden Liste in der Mitte des Bildschirms besteht. Wenn Sie möchten, können Sie jedoch das Bildschirmlayout anpassen, indem Sie Ihr eigenes View-Layout mit setContentView() in onCreate() festlegen. Um dies zu tun, MUSS deine eigene Ansicht ein ListView-Objekt mit der id "@+id/list".... enthalten, also nur wenn du ein angepasstes Layout brauchst, solltest du setContentView() verwenden oder sonst... keine Notwendigkeit, R.layout.main zu verwenden... jetzt für das erzwungene Schließen deiner App... solltest du das logcat posten... so dass es einfach ist, herauszufinden, wo der Fehler liegt... und Ich glaube nicht, dass es einen Fehler gibt. ... außer der Änderung der

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

to 

android:id="@+id/list"

weil ich den Code kopiert und versucht habe.. es funktioniert einfach gut für mich..

1voto

Kumar Bibek Punkte 8945

Stattdessen

View rowView = inflater.inflate(R.layout.list\_item, parent, false);

Verwendung:

View rowView = inflater.inflate(R.layout.list\_item, null);

0voto

dcow Punkte 7477

Ohne Ihre Logcat zu sehen, werde ich vermuten, dass Ihr Problem tatsächlich in der Tatsache liegt, dass Sie setListAdapter(ListAdapter) mit einem ArrayAdapter statt der angeforderten ListAdapter bereitstellen -- aber dies sollte nicht kompilieren.

Die andere Möglichkeit besteht darin, dass Sie das Array "values" nicht richtig dereferenzieren (d. h. mit values[position] auf eine Stelle außerhalb der Grenzen zugreifen).

Ja - was ich vermute, ist, dass zum Einrichten der ListView, Ihre ListViewActivity wird durch die Liste "immer Ansichten" iterieren, bis es eine Null-Ansicht erhält. Was Sie tun müssen, ist zu überprüfen, dass die Position innerhalb der Grenzen des Wert-Arrays liegt. Wenn ja, richten Sie die Textansicht ein, wie Sie es normalerweise tun. Wenn nicht, geben Sie null zurück.

-1voto

Android Punkte 1407

Versuchen Sie diesen Code

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

            }

        });

    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X