listview - ContentResolver$CursorWrapperInner 无法转换

标签 listview logcat simplecursoradapter onitemclicklistener

我的应用程序使用游标加载器将 sqlite 数据填充到 ListView 中。实际上,游标加载器应该只将数据库中的一列(COLUNM_NAME_SITE)填充到 ListView 中。

我遇到的问题是....一旦在数据库中插入信息,就会创建一个列表项(我可以通过每次插入数据时显示的行来判断),但 ListView 中不会显示任何文本基本是空白。我相信一旦单击 ListView 项,这也会使应用程序崩溃。

logcat 在下面,但我不明白如何解读它在说什么。我确定问题可能出在第 98 行 [ loginBundle.putString("clickedWebSite",((LoginDetails) clickedObject).getsName());] 区域,但不知道如何纠正问题。

日志:

05-02 15:51:21.573: E/AndroidRuntime(965): FATAL EXCEPTION: main
05-02 15:51:21.573: E/AndroidRuntime(965): java.lang.ClassCastException: android.content.ContentResolver$CursorWrapperInner cannot be cast to com.loginplus.home.LoginDetails
05-02 15:51:21.573: E/AndroidRuntime(965):  at com.loginplus.home.LoginList.onItemClick(LoginList.java:98)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.widget.AdapterView.performItemClick(AdapterView.java:292)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.widget.AbsListView.performItemClick(AbsListView.java:1058)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.widget.AbsListView.onTouchEvent(AbsListView.java:3180)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.View.dispatchTouchEvent(View.java:5541)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1951)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
05-02 15:51:21.573: E/AndroidRuntime(965):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1912)
05-02 15:51:21.573: E/AndroidRuntime(965):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1371)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.app.Activity.dispatchTouchEvent(Activity.java:2364)
05-02 15:51:21.573: E/AndroidRuntime(965):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1860)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.View.dispatchPointerEvent(View.java:5721)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2890)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2466)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:845)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2475)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.os.Looper.loop(Looper.java:137)
05-02 15:51:21.573: E/AndroidRuntime(965):  at android.app.ActivityThread.main(ActivityThread.java:4424)
05-02 15:51:21.573: E/AndroidRuntime(965):  at java.lang.reflect.Method.invokeNative(Native Method)
05-02 15:51:21.573: E/AndroidRuntime(965):  at java.lang.reflect.Method.invoke(Method.java:511)
05-02 15:51:21.573: E/AndroidRuntime(965):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-02 15:51:21.573: E/AndroidRuntime(965):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-02 15:51:21.573: E/AndroidRuntime(965):  at dalvik.system.NativeStart.main(Native Method)

光标加载器:

public class LoginList extends FragmentActivity implements AdapterView.OnItemClickListener, OnClickListener, LoaderManager.LoaderCallbacks<Cursor> {

private ListView loginList;
private Button webLogin;
private SimpleCursorAdapter adapter;

@Override 
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_listview);

loginList = (ListView)findViewById(R.id.loginlist);
loginList.setOnItemClickListener(this);

webLogin = (Button)findViewById(R.id.button3);
webLogin.setOnClickListener(this);

//Specify fileds to display in the list
String[] from = new String[] { ListProvider.COLUMN_NAME_SITE };

//Bind fields to listview
int[] to = new int[] {R.id.loginlist };

// Create CursorAdapter and set it to display
adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null, from, to, 0 );

loginList.setAdapter(adapter);

getSupportLoaderManager().initLoader( 0, null, this);
}


@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "Selected ID :" + arg2, Toast.LENGTH_SHORT).show();

Intent updateDeleteLoginInfo = new Intent (this, UpdateDeleteLoginList.class);

Cursor clickedObject = (Cursor)loginList.getItemAtPosition(0);

Bundle loginBundle = new Bundle();
loginBundle.putString("clickedWebSite",((LoginDetails) clickedObject).getsName());  //this is line 98
loginBundle.putString("clickedWebAddress",((LoginDetails) clickedObject).getwUrl());
loginBundle.putString("clickedUserName",((LoginDetails) clickedObject).getuName());
loginBundle.putString("clickedPassWord",((LoginDetails) clickedObject).getpWord());
loginBundle.putString("clickedNotes",((LoginDetails) clickedObject).getlNotes());

updateDeleteLoginInfo.putExtras(loginBundle);

startActivityForResult(updateDeleteLoginInfo, 0); 
} 

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent webLoginIntent = new Intent (this, LoginPlusActivity.class);
startActivity(webLoginIntent);
}

loginDetail类:

public class LoginDetails {

private int id;
private String sName;
private String wUrl;
private String uName;
private String pWord;
private String lNotes;


// getting ID
public int getid(){
    return id;
    }
    // setting id
    public void setid(int id){
    this.id = id;
    }

public String getsName() {
   return sName;
   }
   public void setsName(String sName) {
   this.sName = sName;
   }

public String getwUrl() {
   return wUrl;
   }
   public void setwUrl(String wUrl) {
   this.wUrl = wUrl;
   }

public String getuName() {
  return uName;
  }
  public void setuName(String uName) {
  this.uName = uName;
  }

public String getpWord() {
  return pWord;
  }
  public void setpWord(String pWord) {
  this.pWord = pWord;
  }

public String getlNotes() {
  return lNotes;
  }
  public void setlNotes(String lNotes) {
  this.lNotes = lNotes;
  }
}

最佳答案

我知道这是一个老问题,我只是回答,因为这似乎是 Google 上的唯一结果。

您无法将光标转换到对象上。 CursorWrapperInner 来自使用 CursorLoader,并且(据我所知)是加载器中实际 Cursor 的代理对象。您必须通过类似于静态方法的方法从游标实例化您的对象,该静态方法获取游标并返回您的对象。

例如:

public class LoginDetails {

private int id;
private String sName;
private String wUrl;
private String uName;
private String pWord;
private String lNotes;

public static LoginDetails newInstance(Cursor c){
   LoginDetails ld = new LoginDetails()
   int _id = c.getInt(c.getColumnIndex("id"));
   ...
   ld.setId(_id);
   return ld;
}
....

}

然后在你的ListView中

@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        Cursor c = (Cursor)adapter.getItem(position);
        LoginDetails loginDetails = LoginDetails.newInstance(c);
        ...
    }

关于listview - ContentResolver$CursorWrapperInner 无法转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16350200/

相关文章:

android - 如果是长文本,则使 ListView 中的项目文本不完整显示

android - 如何根据 Json 对象设置颜色代码

delphi - 在 TListView 中绘制复选框

Android应用Force打开后立即关闭

android - 如何使用 Android adb logcat 按标签名称排除某些消息?

java - Android SQLite - 尝试访问单行时出现 NullPointerException 但可以访问整个数据吗?

android - 如何使 Listview Scroll 变慢?

android - 如何使游标适应具有大量自定义行为的 ListView?

android - 使用本地 SQlite 数据库填充可扩展 ListView 的方法

android - fragment 中的 SimpleCursorAdapter ClassCastException