如何在继承PagerAdapter的ViewPager中保存EditText值到数组/ArrayList
解决ViewPager中收集所有EditText输入值的问题
我来帮你搞定这个收集所有页面输入内容的问题,核心思路是实时保存每个页面的输入内容(比提交时临时遍历更可靠),下面是具体的代码修改步骤:
第一步:改造ViewPagerAdapter,添加实时存储和回调逻辑
我们需要给Adapter加一个和问题列表一一对应的答案存储列表,再给每个EditText加文本监听,实时更新输入内容;同时通过接口回调把最终的答案传递给Activity。
修改后的ViewPagerAdapter代码:
public class ViewPagerAdapter extends PagerAdapter { private Context context; LayoutInflater inflater; Button submitButton; private ArrayList<String> questions; // 新增:存储所有答案的列表,和问题位置一一对应 private ArrayList<String> answers = new ArrayList<>(); // 新增:回调接口,用来把答案传递给Activity public interface OnAnswersSubmittedListener { void onAnswersSubmitted(ArrayList<String> answers); } private OnAnswersSubmittedListener submissionListener; public ViewPagerAdapter(Context context, ArrayList<String> questions) { this.context = context; this.questions = questions; // 初始化答案列表,每个位置默认是空字符串 for (int i = 0; i < questions.size(); i++) { answers.add(""); } } // 新增:设置回调监听器的方法 public void setOnAnswersSubmittedListener(OnAnswersSubmittedListener listener) { this.submissionListener = listener; } @Override public int getCount() { return questions.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { TextView txtQuestion; EditText enteredAnswer; inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View itemView = inflater.inflate(R.layout.viewpager_item, container,false); txtQuestion = itemView.findViewById(R.id.question); txtQuestion.setText(questions.get(position)); submitButton = itemView.findViewById(R.id.submit_btn); enteredAnswer = itemView.findViewById(R.id.answer_textbox); // 恢复当前位置之前输入的内容(避免滑动丢失) enteredAnswer.setText(answers.get(position)); // 新增:监听EditText文本变化,实时更新答案列表 enteredAnswer.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) {} @Override public void afterTextChanged(Editable s) { // 更新对应位置的答案 answers.set(position, s.toString().trim()); } }); if(position == (questions.size()-1)){ submitButton.setVisibility(View.VISIBLE); } else { submitButton.setVisibility(View.GONE); } submitButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 通过回调把答案传递给Activity if (submissionListener != null) { submissionListener.onAnswersSubmitted(answers); } // 也可以直接在这里打印日志查看结果 for (int i = 0; i < answers.size(); i++) { Log.i("答案 " + (i+1), answers.get(i)); } } }); container.addView(itemView); return itemView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { // 修复强转问题,直接转成View即可 container.removeView((View) object); } }
第二步:在Activity中设置回调,接收最终答案
修改你的SwipeQuestions Activity,给Adapter设置监听器,这样提交按钮点击后就能在Activity里拿到所有答案:
public class SwipeQuestions extends AppCompatActivity { ViewPager viewPager; PagerAdapter adapter; ArrayList<String> questions = new ArrayList<>(); // 这里假设你已经从JSON解析填充了questions列表 // 示例:questions.add("问题1"); questions.add("问题2"); ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_swipe_questions); viewPager = findViewById(R.id.pager); viewPager.setOffscreenPageLimit(10); adapter = new ViewPagerAdapter(SwipeQuestions.this, questions); // 设置回调监听器,接收提交的答案 ((ViewPagerAdapter) adapter).setOnAnswersSubmittedListener(new ViewPagerAdapter.OnAnswersSubmittedListener() { @Override public void onAnswersSubmitted(ArrayList<String> answers) { // 在这里处理答案,比如保存到本地、上传服务器等 for (int i = 0; i < answers.size(); i++) { Log.i("Activity收到答案 " + (i+1), answers.get(i)); } } }); viewPager.setAdapter(adapter); } }
额外优化:调整布局体验
你的viewpager_item.xml里,TextView设置了android:layout_alignParentBottom="true",会让问题文本在屏幕底部,用户体验不太好,建议修改为:
<TextView android:id="@+id/question" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignStart="@+id/answer_textbox" android:text="Question" android:layout_marginBottom="16dp"/> <EditText android:id="@+id/answer_textbox" style="@android:style/Widget.DeviceDefault.EditText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/question" android:ems="10" android:fontFamily="casual" android:inputType="textMultiLine|textImeMultiLine" android:singleLine="false" />
这样问题会显示在EditText上方,更符合用户的阅读输入习惯。
内容的提问来源于stack exchange,提问作者HellRaizzer
相关产品推荐
相关产品推荐

