android - 获取 ListView 值 getItem 时发生类转换异常

标签 android

啊姆昨天我发布了关于使用 listfragment 查看 ListView 中的数据的问题的代码。我得到了解决方案并且工作正常。但现在的问题是 getItem 函数返回一个错误,指出“java.lang.classcastexception:java.lang.string”。这是我的代码:

我的列表 fragment :

public class ListTest2 extends ListFragment {



      @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub

          ListAdapter listAdapter = getListAdapter();
          Log.i("here","here");
          ListSql cc = (ListSql) listAdapter.getItem(position);



          //Toast.makeText(getActivity(), "" + l.getSelectedItem() ,Toast.LENGTH_LONG).show();
          ArrayList<String> arr = new ArrayList<String>();
         Log.i("",cc.getName());


    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        List<ListSql> results = new ArrayList<ListSql>();
        ArrayList<String> arr = new ArrayList<String>();
        HotorNot hon = new HotorNot(getActivity());
        hon.open();
        arr = hon.listme(arr);
        hon.close();
        Toast.makeText(getActivity(), arr.toString(), Toast.LENGTH_LONG).show();
        setListAdapter(new SqlParser(getActivity(),arr));
      } 
}

我的ListSql类:

public class ListSql {


    private String Fname;
    private String Fpass;
    private ArrayList<String> arList;

    private Context myContext;
    private List<ListSql> items;
    private LayoutInflater  mInflater;
    private DBhelper myHelper;
    private SQLiteDatabase myDbase;

    public static final String KEY_ROWID = "_id";
    public static final String KEY_NAME = "_persons_name";
    public static final String KEY_HOTNESS = "person_hotness";

    private static final String DATABASE_NAME = "HotOrNotdb";
    private static final String DATABASE_TABLE = "peopleTable";
    private static final int DATABASE_VERSION = 1;


    public static class DBhelper extends SQLiteOpenHelper{

        public DBhelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(
                    "Create Table " + DATABASE_TABLE + " (" + 
                    KEY_ROWID + " Integer PRIMARY KEY AUTOINCREMENT, " + 
                    KEY_NAME + " TEXT NOT NULL, " + 
                    KEY_HOTNESS + " TEXT NOT NULL);"
                    );

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            db.execSQL("DROP TABLE IF EXIST " + DATABASE_TABLE);
            onCreate(db);
        }

    }


    public String getName(){
        return Fname;
    }

    public String getPass(){

        return Fpass;
    }




    public ListSql open(){
        myHelper = new DBhelper(myContext);
        myDbase = myHelper.getWritableDatabase();
        Log.i("open","open");
        return this;
    }
    public void close(){
        myHelper.close();

    }


    public ArrayList<String> Listme(ArrayList<String> arr){
        String sql = "select * from " + DATABASE_TABLE;
        Cursor c = myDbase.rawQuery(sql, null);
        if(c !=null){
            if  (c.moveToFirst()) {
                do {
                    String firstName = c.getString(c.getColumnIndex(KEY_NAME));
                    String pass = c.getString(c.getColumnIndex(KEY_HOTNESS));
                    arr.add("username " + firstName + ",  Password: " + pass);

                }while (c.moveToNext());
            } 

            return arr;

        }

        return null;

    }

}

还有我的基础适配器:

public class SqlParser extends BaseAdapter {

    private Context myContext;
    private ArrayList<String> items;
    private LayoutInflater  mInflater;
    private DBhelper myHelper;
    private SQLiteDatabase myDbase;

    public static final String KEY_ROWID = "_id";
    public static final String KEY_NAME = "_persons_name";
    public static final String KEY_HOTNESS = "person_hotness";

    private static final String DATABASE_NAME = "HotOrNotdb";
    private static final String DATABASE_TABLE = "peopleTable";
    private static final int DATABASE_VERSION = 1;


    public SqlParser(Context context ,ArrayList<String> arr){
        this.myContext = context;
        this.items = arr;
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }


    private class ViewHolder {
        public TextView textView;
    }

    public int getCount() {
        // TODO Auto-generated method stub
        return items.size();
    }

    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return items.get(position);
    }

    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }



    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ArrayList<String> arr = new ArrayList<String>();
        View view = convertView;
        ViewHolder viewHolder;
        TextView namef ;
        ImageView prof;
        Bitmap bMap;
        if (view == null) {
            view = mInflater.inflate(R.layout.listinflate, parent, false);

            /**
            viewHolder = new ViewHolder();
            viewHolder.textView = (TextView) view.findViewById(R.id.textView1);
            view.setTag(viewHolder); **/


            /*** You can do this manualy without using holder ***/
             namef = (TextView)view.findViewById(R.id.textView1);

            /*** You can do this manualy on setting the tag to individual components rather than using holder  ***/ 
            view.setTag(namef);

        }else {
            viewHolder = (ViewHolder) view.getTag();
            namef = (TextView) view.getTag();

        }
        namef.setText(items.get(position));

        return view;
    }
}

我不知道是什么导致了这个错误。谢谢

最佳答案

您尝试将 String 转换为 ListSql 时引发异常:

ListSql cc = (ListSql) listAdapter.getItem(position);

相反,它应该是这样的:

String cc = (String) listAdapter.getItem(position);

因为您的自定义适配器从 getItem 方法返回一个 String

关于android - 获取 ListView 值 getItem 时发生类转换异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11322081/

相关文章:

Android 定时器只触发一次

android - 在 Android 中存储用户登录凭据的最佳位置

Android Studio 2.3 更新后 Android 应用程序未加载到模拟器中

java - AndEngine Vector2 操作改变了我的变量

java - try catch block 仍然返回应该捕获的异常

android - 如何使用 CAMERA2 以正确的方向保存图像

android - 如何使用 Jenkins & Ant 从 Git 存储库子目录构建?

android - 在 WebViewClient 中启用通用 JavaScript

java - 根据当前时区将 UTC 日期/时间显示为日期/时间

android - 如何在 Android 中将套接字事件作为后台服务处理?