2014-11-19 4 views
7

После многочисленных обучающих программ и примеров проектов я пришел к следующему коду, который должен заполнить ListView строками, которые содержат несколько значений из строки объект.

Будучи программистом-новичком, я не могу на всю жизнь выяснить, где, черт возьми, мой код не удается. Любая помощь приветствуется!

Если у меня осталась важная информация, пожалуйста, сообщите мне, и я обновлю этот вопрос.

код, который начинается все внутри фрагмента:

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

     } 
    } 

Обычай ArrayAdapter:

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

Ниже журнал LogCat разъяснений (для меня это ничего не значит).

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

return rowView; вместо возвращаемого родителя; в методе getView() адаптера. – Kamal

+0

Пожалуйста, отметьте ответ laalto как правильный ответ, а также измените свой код, как предложено @Blaze tama –

ответ

8

В вашем getView() измените

return parent;  

в

return rowView; 

getView() должен вернуть вид строки и не родительский элемент, в который помещаются строки. Родительский вид предоставляется только в качестве параметра, так что просмотр инфляции может иметь размеры и такие размеры match_parent.

+0

Это исправлено! Спасибо! – Hetiwos

+0

помогите мне http://stackoverflow.com/questions/30951608/java-lang-classcastexception-android-view-viewgrouplayoutparams-cannot-be-cast – Aditya

2

Попробуйте это:

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

Дело DonT создать новый View:

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

Вместо использования "при условии" View, которые ссылаются на эту строку элемента:

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

И как @lallto (другой ответ) сказал, измените свой return на return convertView; для возврата текущего элемента списка.

Для лучшего результата используйте ViewHolder шаблон:

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

+0

Этот ответ может быть использован для оптимизации.Каков ответ фактического вопроса OP - ClassCastException? –

+0

Благодарим вас за дополнительную информацию! Я буду отмечать это как ответ, потому что вы были быстрее. – Hetiwos

+0

это работа .. !! – Nils

2

Возвращения convertView ссылки вместо родителя в GetView, а также использовать ViewHolder шаблон проектирования для повышения производительности 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

та же проблема http://stackoverflow.com/questions/30951608/java-lang -classcastexception-андроид-View-viewgrouplayoutparams-не может-быть-литой – Aditya

0

Вы должны выбрать LayoutParams в зависимости от родителей, в вашем случае новые LinearLayout.LayoutParams должны быть новым RelativeLayout .LayoutParams.