草庐IT

android - 排序顺序不适用于 listView 和游标加载器

coder 2023-12-01 原文

我有一个 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 中显示的项目的顺序或位置?

来自 listview 类的更多代码示例

来自onCreate方法

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

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

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

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

这是用于在数据库中创建表的字符串 extends ContentProvider

 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 " + ");";

游标适配器类

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

}

} 

此处为 CONTENT PROVIDER CLASS 完整代码

 // 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

最佳答案

您似乎没有将排序顺序参数传递给数据库连接实例本身,因此结果没有得到排序。确保将 ContentProvider#query 方法中的所有参数委托(delegate)给 SQLiteDatabase

因此,您的SQLiteQueryBuilder#build 方法应该如下所示:

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

关于android - 排序顺序不适用于 listView 和游标加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23359824/

有关android - 排序顺序不适用于 listView 和游标加载器的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  3. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  4. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  5. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  6. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  7. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

  8. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  9. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  10. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

随机推荐