如何动态创建列表适配器的视图,列表视图的每个项目都有另一组列表项?

时间:2016-01-22 20:32:17

标签: android

我有一个列表视图的适配器,显示问题列表。每个问题都有答案选项,可选中复选框或单选按钮,也可选择带图像和答案选项。答案选项的数量因问题类型而异,例如,1个问题可能有2个单选按钮答案选项,而另一些问题可能有4个复选框答案选项以及图像视图。一个问题不能同时具有复选框和单选按钮作为答案选项。

如何实施此类要求?我是否需要在问题中使用嵌套的适配器和问题中的另一个适配器?我能够通过动态和编程方式在适配器的getView()内创建视图来实现我的问题答案。但事实是,我无法为每个答案选项重用已创建的答案选项视图。它总是为每个选项创建答案视图,这需要花费大量时间来向用户呈现和显示数据。

如果我的方法正确,如何优化我的解决方案? 谢谢。

一些代码片段如下所示:

  1. 内部getView()方法:
  2. // optionsList包含每个问题的答案选项。所以我循环创建每个视图。

    for (int opt = 0; opt < optionsList.size(); opt++) {
        addOptionsView(opt, optionsList.get(opt), position);
    }
    //The above for loop will be for each question
    
    1. 在addOptionsView()方法中:
    2. (在一行中,我有两个水平线性布局,一个用于答案图像和答案文本,第二个用于CheckBox或RadioButton):

      //Each answer option
      final LinearLayout optionRow = new LinearLayout(getContext());//Parent
      
      //For image or answer text
      final LinearLayout imageOrText = new LinearLayout(getContext());//Child1
      
      //For radio or checkbox
      final LinearLayout radioOrCheckbox = new LinearLayout(getContext());//Child2
      
      //add image when option has an image
      if (mData.get(questionNo).getOptionImages().size() > 0) {
      //create ImageView here
          imageOrText.addView(optionImage);
      }
      TextView mOptionName = new TextView(getContext());
      mOptionName.setText(optionName);//Here create answer option and set the text on it.
      imageOrText.addView(mOptionName);
      optionRow.addView(imageOrText);
      
      radioOrCheckbox.addView(optionCheckType);//Check type is either CheckBox or RadioButton
      optionRow.addView(radioOrCheckbox); // Finally add above two layout in parent view.
      
      //something more like this
      viewHolder.txtQuestion.setText(mData.get(position).getQuestion());
      //Here view holder class
      private class ViewHolder {
      
      TextView txtQuestion;
      LinearLayout llQuestionLayout;
      
      public ViewHolder(View view) {
          txtQuestion = (TextView) view.findViewById(R.id.questionValue);
          llQuestionLayout = (LinearLayout)view.findViewById(R.id.questionLayout);
          }
      }
      

      注意:    在上面的代码片段中没有重复使用每个答案选项视图的代码,因此,在为每个答案选项动态创建答案视图时,渲染数据需要时间。

1 个答案:

答案 0 :(得分:0)

您可以对两个列表使用Recyclerview。为每个recyclerviews创建一个适配器。单个回收站视图将处理视图的可重用性。 我找到了一篇文章,可以方便你获得这个概念 https://dannysu.com/2015/10/11/list-in-list-in-list/。嵌套回收器视图是避免在ui层上使用内存的更好方法,因为它处理视图的创建。