NullPointerException android ListView

1

Я пишу небольшое приложение, использующее ListView в среде Android
Я написал основной файл макета следующим образом

     <?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:padding="1dp" android:orientation="vertical">

  <ListView android:id="@+id/lv1" android:layout_width="fill_parent" android:layout_height="0dp"
android:layout_weight="1"/>

 <RelativeLayout android:id="@+id/ll5" android:background="#C5C1AA" android:layout_width="fill_parent" android:layout_height="wrap_content">
 <Button android:paddingLeft="30dp" android:paddingRight="30dp" android:id="@+id/bt1" android:text="save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_marginLeft="15dp" android:layout_marginTop="10dp" android:onClick="onclick"/>
 <Button android:paddingLeft="30dp" android:paddingRight="30dp" android:id="@+id/bt2" android:text="cancel" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_alignParentRight="true" android:layout_marginRight="15dp" android:layout_marginTop="10dp" android:onClick="onclick2"/>
</RelativeLayout>

 </LinearLayout> 


Я написал класс адаптера и реализовал метод getView() следующим образом

@Override
public View getView(int position, View convertView, ViewGroup parent) {
switch (position) {
case 0:
    convertView = inflater.inflate(R.layout.list1, null);
    break;
case 1:
    convertView=inflater.inflate(R.layout.list2,null);
    break;
default:
    break;
}

return convertView;
}

Я написал макеты файлов следующим образом

list1.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent">

    <TextView android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:text="Alarm name:"
        android:textSize="15dp"
        android:id="@+id/tv3"
        android:layout_margin="5dp"/>
    <EditText android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_below="@id/tv3"
        android:id="@+id/et1"
        android:singleLine="true"
        android:layout_margin="5dp"/>

    </RelativeLayout>

list2.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent">

    <TextView android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_margin="5dp"
        android:text="Password:"
        android:textSize="15dp"
        android:id="@+id/tv4"/>

    <EditText android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_below="@id/tv4"
        android:id="@+id/et2"
        android:layout_margin="5dp"
        android:singleLine="true"/>

      </RelativeLayout>

Я написал метод onclick следующим образом...

 public void onclick(View v)
 {
     try{
         EditText et=(EditText)findViewById(R.id.et1);
         String s1=et.getText().toString();
         if(s1.equals(""))s1="no name";
         Toast.makeText(getApplicationContext(), s1,Toast.LENGTH_SHORT).show();
         EditText et2=(EditText)findViewById(R.id.et2);
        String s2=et2.getText().toString();
         if(s2.equals(""))s2="no password";
         Toast.makeText(getApplicationContext(), s2,Toast.LENGTH_SHORT).show();
      }
     catch(Exception e)
     {
         Toast.makeText(getApplicationContext(), e.toString(),Toast.LENGTH_LONG).show();
     }

 }

Исключение NullPointerException происходит при использовании метода onclick() при доступе к et2, и при доступе к et1 не было проблем
пожалуйста помогите! заранее спасибо :)

Теги:
event-handling
android-layout

3 ответа

2
Лучший ответ

Вы раздуваете только один макет, но в onClick() вы ссылаетесь на поля из обоих:

EditText et=(EditText)findViewById(R.id.et);
//                       first one ^
String s1=et.getText().toString();
if(s1.equals(""))s1="no name";
Toast.makeText(getApplicationContext(), s1,Toast.LENGTH_SHORT).show();
EditText et2=(EditText)findViewById(R.id.et2);
//                        second one ^

Вы должны иметь условие, которое используется, и ссылаться только на один из них.

  • 0
    Если я надуваю только один макет, то как я могу увидеть оба edittexts на эмуляторе ??? класс адаптера должен надувать 2 макета ..
  • 0
    Где ты это делаешь? Я не вижу это в вашем коде / макете.
0

Сначала добавьте второй ListView к вам 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:padding="1dp" android:orientation="vertical">

  <ListView android:id="@+id/lv1" android:layout_width="fill_parent" android:layout_height="0dp"
android:layout_weight="1"/>
<ListView android:id="@+id/lv2" android:layout_width="fill_parent" android:layout_height="0dp"
android:layout_weight="1"/>
     <RelativeLayout android:id="@+id/ll5" android:background="#C5C1AA" android:layout_width="fill_parent" android:layout_height="wrap_content">
     <Button android:paddingLeft="30dp" android:paddingRight="30dp" android:id="@+id/bt1" android:text="save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_marginLeft="15dp" android:layout_marginTop="10dp" android:onClick="onclick"/>
     <Button android:paddingLeft="30dp" android:paddingRight="30dp" android:id="@+id/bt2" android:text="cancel" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_alignParentRight="true" android:layout_marginRight="15dp" android:layout_marginTop="10dp" android:onClick="onclick2"/>
    </RelativeLayout>  
     </LinearLayout> 

Во-вторых, tou нужно раздуть каждый listView, поэтому в вашем методе getView вам нужно убедиться, что вы вызываете класс getView два раза (по одному для каждого спискаView)

  • 0
    GUI становится некрасивым ... но это работает
  • 0
    Я теперь это, так что если это работает, примите ответ
0

Если вы нажмете на первую строку, которая использует первый макет, et2 не существует и будет вызывать исключение NullPointerException.

Я бы посоветовал вам назвать ваш EditText тем же, что позволит вам получить к ним доступ в зависимости от того, какую строку вы нажимаете

  • 0
    Но я нажимаю кнопку за пределами ListView, чтобы получить доступ к данным из обоих EditiTexts

Ещё вопросы

Сообщество Overcoder
Наверх
Меню