1

我有类似于此ViewPager. Getting wrong cursor in SimpleCursorAdapter和此ViewPager Cursor positon的情况,但问题没有 适用答案。ViewPager偏移光标位置

形势

我加载在我viewpager意见从数据库(光标)。当我为这些项目设置文本(Buttons,TextViews等)时,它使用正确的光标(在预期位置)执行此操作。 但是当我尝试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; 
    } 
} 

希望能得到一些帮助。

回答

1

免责声明:这也许不是解决你的问题。

我面临同样的问题。 所以读完你写的内容后,我四处搜寻了一些能帮助我们的东西。

我解决它通过使用这样的:How do you get the current page number of a ViewPager for Android?

我的项目,我必须在每一页上的按钮时,在点击会触发一个对话框,那么该对话框会从当前光标位置得到一个字符串。

上的光标没有当前页面匹配的位置处显示,因为,ViewPager改变光标的位置来获得数据预加载页面。

所以,你需要强制将光标移动到正确的位置,你正在浏览的一个。

要做到这一点,您可以使用cursor.moveToPosition(viewpager.getCurrentItem())。 确保光标跟随您正在查看的内容。

我希望这可以帮助你。