You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在继承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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:23:57