2014-11-19 2 views
7

Dopo numerosi tutorial e progetti di esempio sono arrivato al seguente codice che dovrebbe riempire un ListView con righe che contengono più valori fuori da una riga oggetto.

Essendo un programmatore inesperto, non riesco per la vita di me a capire dove diavolo fallisce il mio codice. Qualsiasi aiuto sarebbe molto apprezzato!

Se ho tralasciato informazioni importanti, mi dica e aggiornerò questa domanda.

Il codice che inizia tutto dentro il frammento:

@Override 
    public void onActivityCreated(Bundle savedInstanceState){ 
     super.onActivityCreated(savedInstanceState); 
     Intent i = getActivity().getIntent(); 

     if (i.getSerializableExtra("ChosenWorkorder") != null){ 

      Workorder selectedWorkorder = (Workorder) i.getSerializableExtra("ChosenWorkorder");     

      ArticlesListAdapter articlesListAdapter = new ArticlesListAdapter(getActivity(), R.layout.articles_list_row, selectedWorkorder.GetAllLines()); 

      ListView articlesList = (ListView) getActivity().findViewById(R.id.ArticlesList); 
      articlesList.setAdapter(articlesListAdapter); 

     } 
    } 

L'ArrayAdapter personalizzato:

public class ArticlesListAdapter extends ArrayAdapter<Line> { 

    private List<Line> lineList; 
    private Context context; 

    public ArticlesListAdapter(Context context, int textViewResourceId, List<Line> objects) { 
    super(context, textViewResourceId, objects); 
     this.lineList = objects; 
     this.context = context; 
    } 

    public int getCount() { 
     return lineList.size(); 
    } 

    public Line getItem(int position) { 
     return lineList.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    @SuppressLint("ViewHolder") /* Que? */ 
    public View getView(int position, View convertView, ViewGroup parent) { 

     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.articles_list_row, parent, false); 

     TextView articleName = (TextView)  rowView.findViewById(R.id.textArticleName); 
     EditText articleAmount = (EditText)  rowView.findViewById(R.id.textArticleAmount); 

     Line articleLine = lineList.get(position); 

     articleName.setText(articleLine.getLineArticleDescription()); 
     articleAmount.setText(articleLine.getLineArticleAmount().toString()); 

     return parent;  
    } 
} 

Di seguito si riporta il registro LogCat di chiarimento (per me non significa niente).

E/AndroidRuntime(15941): FATAL EXCEPTION: main 
E/AndroidRuntime(15941): Process: be.mabolifting.maboserve, PID: 15941 
E/AndroidRuntime(15941): java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams 
E/AndroidRuntime(15941): at android.widget.ListView.setupChild(ListView.java:1826) 
E/AndroidRuntime(15941): at android.widget.ListView.makeAndAddView(ListView.java:1793) 
E/AndroidRuntime(15941): at android.widget.ListView.fillDown(ListView.java:691) 
E/AndroidRuntime(15941): at android.widget.ListView.fillFromTop(ListView.java:752) 
E/AndroidRuntime(15941): at android.widget.ListView.layoutChildren(ListView.java:1630) 
E/AndroidRuntime(15941): at android.widget.AbsListView.onLayout(AbsListView.java:2087) 
E/AndroidRuntime(15941): at android.view.View.layout(View.java:14860) 
E/AndroidRuntime(15941): at android.view.ViewGroup.layout(ViewGroup.java:4643) 
E/AndroidRuntime(15941): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055) 
E/AndroidRuntime(15941): at android.view.View.layout(View.java:14860) 
E/AndroidRuntime(15941): at android.view.ViewGroup.layout(ViewGroup.java:4643) 
E/AndroidRuntime(15941): at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1594) 
E/AndroidRuntime(15941): at android.view.View.layout(View.java:14860) 
E/AndroidRuntime(15941): at android.view.ViewGroup.layout(ViewGroup.java:4643) 
E/AndroidRuntime(15941): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
E/AndroidRuntime(15941): at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
E/AndroidRuntime(15941): at android.view.View.layout(View.java:14860) 
E/AndroidRuntime(15941): at android.view.ViewGroup.layout(ViewGroup.java:4643) 
E/AndroidRuntime(15941): at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374) 
E/AndroidRuntime(15941): at android.view.View.layout(View.java:14860) 
E/AndroidRuntime(15941): at android.view.ViewGroup.layout(ViewGroup.java:4643) 
E/AndroidRuntime(15941): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
E/AndroidRuntime(15941): at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
E/AndroidRuntime(15941): at android.view.View.layout(View.java:14860) 
E/AndroidRuntime(15941): at android.view.ViewGroup.layout(ViewGroup.java:4643) 
E/AndroidRuntime(15941): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2013) 
E/AndroidRuntime(15941): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1770) 
E/AndroidRuntime(15941): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1019) 
E/AndroidRuntime(15941): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5725) 
E/AndroidRuntime(15941): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
E/AndroidRuntime(15941): at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
E/AndroidRuntime(15941): at android.view.Choreographer.doFrame(Choreographer.java:544) 
E/AndroidRuntime(15941): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
E/AndroidRuntime(15941): at android.os.Handler.handleCallback(Handler.java:733) 
E/AndroidRuntime(15941): at android.os.Handler.dispatchMessage(Handler.java:95) 
E/AndroidRuntime(15941): at android.os.Looper.loop(Looper.java:136) 
E/AndroidRuntime(15941): at android.app.ActivityThread.main(ActivityThread.java:5086) 
E/AndroidRuntime(15941): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(15941): at java.lang.reflect.Method.invoke(Method.java:515) 
E/AndroidRuntime(15941): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
E/AndroidRuntime(15941): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
E/AndroidRuntime(15941): at dalvik.system.NativeStart.main(Native Method) 
+0

riga di ritorno; invece di tornare genitore; nel metodo getView() dell'adattatore. – Kamal

+0

Si prega di contrassegnare la risposta laalto come risposta corretta e anche di modificare il codice come suggerito da @Blaze tama –

risposta

8

Nella tua getView(), cambiare

return parent;  

a

return rowView; 

getView() dovrebbe restituire la vista fila e non il genitore in cui sono posizionate le righe. La vista genitore è fornita solo come parametro, in modo che l'inflazione della vista possa gestire le dimensioni match_parent e così via.

+0

Questo l'ha risolto! Grazie mille! – Hetiwos

+0

help me http://stackoverflow.com/questions/30951608/java-lang-classcastexception-android-view-viewgrouplayoutparams-cannot-be-cast – Aditya

2

Prova questo:

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = inflater.inflate(R.layout.articles_list_row, parent, false); 

    TextView articleName = (TextView) convertView.findViewById(R.id.textArticleName); 
    EditText articleAmount = (EditText) convertView.findViewById(R.id.textArticleAmount); 

Il punto è dont creare un nuovo View:

View rowView = inflater.inflate(R.layout.articles_list_row, parent, false); 

invece utilizzare il "fornita" View che si riferiscono alla riga del prodotto:

convertView = inflater.inflate(R.layout.articles_list_row, parent, false); 

E come @lallto (altra risposta) ha detto, cambia il tuo return a return convertView; per restituire l'elemento di elenco corrente.

per un risultato migliore, utilizzare ViewHolder modello:

http://www.vogella.com/tutorials/AndroidListView/article.html

+0

Questa risposta può essere utilizzata per l'ottimizzazione.Qual è la risposta alla domanda effettiva dell'OP - ClassCastException? –

+0

Grazie per tutte le informazioni aggiuntive! Segnalo come risposta, perché eri più veloce. – Hetiwos

+0

questo è lavoro .. !! – Nils

2

ritorno convertView riferimento invece genitore in GetView e utilizzare anche ViewHolder modello di progettazione per migliorare le prestazioni ListView:

public View getView(int position, View convertView, ViewGroup parent) { 
    Viewholder viewholder; 
    if(convertView==null){ 
     viewholder = new Viewholder(); 
     convertView = LayoutInflater.from(context).inflate(R.layout.articles_list_row, null); 
     viewholder.articleName = (TextView) convertView.findViewById(R.id.textArticleName); 
     viewholder.articleAmount = (EditText) convertView.findViewById(R.id.textArticleAmount); 
     convertView.setTag(viewholder); 
    }else{ 
     viewholder =(Viewholder) convertView.getTag(); 
    } 

    viewholder.articleName.setText(lineList.get(position).getLineArticleDescription()); 
    viewholder.articleAmount.setText(lineList.get(position).getLineArticleAmount().toString()); 

    return convertView; 
} 

class Viewholder { 
    TextView articleName; 
    EditText articleAmount; 
} 
+0

stesso numero http://stackoverflow.com/questions/30951608/java-lang -classcastexception-android-view-viewgrouplayoutparams-can not-be-fusione – Aditya

0

si dovrebbe scegliere il LayoutParams a seconda del genitore, nel tuo caso nuovi LinearLayout.LayoutParams dovrebbero essere nuovi RelativeLayout .LayoutParams.