2014-10-28 137 views
1

你好,我这期运用代码为什么查询被调用两次?

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; 
} 

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

更新

我现在知道一个事实,我的错误是由查询所引起的叫了两声。在第一次打电话时,我的订单是按字符串排列的,但第二次是空的,这使我的清单无序且无限。

我的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); 
      } 
     } 
    }); 
+0

凡该活动是被调用的方法?如果它在列表视图上,那么它很可能被调用两次。 – 2014-10-28 19:34:00

+0

在活动的onCreate中正在调用第一位代码。尽管用户从其他活动的listView中选择活动正在开始。 – Noob 2014-10-28 19:39:42

+0

你可以在列表适配器中粘贴你的getView方法吗? – 2014-10-28 19:51:21

回答

2

由于列表视图铺设了两次,一次没有高度,并再次后的高度已定(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; 
} 
+0

我相信我很想知道你以前的意思是我的getView。我的任何活动都没有getView。而且它们都扩展了具有super.getView()的listActivity。然而,这听起来像你是正确的,为什么发生这种情况。那么有没有其他方法可以解决这个问题而不需要重写这个方法? – Noob 2014-10-28 20:09:13

+1

我会扩展SimpleCursorAdapter并覆盖getView – 2014-10-28 21:01:01

相关问题