【问题标题】:Why is query being called twice?为什么查询被调用两次?
【发布时间】:2014-12-24 08:43:18
【问题描述】:

您好,我正在使用此代码

    Cursor mCursor = this.getContentResolver().query(PlayerContentProviderDB.CONTENT_URI, PLAYERS_PROJECTION, null, null, Players.SCORE + " ASC" + " LIMIT 2");
    this.adapter = new SimpleCursorAdapter(this, R.layout.high_score, mCursor, dataColumns, viewIDs, 0);
    setListAdapter(adapter);

_

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    // System.out.println(sortOrder);
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    checkColumns(projection);
    queryBuilder.setTables(PlayerContract.Players.PLAYERS_TABLE_NAME);
    int uriType = sURIMatcher.match(uri);
    
    switch (uriType) {
    case ALL_SCORES:
        break;
    case SCORE_ID:
        queryBuilder.appendWhere(PlayerContract.Players.ID + "=" + uri.getLastPathSegment());
        break;
    default:
        throw new IllegalArgumentException("Unknown URI: " + uri);
    }
    
    SQLiteDatabase db = this.dbHelper.getReadableDatabase();
    Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder);
    System.out.println(uri.toString() + " " + projection[0] + " " + projection[1] + " " + projection[2] + " " + projection[3] + " " + selection + " " + sortOrder);
    // Notify potential listeners
    cursor.setNotificationUri(getContext().getContentResolver(), uri);
    return cursor;
}

尝试对数据库进行排序和限制返回,但它不起作用。通过插入诊断打印语句,我注意到在调用上述代码后立即调用了我的内容提供程序的查询方法。我认为这可能与我错误的根源有关。所以我的问题是为什么我的查询方法被调用了两次?

更新

我现在知道我的错误是由两次调用查询引起的。在第一次调用时,我的按字符串排序是正确的,但在第二次调用时它为 null,这使我的列表未排序且不受限制。

链接到新活动的我的 ListView

    setListAdapter(new ArrayAdapter<String>(this, R.layout.puzzle_selector, options));

    ListView list = this.getListView();
    list.setTextFilterEnabled(true);
    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if (!((TextView) view).getText().toString().equalsIgnoreCase("HighScore")) {
                String selectionString[] = ((TextView) view).getText().toString().split(" ");
                String puzzleNumber = selectionString[1];
                System.out.println("puzzleNumber is " + puzzleNumber);

                SharedPreferences prefs = getSharedPreferences(getString(R.string.currentSave), MODE_PRIVATE);
                SharedPreferences.Editor editor = prefs.edit();
                editor.putString("selectedNumber", puzzleNumber);
                editor.commit();

                Intent passPuzzleNumberIntent = new Intent(PuzzleSelector.this, MainActivity.class);
                passPuzzleNumberIntent.putExtra("puzzleNumber", puzzleNumber);
                startActivity(passPuzzleNumberIntent);
            } else {
                Intent lookAtScoresIntent = new Intent(PuzzleSelector.this, HighScores.class);
                startActivity(lookAtScoresIntent);
            }
        }
    });

【问题讨论】:

  • 方法在活动中的哪个位置被调用?如果它在列表视图中,那么它很可能被调用了两次。
  • 第 1 位代码在活动的 onCreate 中被调用。尽管该活动是通过用户从另一个活动的列表视图中选择来启动的。
  • 你能在列表适配器中粘贴你的getView方法吗?

标签: android sqlite sorting simplecursoradapter android-cursor


【解决方案1】:

由于列表视图布局了两次,一次没有高度,一次在设置高度后(在 Android 中很常见),getView 在与适配器关联的列表上被调用两次。为确保您不会在列表视图中多次布置个人视图,请检查该视图是否为空,如果是,则在方法 getView 中将其布置为:

public View getView(int position, View convertView, ViewGroup parent) {
    super.getView(position, convertView, parent);

    if (convertView == null) {
        // do custom layout of view with data from cursor
    }

    return convertView;
}

【讨论】:

  • 我相信我之前错过了理解你的意思我的 getView 。我的任何一项活动都没有 getView 。此外,它们都扩展了 listActivity,它确实有一个 super.getView()。但是,听起来您可能是正确的,为什么会发生这种情况。那么有没有其他方法可以在不覆盖方法的情况下解决这个问题?
  • 我会扩展 SimpleCursorAdapter 并覆盖 getView
猜你喜欢
  • 2021-07-13
  • 2021-11-25
  • 2015-12-24
  • 2012-12-10
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多