【问题标题】:ViewPager offsets cursor positionViewPager 偏移光标位置
【发布时间】:2014-01-04 01:50:21
【问题描述】:

我的情况类似于这个ViewPager. Getting wrong cursor in SimpleCursorAdapter 和这个ViewPager Cursor positon 但问题没有 适用的答案。

情况

我正在从数据库(光标)加载视图页面中的视图。当我为项目(ButtonsTextViews 等)设置文本时,它会使用正确的光标(在预期位置)执行此操作。 但是当我尝试button.getText() 时,它会显示数据库中下一个位置的文本(与按钮等相同)。如果用户向前滑动,光标返回下一个位置的值,如果用户向后滑动,它返回上一个位置的值

所以在位置x 向前滑动会返回位置x + 1 的光标,向后滑动会返回位置x - 1 的光标。 我该如何解决这个问题?这是我的PagerAdapter.instantiateItem

    public Object instantiateItem(View view, int position) {

        cursor.moveToPosition(position);
        int cus = cursor.getPosition();
        Log.d(DBHelper.TAG, Integer.toString(cus) + " current cursor position ");

        final ViewPager pager = (ViewPager) view.findViewById(R.id.pager_nav);
        ScrollView layout = (ScrollView) inflater.inflate(R.layout.question_activity, null);

        if (cursorCategory != null && cursorCategory.moveToFirst()){
            String s = cursorCategory.getString(cursorCategory.getColumnIndex("name"));
            ((TextView)layout.findViewById(R.id.text_category)).setText(s);
        }

        Typeface tpf = Typeface.createFromAsset(context.getAssets(), "Roboto-Light.ttf");
        String text = cursor.getString(cursor.getColumnIndex("question_text"));
        TextView question_text =  (TextView)layout.findViewById(R.id.text_question);
        question_text.setText(text);
        Log.d("question_text", question_text.getText() + " " + position + " " + text);
        question_text.setTypeface(tpf);

        final String qPos = Integer.toString(position + 1) + ".";
        TextView question_position = (TextView) layout.findViewById(R.id.text_position);
        question_position.setText(qPos);
        question_position.setTypeface(tpf);

        this.rightAnswer = cursor.getString(cursor.getColumnIndex(DBHelper.RIGHT_ANSWER));
        this.wrongAnswer1 = cursor.getString(cursor.getColumnIndex(DBHelper.WRONG_ANSWER1));
        this.wrongAnswer2 = cursor.getString(cursor.getColumnIndex(DBHelper.WRONG_ANSWER2));

        optionsArray = new ArrayList<String>();
        optionsArray.clear();
        optionsArray.add(this.rightAnswer);
        optionsArray.add(this.wrongAnswer1);
        optionsArray.add(this.wrongAnswer2);
        Collections.shuffle(optionsArray);

        option1 = (Button) layout.findViewById(R.id.button_option1);
        option1.setText((CharSequence) this.optionsArray.get(0));

        option2 = (Button) layout.findViewById(R.id.button_option2);
        option2.setText((CharSequence) this.optionsArray.get(1));

        option3 = (Button) layout.findViewById(R.id.button_option3);
        option3.setText((CharSequence) this.optionsArray.get(2));

        if (this.optionsArray.get(0).equalsIgnoreCase(this.rightAnswer)) {
            this.option1.setTag(DBHelper.RIGHT_ANSWER);
        } else if (!this.rightAnswer.equalsIgnoreCase((String) this.optionsArray.get(0))) {
            this.option1.setTag("wrong");
        }

        if (this.rightAnswer.equalsIgnoreCase((String) this.optionsArray.get(1))) {
            this.option2.setTag(DBHelper.RIGHT_ANSWER);
        } else if (!this.rightAnswer.equalsIgnoreCase((String) this.optionsArray.get(1))) {
            this.option2.setTag("wrong");
        }

        if (this.rightAnswer.equalsIgnoreCase((String) this.optionsArray.get(2))) {
            this.option3.setTag(DBHelper.RIGHT_ANSWER);
        } else if (!this.rightAnswer.equalsIgnoreCase((String) this.optionsArray.get(2))){
            this.option3.setTag("wrong");
        }

        private int getItem(int i) {
            return i += pager.getCurrentItem();
        }
    });

    option1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            String Tag = option1.getTag().toString();
            Toast.makeText(context, Tag + " " + option1.getText(), Toast.LENGTH_SHORT).show();

        }
    });

    option2.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            String Tag = option2.getTag().toString();
            Toast.makeText(context, Tag + " " + option2.getText(), Toast.LENGTH_SHORT).show();

        }
    });

    option3.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            String Tag = option3.getTag().toString();
            Toast.makeText(context, Tag + " " + option3.getText(), Toast.LENGTH_SHORT).show();

        }
    });
}

还有我的 onLoadFinished()

    @Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {

    switch (loader.getId()) {
    case QUESTION_TEXT:
        Log.d(" Selection Position", " Selection Position" + selcectionPosition );
        Log.d(" Activity Position", cursor.getPosition() + " Activity Position");
        mAdapter.swapCursor(cursor);
        mAdapter.notifyDataSetChanged();
        pager.setCurrentItem(selcectionPosition, true);
        break;
    }
}

希望得到一些帮助。

【问题讨论】:

    标签: android android-viewpager android-cursor android-pageradapter


    【解决方案1】:

    免责声明:它可能无法解决您的问题。

    我遇到了同样的问题。 因此,在阅读了您所写的内容后,我四处寻找对我们有帮助的东西。

    我用这个解决了这个问题:How do you get the current page number of a ViewPager for Android?

    在我的项目中,我在每个页面上都有一个按钮,单击该按钮会触发一个对话框,然后该对话框将从光标的当前位置获取一个字符串。

    光标上的位置与当前显示的页面不匹配,因为 ViewPager 会更改光标的位置以获取数据以预加载页面。

    因此您需要强制光标移动到正确的位置,即您正在查看的位置。

    为此,您可以使用 cursor.moveToPosition(viewpager.getCurrentItem())。 确保光标跟随您正在查看的内容。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      • 2014-03-23
      • 2012-06-02
      • 2013-06-25
      相关资源
      最近更新 更多