2011-09-20 14 views
5

Intentando escribir mi primer ArrayAdapter para Android, fallando miserablemente en este momento. Se bloquea en la línea setAdapter(adapter); y arroja una NullPointerException.Bloqueos de actividad en 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; 
     } 

} 

Contrato:

public class Contract extends ContractTestActivity { 

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

    public Contract() { 

    } 

    public String getName() { 
     return name; 
    } 

} 

Sugerencias?

Respuesta

3

El problema es que no se está inicializando su ArrayList

private ArrayList<Contract> contracts; 

Su por lo tanto, que está recibiendo el error 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

lo cambió a 'private ArrayList contracts = new ArrayList ();', mismo error. – Fraser

+0

Debe agregar los datos también a ArrayList y luego pasarlos al adaptador. –

+0

pago y envío mi respuesta actualizada de trabajo completa para usted. –

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

¿Los contratos no están establecidos en este momento?

0

private ArrayList contracts = ???

Se debe asignar algún valor ... o simplemente un nulo de la siguiente manera:

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)); 

Si la excepción persiste ... Luego verifique el Id de la vista de lista en xml.

Esto puede ser debido a eso solamente.

2

problema es que su no va a agregar cualquier valor a su ArrayList contrae

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

Antes de esta línea se debe añadir algunos valores a contratos

por lo que añadir los valores de lista como esta

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

Ahora El tamaño de los contratos devolverá la longitud de ArrayList.

0

Cree una vista de lista en main.xml y una vista de texto en 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); 

} 

En botones de clic evento

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

dataAdapter.notifyDataSetChanged(); 

de modo que cuando se hace clic en el botón se añadirá el contenido de EditarTexto a vista de lista

Cuestiones relacionadas