2011-09-20 82 views
5

试图编写我的第一个ArrayAdapter for Android,目前正在失败。它在setAdapter(adapter);行上崩溃并抛出NullPointerException。活动在setAdapter(ArrayAdapter)上崩溃;

ContractTestActivity:

public class ContractTestActivity extends Activity { 

    private ArrayList<Contract> contracts; 
    public final String TAG = "ContractTest"; 
    //public Contract newContract = new Contract(); 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 
     ListView list; 
     list = (ListView)findViewById(R.id.list); 
     ArrayAdapter<Contract> adapter = new ContractAdapter(this, android.R.layout.simple_list_item_1, contracts); 
     list.setAdapter(adapter); 
    } 
} 

ContractAdapter:

public class ContractAdapter extends ArrayAdapter<Contract> { 


     private ArrayList<Contract> contracts; 

     public ContractAdapter(Context context, int view, ArrayList<Contract> passedContracts) { 
       super(context, view, passedContracts); 
       contracts = passedContracts; 
     } 

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

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
       View currentView = convertView; 
       LayoutInflater currentViewInflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       currentView = currentViewInflater.inflate(android.R.layout.simple_list_item_1, null); 
       Contract currentContract = contracts.get(position); 
       TextView text = (TextView) currentView.findViewById(android.R.id.text1); 
       text.setText(currentContract.getName()); 
       return currentView; 
     } 

} 

合同:

public class Contract extends ContractTestActivity { 

    private String name; 
    private float payRate; 
    private int hoursWorked; 
    private int holidays; 

    public Contract() { 

    } 

    public String getName() { 
     return name; 
    } 

} 

建议?

回答

3

的问题是,你是不是初始化ArrayList中

private ArrayList<Contract> contracts; 

它因此,你所得到的错误NullPointerException异常。

UPADATED:

ContractTestActivity.java

public class ContractTestActivity extends Activity { 
    private List<Contract> contracts = new ArrayList<Contract>(); 
    public final String TAG = "ContractTest"; 
    //public Contract newContract = new Contract(); 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 
     ListView list; 
     list = (ListView)findViewById(R.id.mylist); 
     ArrayAdapter<Contract> adapter = new ContractAdapter(this, android.R.layout.simple_list_item_1, myContracts()); 
     list.setAdapter(adapter); 
    } 

    private List<Contract> myContracts(){ 

     List<Contract> list = new ArrayList<Contract>(); 

     list.add(new Contract("Friend1")); 
     list.add(new Contract("Friend2")); 
     list.add(new Contract("Friend3")); 
     list.add(new Contract("Friend4")); 
     return list; 
    } 
} 

Contract.java

public class Contract { 

    private String name; 

    public Contract(String name) { 
     this.name = name; 
    } 
    public String getName() { 
     return name; 
    } 
} 

ContractAdapter.java

public class ContractAdapter extends ArrayAdapter<Contract> { 


    private List<Contract> contracts; 

    public ContractAdapter(Context context, int view, List<Contract> passedContracts) { 
      super(context, view, passedContracts); 
      contracts = passedContracts; 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
      View currentView = convertView; 
      LayoutInflater currentViewInflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      currentView = currentViewInflater.inflate(android.R.layout.simple_list_item_1, null); 
      Contract currentContract = contracts.get(position); 
      TextView text = (TextView) currentView.findViewById(android.R.id.text1); 
      text.setText(currentContract.getName()); 
      return currentView; 
    } 
} 
+0

改成了'private ArrayList contracts = new ArrayList ();',同样的错误。 – Fraser

+0

您必须将数据也添加到ArrayList,然后传递给适配器。 –

+0

结帐我完整的工作更新了你的答案。 –

0
ArrayAdapter<Contract> adapter = new ContractAdapter(this, android.R.layout.simple_list_item_1, contracts); 

此时是否设定合约?

0

private ArrayList contracts = ???

应该分配一定的价值...或如下简单地空:

contracts = new ArrayList<Contract>;

Also try to String[] names = new String[] { "Linux", "Windows7", "Eclipse", "Suse", 
       "Ubuntu", "Solaris", "Android", "iPhone"}; 
     // Create an ArrayAdapter, that will actually make the Strings above 
     // appear in the ListView 
     list.setAdapter(new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, names)); 

如果异常仍然存在...然后在xml中检查列表视图的Id。

这可能只是因为那个原因。

2

问题是,你不需要添加任何值,你的ArrayList合同

ArrayAdapter<Contract> adapter = new ContractAdapter(this, android.R.layout.simple_list_item_1, contracts); 

此行之前,您应该有的值添加到合同

因此增加值列出这样

contracts = new ArrayList<Contract>(); 
contracts.add(new Contract("name")); 
ArrayAdapter<Contract> adapter = new ContractAdapter(this,android.R.layout.simple_list_item_1, contracts); 

现在合同的大小将返回ArrayList的长度。

0

在main中创建一个listview。XML 和listview.xml

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    t=(EditText)findViewById(R.id.editText1); 
    lv=(ListView)findViewById(R.id.listView1); 
    listItems = new ArrayList<String>(); 
    dataAdapter = new ArrayAdapter<String>(this, R.layout.listview,R.id.row); 
    //row is id of textview 
    lv.setAdapter(dataAdapter); 

} 

文本视图在按钮单击事件

dataAdapter.add(t.getText().toString()); 

dataAdapter.notifyDataSetChanged(); 

使得单击按钮时的EditText的内容将被添加到列表视图