2012-10-08 12 views
11

Come ho visto nelle domande precedenti, all'interno della classe dell'adattatore personalizzato (ad esempio, MyAdapter estende ArrayAdapter) utilizzano sempre un layout di elenco di articoli xml gonfiato . Quello che sto sperando di fare è creare tutto interamente utilizzando Java e XML non ...Creazione di un ListView con elementi di elenco personalizzati a livello di codice in Android - no layout dell'elenco xml

// for example 
String[] wordlist = new String[] {a, b, c}; 

LinearLayout list_item_layout = new LinearLayout(this); 
list_item_layout.setId(5000); 

TextView listText = new TextView(this); 
listText.setId(5001); 

listLayout.addView(listText); 

ListView list = new ListView(this); 

// ** QUESTION ** do I declare a programmatic .setAdapter() like this? 
// ** TAKE NOTE ** I passed 'wordlist' here.. 
list.setAdapter(new MyAdapter(this, list_item_layout.getId(), listText.getId(), wordlist)); 

e poi per MyAdapter ...

private class MyAdapter extends ArrayAdapter<String> { 

    public MyAdapter(Context context, int resource, int textViewResourceId, String[] strings) { 
     super(context, resource, textViewResourceId, strings); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View v = convertView; //is this the list_item_layout that I passed?? 
     TextView tv = (TextView) v.findViewById(5001); 

     // ** QUESTION ** do I pass 'wordlist' again here? 
     tv.setText(wordlist[position]); 

     return v; 
    } 
} 

Cosa succede quando ho eseguito questo sul mio dispositivo è I ottenere i seguenti errori ...

10-08 23:11:19.775: E/AndroidRuntime(18276): FATAL EXCEPTION: main 
    10-08 23:11:19.775: E/AndroidRuntime(18276): android.content.res.Resources$NotFoundException: String resource ID #0x0 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.content.res.Resources.getText(Resources.java:222) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.widget.TextView.setText(TextView.java:3011) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at com.turista.client.TuristaClientMain.onClick(TuristaClientMain.java:113) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.view.View.performClick(View.java:2538) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.view.View$PerformClick.run(View.java:9152) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.os.Handler.handleCallback(Handler.java:587) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.os.Handler.dispatchMessage(Handler.java:92) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.os.Looper.loop(Looper.java:123) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.app.ActivityThread.main(ActivityThread.java:3691) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at java.lang.reflect.Method.invokeNative(Native Method) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at java.lang.reflect.Method.invoke(Method.java:507) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at dalvik.system.NativeStart.main(Native Method) 

Qualcuno può spiegare come eseguire questa operazione a livello di programmazione?


* A CURA * 9 ottobre 2012


Ok, come sto ancora bloccato in questo problema credo di aver fatto alcuni miglioramenti ma ancora ottenere messaggi di errore. Il codice migliore è il seguente ..

//wordlist is a global variable 
String[] wordlist = new String[] {a, b, c}; 

// .. 
// .. inside onCreate... 

ListView list = new ListView(this); 
     list.setAdapter(new MyAdapter(this, R.layout.listitem, R.id.mLargeTextView, wordlist)); 
// since the ArrayAdapter class needs XML parameters to inflate, I created a dummy layout 

ora all'interno della classe MyAdapter ..

private class MyAdapter extends ArrayAdapter<String> { 

    public MyAdapter(Context context, int resource, int textViewResourceId, String[] strings) { 
     super(context, resource, textViewResourceId, strings); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 


     LinearLayout listLayout = new LinearLayout(Main.this); 
     listLayout.setLayoutParams(new LayoutParams(wrapContent, wrapContent)); 
     listLayout.setId(5000); 

     TextView listText = new TextView(Main.this); 
     listText.setId(5001); 

     listLayout.addView(listText); 

     listText.setText(wordlist[position]); 

     return listLayout; 
    } 
} 

Come potete vedere, penso di avere per ignorare GetView al fine di visualizzare la mia vista personalizzata quindi questo è cosa ho fatto. Sfortunatamente penso di averlo frainteso. Qui ci sono gli errori ..

10-09 09:24:10.095: E/AndroidRuntime(2517): FATAL EXCEPTION: main 
    10-09 09:24:10.095: E/AndroidRuntime(2517): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.ListView.measureScrapChild(ListView.java:1183) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1266) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.ListView.onMeasure(ListView.java:1175) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.View.measure(View.java:8366) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.View.measure(View.java:8366) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.View.measure(View.java:8366) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:386) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at com.android.internal.widget.WeightedLinearLayout.onMeasure(WeightedLinearLayout.java:60) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.View.measure(View.java:8366) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.View.measure(View.java:8366) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.View.measure(View.java:8366) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.ViewRoot.performTraversals(ViewRoot.java:847) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1868) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.os.Looper.loop(Looper.java:123) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.app.ActivityThread.main(ActivityThread.java:3691) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at java.lang.reflect.Method.invokeNative(Native Method) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at java.lang.reflect.Method.invoke(Method.java:507) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at dalvik.system.NativeStart.main(Native Method) 
+0

Posso chiedere perché si vorrebbe fare questo stile di programmazione invece di usare XML? – Zerkz

+0

hai già impostato l'ID perché stai trovando un nuovo TextView con quell'ID? usa tv.getID(). –

+0

@ Kumar cosa intendi? Ho usato v.findViewById (5001). – daryl

risposta

21

ListView estende AbsListView che a sua volta si estende AdapterView che si estende vista del gruppo. Quindi tutto il figlio di ListView verrà aggiunto a ViewGroup. Quindi, per impostare il parametro di layout, è possibile utilizzare ViewGroup.LayoutParamViewGroup.LayoutParam durante l'impostazione del parametro di layout per listLayout.

Oppure provate AbsListView.LayoutParams per impostare il layout param per listLayout

Si prega di provare e fatemi sapere se ha funzionato.

seguito il codice sta lavorando bene ..

public class MainActivity1 extends Activity { 

    String[] wordlist = new String[] { "a", "b", "c" }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ListView list = new ListView(this); 
     list.setAdapter(new MyAdapter(this, wordlist)); 

     setContentView(list); 
    } 

    private class MyAdapter extends ArrayAdapter<String> { 

     public MyAdapter(Context context, String[] strings) { 
      super(context, -1, -1, strings); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      LinearLayout listLayout = new LinearLayout(MainActivity1.this); 
      listLayout.setLayoutParams(new AbsListView.LayoutParams(
        AbsListView.LayoutParams.WRAP_CONTENT, 
        AbsListView.LayoutParams.WRAP_CONTENT)); 
      listLayout.setId(5000); 

      TextView listText = new TextView(MainActivity1.this); 
      listText.setId(5001); 

      listLayout.addView(listText); 

     listText.setText(super.getItem(position)); 

      return listLayout; 
     } 
    } 
} 

Il problema era che per default importazioni Eclipse ViewGroup.LayoutParams che sono incompatibili con la AbsListView.LayoutParams che devono essere utilizzati per impostare il layout param per la vista restituito dal metodo getView().

preghiamo di controllare e fatemi sapere come è andata ..

+0

Appena testato con AbsListView.LayoutParams e sta funzionando bene. Aggiornato la mia risposta di conseguenza .. –

+0

Wow funziona. Non sapevo che all'interno di questo metodo getView() LayoutParams è gestito in modo diverso, e basarsi pesantemente sull'importazione automatica fatta da Eclipse non è una buona cosa. – daryl

+0

Grazie. Stavo quasi per rinunciare a questa idea di fare tutto a livello di programmazione. Un'ultima domanda, posso vedere che hai passato la "lista di parole" dell'array all'interno di setAdapter (new MyAdapter()) all'interno di onCreate. Quindi ciò significa che deve essere già presente in MyAdapter da qualche parte ... Se la "lista di parole" non è dichiarata globalmente, come si chiama? Grazie ancora Praful. L'hai completamente inchiodato. – daryl

2

Per aggiungere alla risposta di cui sopra, l'impostazione id con un numero costante non è una buona idea.

Sostituire, listLayout.setId(5000); con, listLayout.setId(View.generateViewId());

Nel caso in cui ci si rivolge API 16 e al di sotto, si riferiscono this.

Problemi correlati