如何使自定义适配器适用于Android中的类?

时间:2015-08-21 03:35:36

标签: java android

基本上,我只是尝试使用来自EditText的字符串和一个按钮来创建包含两个textview(字符串和int)的列表。

我为列表项创建了一个自定义适配器和一个xml文件。我已经坚持了几天这个问题了。

当我运行它时,应用程序崩溃,编译器说(这些是我提取的重要内容)

java.lang.IllegalStateException: Could not execute method of the activity

Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)                               at java.lang.reflect.Method.invoke(Method.java:372)

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 
boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference at com.example.avengerlol.onmyown.MainActivity.onAddItem(MainActivity.java:63)

这是我到目前为止所拥有的:

我的主要活动

public class MainActivity extends Activity {
public ArrayList<SuperMan> list;
public class SuperMan {
    public int counter = 0;
    public String theName;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ArrayList<SuperMan> list = new ArrayList<SuperMan>();

    MyCustomAdapter adapter = new MyCustomAdapter(list, this);

    ListView lView = (ListView)findViewById(R.id.the_whole_list);
    lView.setAdapter(adapter);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}


public void onAddItem (View v)
{
    EditText etNewItem = (EditText) findViewById(R.id.addItemText);
    SuperMan letsGo = new SuperMan();
    letsGo.theName = etNewItem.getText().toString();

    list.add(letsGo);
    etNewItem.setText("");

}
}

我的自定义适配器类

public class MyCustomAdapter extends BaseAdapter implements ListAdapter {
private ArrayList<MainActivity.SuperMan> list = new ArrayList<>();
private Context context;

public MyCustomAdapter(ArrayList<MainActivity.SuperMan> list, Context context) {
    this.list = list;
    this.context = context;
}

@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int pos) {
    return list.get(pos);
}

@Override
public long getItemId(int pos) {
    return 0;

}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View view = convertView;
    if (view == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.superman_list, null);
    }

    //Handle TextView and display string from your list

    TextView listItemText = (TextView) view.findViewById(R.id.itemName);
    TextView listItemCounter = (TextView) view.findViewById(R.id.itemCounter);
    Button increaseButton = (Button) view.findViewById(R.id.increaseButton);


    return view;
}


}

我的主要xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"                                               
 android:layout_height="match_parent"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 android:paddingBottom="@dimen/activity_vertical_margin"    
 tools:context=".MainActivity">
<ListView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/addItemText"
    android:id="@+id/the_whole_list"
    />



<EditText
    android:id="@+id/addItemText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:hint="Enter a new item"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_toLeftOf="@+id/btnAddItem"
    android:layout_toStartOf="@+id/btnAddItem"/>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Add Item"
    android:id="@+id/btnAddItem"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:onClick="onAddItem"/>

</RelativeLayout>

我的列表项xml

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

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/itemName"

    />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/itemCounter"

    />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="+"
    android:id="@+id/increaseButton"
    />

</LinearLayout>

2 个答案:

答案 0 :(得分:2)

您收到NullPointerException,因为您的列表尚未初始化。 我想你正在onCreate方法中尝试它。

ArrayList<SuperMan> list = new ArrayList<SuperMan>();

您将创建一个名为listList的列表,该列表仅在您的onCreate方法中可见。此启动不会影响您的成员变量。 onCreate中的变量list隐藏了您班级的list。 用

替换这一行
list = new ArrayList<SuperMan>();

将初始化您的成员并且NPE消失了。

答案 1 :(得分:0)

NullPointerException 是因为您在函数onCreate()中创建了一个新的局部变量。相反,您必须按如下方式初始化类成员变量list

list = new ArrayList<SuperMan>();

而不是

ArrayList<SuperMan> list = new ArrayList<SuperMan>();

这里实际发生的是你正在尝试创建一个新的list并对该方法本身具有范围的局部变量执行操作。从onCreate()方法返回控件后,更改不会影响类成员变量list

接下来用onAddItem()方法写下这一行:

list.add(letsGo);

add()对象本身上调用null,从而导致 NullPointerException