2016-03-28 13 views
0

Ich versuche, ein Quiz in Android Studio zu erstellen. Daher möchte ich ein ListView implementieren, das die Frage in einer TextView und die Antwort in Form von Buttons anzeigt.So erstellen Sie mehrere Layout-Listenansichten mit CustomAdapter in Android Studio

Die verschiedenen Layouts werden benötigt, da eine Frage zwei, drei oder vier Antworten (Buttons) haben kann. Also in jeder Zeile sollte ein TextView sein und je nach den Antworten 2, 3 oder 4 Buttons.

Dies ist mein CustomAdapter bisher. Das Problem ist, dass dies nur für einen TextView funktioniert und ich nicht weiß, wie ich die Buttons adressieren kann.

public class CustomAdapter extends ArrayAdapter { 
private QuizItem[] items; 

@Override 
public int getViewTypeCount() { 
    return 3; 
} 

@Override 
public int getItemViewType(int position) { 
    return items[position].getCategory(); 
} 

public CustomAdapter(Context context, int question, QuizItem[] items) { 
    super(context, question, items); 
    this.items = items; 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder viewHolder = null; 
    QuizItem quizItem = items[position]; 
    int quizItemType = getItemViewType(position); 

    if (convertView == null) { 

     if (quizItemType == Config.CATEGORY_TWO_ANSWERS) { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.two_answers, null); 
     } else if (quizItemType == Config.CATEGORY_THREE_ANSWERS) { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.three_answers, null); 
     } 
     else{ 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.four_answers, null); 
     } 

     TextView textView = (TextView) convertView.findViewById(R.id.textView); 
     viewHolder = new ViewHolder(textView); 

     convertView.setTag(viewHolder); 

    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    viewHolder.getText().setText(quizItem.getQuestion()); 
    return convertView; 
}} 

Und das ist meine Hauptklasse, wo ich einige Demo-Termin mit der for-Schleife erstellen:

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ListView listView = (ListView) findViewById(R.id.simpleListView); 
    final QuizItem[] itemArray = new QuizItem[10]; 
    int toggle = 0; 

    for(int i = 0; i < itemArray.length; i++){ 

     if(toggle == 0){ 

      itemArray[i] = new QuizItem("Question " + i, "Answer A", "Answer B"); 
      toggle = 1; 
     } 
     else if(toggle == 1){ 

      itemArray[i] = new QuizItem("Question " + i, "Answer A", "Answer B", "Answer C"); 
      toggle = 2; 
     } 
     else{ 
      itemArray[i] = new QuizItem("Question " + i, "Answer A", "Answer B", "Answer C", "Answer D"); 
      toggle = 0; 
     } 
    } 

    CustomAdapter customAdapter = new CustomAdapter(this, R.id.textView, itemArray); 
    listView.setAdapter(customAdapter); 

}} 

Wie also kann die Antwort Text auf den Tasten legen und die richtige Menge an Tasten angezeigt werden? Ich bin sehr dankbar für jede Information!

EDIT: Dies ist die LogCat

03-28 14:58:48.564 12092-12092/adonis.quiz D/dalvikvm﹕ Late-enabling CheckJNI 
03-28 14:58:48.564 12092-12092/adonis.quiz D/dalvikvm﹕ Try to disable coredump for pid 12092 
03-28 14:58:48.564 12092-12092/adonis.quiz D/dalvikvm﹕ Process 12092 nice name: adonis.quiz 
03-28 14:58:48.564 12092-12092/adonis.quiz D/dalvikvm﹕ Extra Options: not specified 
03-28 14:58:48.684 12092-12092/adonis.quiz W/dalvikvm﹕ VFY: unable to find class referenced in signature (Landroid/view/SearchEvent;) 
03-28 14:58:48.684 12092-12092/adonis.quiz I/dalvikvm﹕ Could not find method android.view.Window$Callback.onSearchRequested, referenced from method android.support.v7.view.WindowCallbackWrapper.onSearchRequested 
03-28 14:58:48.684 12092-12092/adonis.quiz W/dalvikvm﹕ VFY: unable to resolve interface method 14571: Landroid/view/Window$Callback;.onSearchRequested (Landroid/view/SearchEvent;)Z 
03-28 14:58:48.684 12092-12092/adonis.quiz D/dalvikvm﹕ VFY: replacing opcode 0x72 at 0x0002 
03-28 14:58:48.684 12092-12092/adonis.quiz I/dalvikvm﹕ Could not find method android.view.Window$Callback.onWindowStartingActionMode, referenced from method android.support.v7.view.WindowCallbackWrapper.onWindowStartingActionMode 
03-28 14:58:48.684 12092-12092/adonis.quiz W/dalvikvm﹕ VFY: unable to resolve interface method 14575: Landroid/view/Window$Callback;.onWindowStartingActionMode (Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode; 
03-28 14:58:48.684 12092-12092/adonis.quiz D/dalvikvm﹕ VFY: replacing opcode 0x72 at 0x0002 
03-28 14:58:48.714 12092-12092/adonis.quiz I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.widget.TintTypedArray.getChangingConfigurations 
03-28 14:58:48.714 12092-12092/adonis.quiz W/dalvikvm﹕ VFY: unable to resolve virtual method 463: Landroid/content/res/TypedArray;.getChangingConfigurations()I 
03-28 14:58:48.714 12092-12092/adonis.quiz D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002 
03-28 14:58:48.724 12092-12092/adonis.quiz I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.widget.TintTypedArray.getType 
03-28 14:58:48.724 12092-12092/adonis.quiz W/dalvikvm﹕ VFY: unable to resolve virtual method 485: Landroid/content/res/TypedArray;.getType (I)I 
03-28 14:58:48.724 12092-12092/adonis.quiz D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002 
03-28 14:58:48.804 12092-12092/adonis.quiz D/CA/getType﹕ 5 
03-28 14:58:48.804 12092-12092/adonis.quiz D/CA/getType﹕ 5 
03-28 14:58:48.814 12092-12092/adonis.quiz D/AndroidRuntime﹕ Shutting down VM 
03-28 14:58:48.814 12092-12092/adonis.quiz W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x430f2140) 
03-28 14:58:48.824 12092-12092/adonis.quiz E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: adonis.quiz, PID: 12092 
    java.lang.NullPointerException 
      at adonis.quiz.CustomAdapter.getView(CustomAdapter.java:65) 
      at android.widget.AbsListView.obtainView(AbsListView.java:2312) 
      at android.widget.ListView.measureHeightOfChildren(ListView.java:1263) 
      at android.widget.ListView.onMeasure(ListView.java:1175) 
      at android.view.View.measure(View.java:16772) 
      at android.widget.RelativeLayout.measureChild(RelativeLayout.java:689) 
      at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:473) 
      at android.view.View.measure(View.java:16772) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5139) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) 
      at android.view.View.measure(View.java:16772) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5139) 
      at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:391) 
      at android.view.View.measure(View.java:16772) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5139) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at android.view.View.measure(View.java:16772) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5139) 
      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
      at android.view.View.measure(View.java:16772) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5139) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2294) 
      at android.view.View.measure(View.java:16772) 
      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1936) 
      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1133) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1315) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1020) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5762) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:771) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
      at android.view.Choreographer.doFrame(Choreographer.java:544) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:757) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:149) 
      at android.app.ActivityThread.main(ActivityThread.java:5257) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 
      at dalvik.system.NativeStart.main(Native Method) 
+0

Mögliche Duplikat [Android Listview mit verschiedenen Layout für jede Zeile] (http://stackoverflow.com/ Fragen/4777272/android-listview-mit-verschiedenen-Layout-für-jede-Zeile) –

+0

Ich habe diesen Artikel bereits gelesen, aber ich verstehe nicht wie getView() funktioniert und wie es mit ViewHolder zusammenarbeitet. – Donko

+0

können Sie Ihre Idee mit einer erweiterbaren Listenansicht implementieren. –

Antwort

0

/------------------- QuizItem Modell -------- ----------/

public class QuizItem { 

    public String strQues = ""; 
    public int iNoOfAns = 0; 
    public String strAns1 = ""; 
    public String strAns2 = ""; 
    public String strAns3 = ""; 
    public String strAns4 = ""; 

    public QuizItem (int noOFAns,String ques,String ans1,String ans2,String ans3,String ans4) 
    { 

     this.iNoOfAns = noOFAns; 
     this.strQues = ques; 
     this.strAns1 = ans1; 
     this.strAns2 = ans2; 
     this.strAns3 = ans3; 
     this.strAns4 = ans4; 

    } 

} 

Machen Sie ein paar Änderungen während der Erstellung von Array, ich habe keine hinzugefügt. Am parameter-

  final QuizItem[] itemArray = new QuizItem[10]; 
      int toggle = 0; 

      for(int i = 0; i < itemArray.length; i++){ 

       if(toggle == 0){ 

        itemArray[i] = new QuizItem(2,"Question " + i, "Answer A", "Answer B","",""); 
        toggle = 1; 
       } 
       else if(toggle == 1){ 

        itemArray[i] = new QuizItem(3,"Question " + i, "Answer A", "Answer B", "Answer C",""); 
        toggle = 2; 
       } 
       else{ 
        itemArray[i] = new QuizItem(4,"Question " + i, "Answer A", "Answer B", "Answer C", "Answer D"); 
        toggle = 0; 
       } 
      } 

/------------------- CustomAdapter ------------------ -------/

public class CustomAdapter extends ArrayAdapter<QuizItem> { 
    private QuizItem[] items; 

    Context mContext; 

    public CustomAdapter(Context context, int resource, QuizItem[] objects) { 
     super(context, resource, objects); 
     mContext = context; 
     items = objects; 

    } 



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

     QuizItem quizItem = items[position]; 
     int quizItemType = quizItem.iNoOfAns; 
     LayoutInflater inflator = ((android.app.Activity) mContext) 
       .getLayoutInflater(); 



      if (quizItemType == 2) { 

       convertView = inflator.inflate(R.layout.temp_ans_two, parent,false); 


       TextView textView = (TextView) convertView.findViewById(R.id.tv_ques); 
       textView.setText(quizItem.strQues); 

       Button button1 = (Button)convertView.findViewById(R.id.button1); 
       button1.setText(quizItem.strAns1); 

       Button button2 = (Button)convertView.findViewById(R.id.button2); 
       button2.setText(quizItem.strAns2); 



      } else if (quizItemType ==3) { 

       convertView = inflator.inflate(R.layout.temp_ans_three, parent,false); 

       TextView textView = (TextView) convertView.findViewById(R.id.tv_ques); 
       textView.setText(quizItem.strQues); 

       Button button1 = (Button)convertView.findViewById(R.id.button1); 
       button1.setText(quizItem.strAns1); 

       Button button2 = (Button)convertView.findViewById(R.id.button2); 
       button2.setText(quizItem.strAns2); 

       Button button3 = (Button)convertView.findViewById(R.id.button3); 
       button3.setText(quizItem.strAns3); 


      } 
      else{ 
       convertView = inflator.inflate(R.layout.temp_ans_four, parent,false); 

       TextView textView = (TextView) convertView.findViewById(R.id.tv_ques); 
       textView.setText(quizItem.strQues); 

       Button button1 = (Button)convertView.findViewById(R.id.button1); 
       button1.setText(quizItem.strAns1); 

       Button button2 = (Button)convertView.findViewById(R.id.button2); 
       button2.setText(quizItem.strAns2); 

       Button button3 = (Button)convertView.findViewById(R.id.button3); 
       button3.setText(quizItem.strAns3); 

       Button button4 = (Button)convertView.findViewById(R.id.button4); 
       button4.setText(quizItem.strAns4); 

      } 


     return convertView; 
    }} 
+0

Vielen Dank, das funktioniert! Aber ich lese überall, dass man einen ViewHolder aus Speichergründen verwenden sollte - wie kann ich das umsetzen? – Donko

+0

können Sie ANS akzeptieren, wenn es für Sie arbeitet. –

0
You should create an inner ViewHolder class and define buttons and textview like this 
    Class ViewHolder 
    { 
    public static Button b1; 
    public static Button b2; 
    public static Button b3; 
    public static Button b4; 
    public static Textview t1; 
    } 


    Then modify the code like this 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder viewHolder = null; 
     QuizItem quizItem = items[position]; 
     int quizItemType = getItemViewType(position); 

     if (convertView == null) { 

      if (quizItemType == Config.CATEGORY_TWO_ANSWERS) { 
       convertView = LayoutInflater.from(getContext()).inflate(R.layout.two_answers, null); 
viewHolder.t1=(TextView)convertView.findviewbyid(R.id.textview); 
viewHolder.b1=(Button)convertView.findviewbyid(R.id.button); 
viewHolder.b2=(Button)convertView.findviewbyid(R.id.button2); 
      } else if (quizItemType == Config.CATEGORY_THREE_ANSWERS) { 
       convertView = LayoutInflater.from(getContext()).inflate(R.layout.three_answers, null); 
viewHolder.t1=(TextView)convertView.findviewbyid(R.id.textview); 
viewHolder.b1=(Button)convertView.findviewbyid(R.id.button); 
viewHolder.b2=(Button)convertView.findviewbyid(R.id.button2); 
viewHolder.b3=(Button)convertView.findviewbyid(R.id.button23); 
      } 
      else{ 
       convertView = LayoutInflater.from(getContext()).inflate(R.layout.four_answers, null); 
viewHolder.t1=(TextView)convertView.findviewbyid(R.id.textview); 
viewHolder.b1=(Button)convertView.findviewbyid(R.id.button); 
viewHolder.b2=(Button)convertView.findviewbyid(R.id.button2); 
viewHolder.b3=(Button)convertView.findviewbyid(R.id.button3); 
viewHolder.b4=(Button)convertView.findviewbyid(R.id.button4); 
      } 



      convertView.setTag(viewHolder); 

     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

    //SET DATA ACCORDING TO LAYOUT 
     viewHolder.t1.setText(quizItem.getQuestion()); 
viewHolder.b1.setText(quizItem.getAnswer()); 
viewHolder.b2.setText(quizItem.getAnswer()); 
viewHolder.b3.setText(quizItem.getAnswer()); 
viewHolder.b4.setText(quizItem.getAnswer()); 


     return convertView; 
    }} 
+0

Danke das scheint legit zu mir und ich habe versucht, es zu implementieren, aber ich bekomme eine NullPointerException um viewHolder.t1 = (TextView) convertView.findviewbyid (R.id.textview); – Donko

+0

Buddy sollten Sie Ihre eigene ID anstelle von mir hier verwenden und überprüfen Sie auch quizItemType, bevor Sie die Daten auf diese Ansichten setzen viewHolder.t1 = (TextView) convertView.findviewbyid (R.id.textview); viewHolder.b1 = (Schaltfläche) convertView.findviewbyid (R.id.button); viewHolder.b2 = (Schaltfläche) convertView.findviewbyid (R.id.button2); viewHolder.b3 = (Schaltfläche) convertView.findviewbyid (R.id.button3); viewHolder.b4 = (Schaltfläche) convertView.findviewbyid (R.id.button4); –

+0

Keine Sorge, ich habe das gemacht, aber ich bekomme immer noch die NullPointerException! – Donko

0

Dies ist die aktualisierte CustomAdapter mit ViewHolder

public class CustomAdapter extends ArrayAdapter<QuizItem> { 
    private QuizItem[] items; 

    Context mContext; 

    public CustomAdapter(Context context, int resource, QuizItem[] objects) { 
     super(context, resource, objects); 
     mContext = context; 
     items = objects; 

    } 



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

     QuizItem quizItem = items[position]; 
     int quizItemType = quizItem.iNoOfAns; 
     LayoutInflater inflator = ((android.app.Activity) mContext) 
       .getLayoutInflater(); 
     ViewHolder holder = null; 


      if (quizItemType == 2) { 

       convertView = inflator.inflate(R.layout.temp_ans_two, parent,false); 

       holder = new ViewHolder(); 
       holder.textView = (TextView) convertView.findViewById(R.id.tv_ques); 
       holder.textView.setText(quizItem.strQues); 

       holder.button1 = (Button)convertView.findViewById(R.id.button1); 
       holder.button1.setText(quizItem.strAns1); 

       holder.button2 = (Button)convertView.findViewById(R.id.button2); 
       holder.button2.setText(quizItem.strAns2); 

       convertView.setTag(holder); 

      } else if (quizItemType ==3) { 

       convertView = inflator.inflate(R.layout.temp_ans_three, parent,false); 

       holder = new ViewHolder(); 
       holder.textView = (TextView) convertView.findViewById(R.id.tv_ques); 
       holder.textView.setText(quizItem.strQues); 

       holder.button1 = (Button)convertView.findViewById(R.id.button1); 
       holder.button1.setText(quizItem.strAns1); 

       holder.button2 = (Button)convertView.findViewById(R.id.button2); 
       holder.button2.setText(quizItem.strAns2); 

       holder.button3 = (Button)convertView.findViewById(R.id.button3); 
       holder.button3.setText(quizItem.strAns3); 

       convertView.setTag(holder); 
      } 
      else{ 
       convertView = inflator.inflate(R.layout.temp_ans_four, parent,false); 

       holder = new ViewHolder(); 
       holder.textView = (TextView) convertView.findViewById(R.id.tv_ques); 
       holder.textView.setText(quizItem.strQues); 

       holder.button1 = (Button)convertView.findViewById(R.id.button1); 
       holder.button1.setText(quizItem.strAns1); 

       holder.button2 = (Button)convertView.findViewById(R.id.button2); 
       holder.button2.setText(quizItem.strAns2); 

       holder.button3 = (Button)convertView.findViewById(R.id.button3); 
       holder.button3.setText(quizItem.strAns3); 

       holder.button4 = (Button)convertView.findViewById(R.id.button4); 
       holder.button4.setText(quizItem.strAns4); 

       convertView.setTag(holder); 
      } 


     return convertView; 
    } 


    static class ViewHolder { 
     TextView textView; 
     Button button1; 
     Button button2; 
     Button button3; 
     Button button4; 
    } 

}