Android 根据按钮状态多次膨胀视图 - 优化
Android inflate view multiple time depending on button state - optimisation
Whosebug 社区,我(再次)需要您的帮助!我创建了一个自定义 class 来快速创建 View 对象(基本上它只是一个显示的问题)。
例子:
Title : Home
Message : Are you living with a cat ?
[BtnYes] ------------------------ [BtnNo]
所以这是我的习惯 class "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. 你认为我们可以优化这个过程吗?
更新 2 : 我寻找了一个 QuestionHolder class,他接受了观点,不同的变量,并用 get/set 标签保存它。我走对路了吗?
更新 3:QuestionHolder 引用与 getTag 相同的视图...
更新 4: 显示的视图是这样的:case 1 : when I press YES YES YES but when I scroll up and press No at the question 1 it looks like that. 问题 3&4|5&6 被删除,让问题 2 出现。[for例如,我手动终止应用程序并重新加载它... :(]
更新 5 : 我用适配器创建了一个 ListView,但它比我想象的要难......所以我可能会放弃并执行它“肮脏的方式"
创建class代表问题的项目:
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();
}
希望对您有所帮助)
Whosebug 社区,我(再次)需要您的帮助!我创建了一个自定义 class 来快速创建 View 对象(基本上它只是一个显示的问题)。 例子:
Title : Home
Message : Are you living with a cat ?
[BtnYes] ------------------------ [BtnNo]
所以这是我的习惯 class "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. 你认为我们可以优化这个过程吗?
更新 2 : 我寻找了一个 QuestionHolder class,他接受了观点,不同的变量,并用 get/set 标签保存它。我走对路了吗?
更新 3:QuestionHolder 引用与 getTag 相同的视图...
更新 4: 显示的视图是这样的:case 1 : when I press YES YES YES but when I scroll up and press No at the question 1 it looks like that. 问题 3&4|5&6 被删除,让问题 2 出现。[for例如,我手动终止应用程序并重新加载它... :(]
更新 5 : 我用适配器创建了一个 ListView,但它比我想象的要难......所以我可能会放弃并执行它“肮脏的方式"
创建class代表问题的项目:
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();
}
希望对您有所帮助)