2015-11-04 67 views
-1

StackOverflow社区,我需要你的帮助(再次)!我创建了一个自定义类来快速创建View对象(基本上它只是一个显示的问题)。 例:Android充气视图多次取决于按钮状态 - 优化

标题:Home

消息:是否有猫住在一起?

[BtnYes] ------------------------ [BtnNo]

因此,这里是我的自定义类 “QuestionHelper” 来编程创建问题:

public List<LinearLayout> addQuestion(ViewGroup rootView, String title, String message, int id) { 
     List<LinearLayout> mButtons = new ArrayList<>(); 

     // Inflate une question 
     LayoutInflater questionInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     RelativeLayout myQuestion = (RelativeLayout) questionInflater.inflate(R.layout.activity_formulaire_question, rootView, false); 

     // Assigne la vue au controlleur 
     tvTitle = (TextView) myQuestion.findViewById(R.id.activity_formulaire_question_title); 
     tvMessage = (TextView) myQuestion.findViewById(R.id.activity_formulaire_question_message); 

     // Remplissage des champs textes 
     tvTitle.setText(title); 
     tvMessage.setText(message); 

     // Boutton sous la forme de LinearLayout 
     btnNo = (LinearLayout) myQuestion.findViewById(R.id.activity_formulaire_question_ll_btn_no); 
     btnYes = (LinearLayout) myQuestion.findViewById(R.id.activity_formulaire_question_ll_btn_yes); 

     // Ajout dans la liste 
     mButtons.add(btnNo); 
     mButtons.add(btnYes); 

     return mButtons; 
    } 

这是,我认为,编程的坏的方式(因为我不尊重MVC模式,按钮状态由视图片段管理,有很多线路)。

final LinearLayout rootQuestion = (LinearLayout) rootView.findViewById(R.id.activity_formulaire_questions_preliminaires_ll_wrapper); 
     final QuestionHelper questionHelper = new QuestionHelper(super.getActivity()); 

     List<LinearLayout> question1 = questionHelper.addQuestion(rootQuestion, 
       getResources().getString(R.string.question_preliminaire_1_title), 
       getResources().getString(R.string.question_preliminaire_1_message), 1); 

     question1.get(0).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       List<LinearLayout> question2 = questionHelper.addQuestion(rootQuestion, 
         getResources().getString(R.string.question_preliminaire_2_title), 
         getResources().getString(R.string.question_preliminaire_2_message), 2); 
      } 
     }); 
     question1.get(1).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       List<LinearLayout> question3 = questionHelper.addQuestion(rootQuestion, 
         getResources().getString(R.string.question_preliminaire_3_title), 
         getResources().getString(R.string.question_preliminaire_3_message), 3); 

       question3.get(0).setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         List<LinearLayout> question4 = questionHelper.addQuestion(rootQuestion, 
           getResources().getString(R.string.question_preliminaire_4_title), 
           getResources().getString(R.string.question_preliminaire_4_message), 4); 

         question4.get(0).setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
           List<LinearLayout> question6 = questionHelper.addQuestion(rootQuestion, 
             getResources().getString(R.string.question_preliminaire_6_title), 
             getResources().getString(R.string.question_preliminaire_6_message), 6); 
          } 
         }); 
        } 
       }); 
       question3.get(1).setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         List<LinearLayout> question5 = questionHelper.addQuestion(rootQuestion, 
           getResources().getString(R.string.question_preliminaire_5_title), 
           getResources().getString(R.string.question_preliminaire_5_message), 5); 

         question5.get(1).setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
           List<LinearLayout> question6 = questionHelper.addQuestion(rootQuestion, 
             getResources().getString(R.string.question_preliminaire_6_title), 
             getResources().getString(R.string.question_preliminaire_6_message), 6); 
          } 
         }); 
        } 
       }); 
      } 
     }); 

我可以根据先前的问题有多达8个问题。

更新:To explain clearly what I mean, here is an image.您认为我们可以优化这个过程吗?

UPDATE 2:我找了一个QuestionHolder类,它接受view,differents变量,并用get/set标签保存它。我以正确的方式吗?

更新3: QuestionHolder指与getTag相同的观点......

UPDATE 4:显示的看法是这样的:case 1 : when I press YES YES YES但是当我上下滚动按否的问题1it looks like that.问题3 & 4 | 5 & 6被去除,并且让显示问题2 为为例,我手动终止应用程序并重新装载它... :(]

更新5:我创建了一个适配器一个ListView,但它比我想象的更难。所以我可能会放弃,做它的“肮脏的方式

+0

图像清楚地说明你想实现什么,但有了解的问题IM什么阻止你这样做的问题。 – Nanoc

+0

这是为了优化的目的。我可以这样做,但是我觉得它不够雅致,而且在问题太多时不可读。我正在考虑用'switch(button.getId)'创建一个'setButtonState(boolean choice)'方法来标识**选择了哪个按钮**,然后动态删除或添加下一个问题,但是我没有目前还没有设法实现它:) **目标是用MVC模式编写最清晰的代码** – Nawako

+0

那么,你可以创建一个视图来显示你的问题和按钮,以及一个模型类来存储每个问题,然后我将使用startActivityForResult()来显示问题并获得单击的按钮作为返回值,这样您就可以将视图与模型分开(MVC),并可以在分开的活动中管理下一个问题的逻辑 – Nanoc

回答

1

创建类代表什么提问项目:

public class Node{ 
    private long id; 
    private String question; 
    private String title; 
    private long yesId; 
    private long noId; 

    //Constructor, getter here.... 
} 

您需要带有问题列表的适配器。

ArrayList<Node> questions = new ArrayList<>(); 
NodeAdapter adapter = new NodeAdapter(questions, ...); 

当你按下按钮获得通过回答下一个节点ID(getYesId/getNoId)。如果最后一项通过ID创建新的或者如果没有检查下一个ID是否与新的下一个ID相同。

//Create interface in your adapter or do what you want, but like this 

public void onNodeClicked(long nextId, int currentPosition){ 
    Node next; 
    if(currentPosition == questions.size() - 1){ 
     next = getNodeById(nextId); 
     question.add(next); 
    }else{ 
     next = questions.get(position + 1); 
     if(nextId != next.getId()){ 
      ArrayList<Node> remove = new ArrayList<>(); 
      remove.addAll(position + 1, questions); 
      questions.removeAll(remove); 
      next = getNodeById(nextId); 
      question.add(next); 
     } 
    } 
    adapter.notifyDataSetChanged(); 
} 

我希望它可以帮助你)

+0

如果我有一个适配器,我应该有一个** ListView **,对吧?所以,适配器首先填充所有问题?我试图这样做。感谢您的亲切帮助:) – Nawako