Android根据按钮状态多次膨胀视图-优化



StackOverflow社区,我需要你的帮助(再次)!我创建了一个自定义类来快速创建View对象(基本上只是显示一个问题)。示例:

标题:主页

留言:你和猫住在一起吗?

[BtnYes]-------------------------[Btno]

因此,这里是我的自定义类"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个问题,具体取决于前一个问题。

更新:为了清楚地解释我的意思,这里有一张图片你认为我们可以优化这个过程吗

UPDATE 2:我找了一个QuestionHolder类,它接受视图、differents变量,并用get/set标记保存它。我走的路对吗?

更新3:QuestionHolder引用了与getTag相同的视图。。。

更新4:显示的视图是这样的:情况1:当我按YES YES是,但当我向上滚动并在问题1处按No时,它看起来是这样的。问题3&4|5&6被删除,并出现问题2。例如,我手动终止应用程序并重新加载它…:(]

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

创建表示问题项的类:

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

按下按钮时,通过回答(getYesId/getNoId)获取下一个节点id。如果是最后一个项目,则按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();
}

我希望它能帮助你)

最新更新