6

저는 커서로드로 커서를 채우고 컨텐츠 공급자를 사용하여 listView를 채 웁니다. 예를 들어 가장 최근 항목이 listView 맨 위에 추가되도록 정렬되도록 listView를 정렬하려고합니다. listView는 항상 동일한 순서로 나타나며이 순서를 변경할 수 없습니다.정렬 순서가 listView 및 커서 로더와 작동하지 않습니다.

정렬 순서를 사용하여 변경했는데 listView에 설정된 것과 상관없이 항상 같은 위치에 항목이 표시됩니다. 이와 같은 정렬 순서를 사용하여

CursorLoader loader = new CursorLoader 
    (List.this, Database.CONTENT_URI, projection, 
    null, null, LocationsTable.TIME_STAMP + " ASC"); 

나는 TIME_STAMP 외에 다른 열을 기준으로 정렬하려고했지만 결과는 항상 동일합니다. 목록의 항목 순서가 변경되지 않습니다. 심지어 ASC를 DESC로 변경해도 아무런 효과가 없습니다.

cursorAdapter로 채워진 listView에 표시되는 항목의 순서 나 위치는 어떻게 설정합니까? LoaderCallbacks<Cursor>

 @Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     String projection[] = new String[]{LocationsTable._ID, 
     LocationsTable.LATITUDE, LocationsTable.LONGITUDE, 
    LocationsTable.LAND_ADDRESS, LocationsTable.LAST_NAME, 
     LocationsTable.FIRST_NAME, LocationsTable.LOCATION_IMAGE, 
    LocationsTable.TIME_STAMP }; 

    CursorLoader loader = new CursorLoader 
    (List.this, Database.CONTENT_URI, projection, null, null, 
    LocationsTable.TIME_STAMP + " ASC"); 
    return loader; 
} // onCreateLoader 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
    adapter.swapCursor(cursor); 
} // onLoadFinished 

@Override 
public void onLoaderReset(Loader<Cursor> arg0) { 
    adapter.swapCursor(null); 
} // onLoaderReset 

이의

에서 onCreate 메서드에서 목록보기 클래스

에서 좀 더 코드 샘플

adapter = new ViewAdapter(this, null, 0); 

// sets array adapter to listview 
listViewOne.setAdapter(adapter); 

getLoaderManager().initLoader(LOADER_ID_ONE, null, this); 

세 콜백 방법은에서 테이블을 만드는 데 사용되는 문자열입니다 데이터베이스 확장 ContentProvider

084,893,210 여기에 커서 어댑터 클래스

public class ViewAdapter extends CursorAdapter { 

LayoutInflater inflater; 
    LatAndLngString latAndLng; 

public ViewAdapter(Context context, Cursor cursor, int b) { 
    super(context, cursor, b); 

    inflater = LayoutInflater.from(context); 
} // ViewAdapter constructor  

@Override 
public void bindView(View view, final Context context, Cursor cursor) { 

    TextView textViewOne = (TextView) view.findViewById(R.id.textView1); // address 
    TextView textViewTwo = (TextView) view.findViewById(R.id.textView2); // last name 
    TextView textViewThree = (TextView) view.findViewById(R.id.textView3); // first name 
    final Button buttonOne = (Button) view.findViewById(R.id.button1); 
    final ImageView imageViewOne = (ImageView) view.findViewById(R.id.imageView1); 
    final ImageView imageViewTwo = (ImageView) view.findViewById(R.id.imageView2); 
    textViewOne.setText(cursor.getString(cursor.getColumnIndex(LocationsTable.LAND_ADDRESS))); 
    textViewTwo.setText(cursor.getString(cursor.getColumnIndex(LocationsTable.LAST_NAME))); 
    textViewThree.setText(cursor.getString(cursor.getColumnIndex(LocationsTable.FIRST_NAME))); 
    String latitude = cursor.getString(cursor.getColumnIndex(LocationsTable.LATITUDE)); 
    String longitude = cursor.getString(cursor.getColumnIndex(LocationsTable.LONGITUDE)); 
    String imagePath = cursor.getString(cursor.getColumnIndex(LocationsTable.LOCATION_IMAGE)); 
    long timeStampImage = cursor.getLong(cursor.getColumnIndex(LocationsTable.TIME_STAMP)); 

    if(imagePath != null){ 

     int widthInDP = (int)  TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 80, getResources().getDisplayMetrics()); 
     int heightInDP = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics()); 
     Bitmap sizedBitmap = ImageUtil.createReducedBitmap(imagePath, widthInDP, heightInDP); 
     imageViewTwo.setImageBitmap(sizedBitmap); 
    } 

     textViewOne.setMaxLines(1); 
     textViewTwo.setMaxLines(2); 
     textViewThree.setMaxLines(3); 

    final LatAndLngString latAndLng = new LatAndLngString(latitude, longitude); 

    buttonOne.setTag(latAndLng); 
    imageViewOne.setTag(latAndLng); 
    imageViewTwo.setTag(latAndLng); 

    // go to register page to edit fields 
    buttonOne.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View view, MotionEvent event) { 

        if (event.getAction() == MotionEvent.ACTION_DOWN) { 

          ((Button) view).setAlpha(0.3f); 

          LatAndLngString latAndLngRow = (LatAndLngString) buttonOne.getTag(); 

          Intent intent = new Intent(List.this, Register.class);              
          intent.putExtra("latitude", String.valueOf(latAndLngRow.latitude)); 
          intent.putExtra("longitude", String.valueOf(latAndLngRow.longitude)); 
          intent.putExtra("origin", 1); 
          intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
          List.this.startActivity(intent); 

          return true; 
         } else if (event.getAction() == MotionEvent.ACTION_UP) { 

          ((Button) view).setAlpha(1.0f); 

          return true; 

         } 
         return false; 
      }     
     });   

    // go to map page to display map 
    imageViewOne.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View view, MotionEvent event) {    

        if (event.getAction() == MotionEvent.ACTION_DOWN) { 

          ((ImageView) view).setAlpha(0.3f); 

LatAndLngString latAndLngRow = (LatAndLngString) buttonOne.getTag(); 

          Intent intent = new Intent(List.this, Map.class); 
          intent.putExtra("latitude", String.valueOf(latAndLngRow.latitude)); 
          intent.putExtra("longitude", String.valueOf(latAndLngRow.longitude)); 
          intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
          intent.putExtra("showMarker", true); 

          List.this.startActivity(intent); 

          return true; 
         } else if (event.getAction() == MotionEvent.ACTION_UP) { 

          ((ImageView) view).setAlpha(1.0f); 

          return true; 

         } 
         return false; 
      } 
     }); 

    // set image for button 
      imageViewTwo.setOnTouchListener(new OnTouchListener() { 

        @Override 
        public boolean onTouch(View view, MotionEvent event) { 

          if (event.getAction() == MotionEvent.ACTION_DOWN) { 

            ((ImageView) view).setAlpha(0.3f); 

            LatAndLngString latAndLngRow = (LatAndLngString) view.getTag(); 

            Intent intent = new Intent(List.this, ImageSelector.class);               
            intent.putExtra("latitude", String.valueOf(latAndLngRow.latitude)); 
            intent.putExtra("longitude", String.valueOf(latAndLngRow.longitude)); 
            List.this.startActivity(intent); 

            return true; 
           } else if (event.getAction() == MotionEvent.ACTION_UP) { 

            ((ImageView) view).setAlpha(1.0f); 

            return true; 

           } 
           return false; 
        }     
       });  

} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 

    return inflater.inflate(R.layout.listview_row, parent, false); 

} 

} 

콘텐츠 프로 바이더 클래스 전체 코드

// application package name 

// import statements 

public class Database extends ContentProvider { 

private static final UriMatcher sUriMatcher; 

private static final int LOCATIONS_ALL = 1; 
private static final int LOCATIONS_ONE = 2; 

public static final String AUTHORITY = "com.xxx.realestatelocator.Locations"; 
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/locations"); 

public static final String DATABASE_NAME = "locations.db"; 
public static final int DATABASE_VERSION = 1; 

public static final String CONTENT_TYPE_NOTES_ALL = "vnd.android.cursor.dir/vnd.realestate.locations"; 
public static final String CONTENT_TYPE_NOTES_ONE = "vnd.android.cursor.item/vnd.realestate.locations"; 

static { 
     sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 
     sUriMatcher.addURI(AUTHORITY, "locations", LOCATIONS_ALL); 
     sUriMatcher.addURI(AUTHORITY, "locations/#", LOCATIONS_ONE); 
     } 

// Map table columns 
    private static final HashMap<String, String> sNotesColumnProjectionMap; 

    private DatabaseHelper mDbHelper; 

    static { 
     sNotesColumnProjectionMap = new HashMap<String, String>(); 
     sNotesColumnProjectionMap.put(LocationsTable._ID, LocationsTable._ID); 
     sNotesColumnProjectionMap.put(LocationsTable.LATITUDE, LocationsTable.LATITUDE); 
     sNotesColumnProjectionMap.put(LocationsTable.LONGITUDE, LocationsTable.LONGITUDE); 
     sNotesColumnProjectionMap.put(LocationsTable.LAND_ADDRESS, LocationsTable.LAND_ADDRESS); 
     sNotesColumnProjectionMap.put(LocationsTable.LAST_NAME, LocationsTable.LAST_NAME); 
     sNotesColumnProjectionMap.put(LocationsTable.FIRST_NAME, LocationsTable.FIRST_NAME); 
     sNotesColumnProjectionMap.put(LocationsTable.LAST_NAME_ALT, LocationsTable.LAST_NAME_ALT); 
     sNotesColumnProjectionMap.put(LocationsTable.FIRST_NAME_ALT, LocationsTable.FIRST_NAME_ALT); 
     sNotesColumnProjectionMap.put(LocationsTable.CONTACT_ADDRESS, LocationsTable.CONTACT_ADDRESS); 
     sNotesColumnProjectionMap.put(LocationsTable.PHONE_NUMBER, LocationsTable.PHONE_NUMBER); 
     sNotesColumnProjectionMap.put(LocationsTable.MOBILE_NUMBER, LocationsTable.MOBILE_NUMBER); 
     sNotesColumnProjectionMap.put(LocationsTable.EMAIL, LocationsTable.EMAIL); 
     sNotesColumnProjectionMap.put(LocationsTable.LOCATION_IMAGE, LocationsTable.LOCATION_IMAGE); 
     sNotesColumnProjectionMap.put(LocationsTable.TIME_STAMP_IMAGE, LocationsTable.TIME_STAMP_IMAGE); 
     sNotesColumnProjectionMap.put(LocationsTable.TIME_STAMP, LocationsTable.TIME_STAMP); 

     } 

public class LocationsTable implements BaseColumns { 

public static final String TABLE_NAME = "tbl_locations"; 
public static final String _ID = "_id"; 
public static final String LATITUDE = "latitude"; 
public static final String LONGITUDE = "longitude"; 
public static final String LAND_ADDRESS = "land_address"; 
public static final String LAST_NAME = "last_name"; 
public static final String FIRST_NAME = "first_name"; 
public static final String LAST_NAME_ALT = "last_name_alt"; 
    public static final String FIRST_NAME_ALT = "first_name_alt"; 
public static final String CONTACT_ADDRESS = "contact_address"; 
public static final String PHONE_NUMBER = "phone_number"; 
public static final String MOBILE_NUMBER = "mobile_number"; 
public static final String EMAIL = "email_address"; 
public static final String LOCATION_IMAGE = "location_image"; 
public static final String TIME_STAMP_IMAGE = "time_stamp_image"; 
public static final String TIME_STAMP = "time_stamp"; 

} // LocationsTable inner class 

private static class DatabaseHelper extends SQLiteOpenHelper { 

public DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

private static final String SQL_QUERY_CREATE = "CREATE TABLE " 
+ LocationsTable.TABLE_NAME + " (" + LocationsTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + LocationsTable.LATITUDE + " TEXT NOT NULL, " 
+ LocationsTable.LONGITUDE + " TEXT NOT NULL, " + LocationsTable.LAND_ADDRESS + " TEXT, " + LocationsTable.LAST_NAME + " TEXT, " 
+ LocationsTable.FIRST_NAME + " TEXT, " + LocationsTable.LAST_NAME_ALT + " TEXT, " + LocationsTable.FIRST_NAME_ALT + " TEXT, " 
+ LocationsTable.CONTACT_ADDRESS + " TEXT, " + LocationsTable.PHONE_NUMBER + " TEXT, " + LocationsTable.MOBILE_NUMBER + " TEXT, " 
+ LocationsTable.EMAIL + " TEXT, " + LocationsTable.LOCATION_IMAGE + " TEXT, " + LocationsTable.TIME_STAMP_IMAGE + " INTEGER, " 
+ LocationsTable.TIME_STAMP + " INTEGER " + ");"; 

private static final String SQL_QUERY_DROP = "DROP TABLE IF EXISTS " + LocationsTable.TABLE_NAME + ";"; 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(SQL_QUERY_CREATE); 
} // onCreate 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVer, int newVer) { 
    db.execSQL(SQL_QUERY_DROP); 
    onCreate(db); 
} // onUpgrade 

} // DatabaseHelper inner class 

@Override 
public boolean onCreate() { 
    if(mDbHelper == null) { 
    mDbHelper = new DatabaseHelper(getContext()); 
    } 
    return false; 
} 

@Override 
    public String getType(Uri arg0) { 
    return null; 
} // getType 

// insert one new row, full row 
@Override 
public Uri insert(Uri uri, ContentValues values) { 
    if (sUriMatcher.match(uri) != LOCATIONS_ALL) { 
     throw new IllegalArgumentException(" Unknown URI: " + uri); 
} 

SQLiteDatabase db = mDbHelper.getWritableDatabase(); 
long rowId = db.insert(LocationsTable.TABLE_NAME, null, values); 
if (rowId > 0) { 
    Uri notesUri = ContentUris.withAppendedId(CONTENT_URI, rowId); 
    getContext().getContentResolver().notifyChange(notesUri, null); 
    return notesUri; 
} 
throw new IllegalArgumentException("<Illegal>Unknown URI: " + uri); 

} // insert 

@Override 
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); 
    switch (sUriMatcher.match(uri)) { 
    case LOCATIONS_ALL: 
     builder.setTables(LocationsTable.TABLE_NAME); 
     builder.setProjectionMap(sNotesColumnProjectionMap); 
     break; 

    case LOCATIONS_ONE: 
     builder.setTables(LocationsTable.TABLE_NAME); 
     builder.setProjectionMap(sNotesColumnProjectionMap); 
     builder.appendWhere(LocationsTable._ID + " = " + uri.getLastPathSegment()); 
     break; 

    default: 
     throw new IllegalArgumentException("Unknown URI: " + uri); 
} 

SQLiteDatabase db = mDbHelper.getReadableDatabase(); 
    Cursor queryCursor = builder.query(db, projection, selection, selectionArgs, null, null, null); 
    queryCursor.setNotificationUri(getContext().getContentResolver(), uri); 

    return queryCursor; 
} // query 

@Override 
    public int update(Uri uri, ContentValues values, String where, String[] whereArgs) { 
    SQLiteDatabase db = mDbHelper.getWritableDatabase(); 
    int count = 0; 
    switch (sUriMatcher.match(uri)) { 
    case LOCATIONS_ALL: 
     count = db.update(LocationsTable.TABLE_NAME, values, where, whereArgs); 
     break; 

    case LOCATIONS_ONE: 
     String rowId = uri.getLastPathSegment(); 
     count = db.update(LocationsTable.TABLE_NAME, values, LocationsTable._ID 
       + " = " + rowId + (!TextUtils.isEmpty(where) ? " AND (" + ")" : ""), whereArgs); 

    default: 
     throw new IllegalArgumentException("Unknown URI: " + uri); 
    } 

    getContext().getContentResolver().notifyChange(uri, null); 
    return count; 
} // update 

// delete 
@Override 
public int delete(Uri uri, String where, String[] whereArgs) { 
    SQLiteDatabase db = mDbHelper.getWritableDatabase(); 
    int count = 0; 
    switch (sUriMatcher.match(uri)) { 
    case LOCATIONS_ALL: 
     count = db.delete(LocationsTable.TABLE_NAME, where, whereArgs); 
     break; 

    case LOCATIONS_ONE: 
     String rowId = uri.getPathSegments().get(1); 
     count = db.delete(LocationsTable.TABLE_NAME, LocationsTable._ID + " = " 
     + rowId + (!TextUtils.isEmpty(where) ? " AND (" + where + ")" : ""), whereArgs); 
     break; 

    default: 
     throw new IllegalArgumentException("Unknown URI: " + uri); 
    } 

    getContext().getContentResolver().notifyChange(uri, null); 
    return count; 
} // delete 

} // Database 
+0

을 그냥 경우에 -, 가장 최근의 항목 대신 또한 ASC' –

+1

'의'DESC'을 사용하여 얻을 귀하의'ContentProvider' –

+0

의 코드를 제공하시기 바랍니다하기 방금 ContentProvider 클래스의 코드를 추가했습니다. ContentProvider를 확장하는 데이터베이스 – Kevik

답변

9

당신이 '데이터베이스 연결 인스턴스 자체에 정렬 순서 매개 변수를 전달하는, 그래서 아무튼 초래하지 않을 것으로 보인다 t가 정렬됩니다. ContentProvider#query 메소드의 모든 매개 변수를 SQLiteDatabase에 위임하는지 확인하십시오.

그래서, 당신의 SQLiteQueryBuilder#build 방법은 다음과 같아야합니다

Cursor queryCursor = builder.query(db, projection, selection, selectionArgs, null, null, sortOrder); 
+0

@Kevik 예, 고정했습니다 :) –

+0

예! 바로 지금 작동합니다. 당신은 SQL 데이터베이스에 정렬 매개 변수를 전달하지 않았고 그 것이 문제였습니다. – Kevik

관련 문제