【问题标题】:How to display id from SQLite db click on listView item in Android?如何从 SQLite db 点击 Android 中的 listView 项目显示 id?
【发布时间】:2013-12-17 12:28:05
【问题描述】:

我想在下一个活动中单击 ListView 项目时从 SQLiteDatabase 检索 id。当我运行应用程序时,它会得到NullPointerException

我已经在DataBase_Adapter class 的String 中声明了id:

public static final String KEY_NEW_LEAD_ID ="id";

这是我的 ListView 代码:

displayDataList = (ListView)findViewById(R.id.listViewGetAllData);

displayDataList.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position,
            long arg3) {
        // TODO Auto-generated method stub

        Intent ii=new Intent(Display_All_Data.this ,New_Lead_Detail_Activity.class);
        cursor = (Cursor) displayDataAdapter.getItem(position);
        int i=cursor.getInt(cursor.getColumnIndex("id"));
        System.out.println("ID = " + i);
        ii.putExtra("NEW_LEAD_USER_ID", i);
        startActivity(ii);
    }
});

这是我的日志猫信息:

12-17 17:50:26.024: E/AndroidRuntime(10322): FATAL EXCEPTION: main
12-17 17:50:26.024: E/AndroidRuntime(10322): java.lang.NullPointerException
12-17 17:50:26.024: E/AndroidRuntime(10322):    at com.lead_management_project.Display_All_Data$1.onItemClick(Display_All_Data.java:48)
12-17 17:50:26.024: E/AndroidRuntime(10322):    at android.widget.AdapterView.performItemClick(AdapterView.java:284)
12-17 17:50:26.024: E/AndroidRuntime(10322):    at android.widget.ListView.performItemClick(ListView.java:3513)
12-17 17:50:26.024: E/AndroidRuntime(10322):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1812)
12-17 17:50:26.024: E/AndroidRuntime(10322):    at android.os.Handler.handleCallback(Handler.java:587)
12-17 17:50:26.024: E/AndroidRuntime(10322):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-17 17:50:26.024: E/AndroidRuntime(10322):    at android.os.Looper.loop(Looper.java:123)
12-17 17:50:26.024: E/AndroidRuntime(10322):    at android.app.ActivityThread.main(ActivityThread.java:3683)
12-17 17:50:26.024: E/AndroidRuntime(10322):    at java.lang.reflect.Method.invokeNative(Native Method)
12-17 17:50:26.024: E/AndroidRuntime(10322):    at java.lang.reflect.Method.invoke(Method.java:507)
12-17 17:50:26.024: E/AndroidRuntime(10322):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-17 17:50:26.024: E/AndroidRuntime(10322):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-17 17:50:26.024: E/AndroidRuntime(10322):    at dalvik.system.NativeStart.main(Native Method)

我的 Display_Data_Adapter 类扩展了 BaseAdapter

public class Display_Data_Adapter extends BaseAdapter
{
    Context mContext;
    ArrayList<String> newLead_ArrayList_OrgName;
    ArrayList<String> newLead_ArrayList_Name;
    ArrayList<String> newLead_ArrayList_Status;
    ArrayList<String> newLead_ArrayList_Budget;

    /**
     * @param mContext
     * @param newLead_ArrayList_OrgName
     * @param newLead_ArrayList_Name
     * @param newLead_ArrayList_Status
     * @param newLead_ArrayList_Budget
     */
    protected Display_Data_Adapter(Context mContext,
            ArrayList<String> newLead_ArrayList_OrgName,
            ArrayList<String> newLead_ArrayList_Name,
            ArrayList<String> newLead_ArrayList_Status,
            ArrayList<String> newLead_ArrayList_Budget) {
        this.mContext = mContext;
        this.newLead_ArrayList_OrgName = newLead_ArrayList_OrgName;
        this.newLead_ArrayList_Name = newLead_ArrayList_Name;
        this.newLead_ArrayList_Status = newLead_ArrayList_Status;
        this.newLead_ArrayList_Budget = newLead_ArrayList_Budget;
    }



    /**
     * 
     */
    protected Display_Data_Adapter() {
        super();
        // TODO Auto-generated constructor stub
    }


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

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

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

    @Override
    public View getView(int position, View v, ViewGroup vg) 
    {
        // TODO Auto-generated method stub

        Holder mHolder;
        LayoutInflater layoutInflater;

        if (v == null)
        {
            layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = layoutInflater.inflate(R.layout.search_data_item_listview,null);

            mHolder = new Holder();

            mHolder.txt_newLead_OrgName = (TextView) v
                    .findViewById(R.id.textvieworgname);

            mHolder.txt_newLead_Name = (TextView) v
                    .findViewById(R.id.textviewname);

            mHolder.txt_newLead_Status = (TextView) v
                    .findViewById(R.id.textviewstatus);


            mHolder.txt_newLead_Budget = (TextView) v
                    .findViewById(R.id.textviewbudget);

            v.setTag(mHolder);

        } else {

            mHolder = (Holder) v.getTag();

        }



        mHolder.txt_newLead_OrgName.setText(newLead_ArrayList_OrgName.get(position));

        mHolder.txt_newLead_Name.setText(newLead_ArrayList_Name.get(position));

        mHolder.txt_newLead_Status.setText(newLead_ArrayList_Status.get(position));

        mHolder.txt_newLead_Budget.setText(newLead_ArrayList_Budget.get(position));

        return v;


    }

    public class Holder {

        TextView txt_newLead_OrgName;
        TextView txt_newLead_Name;
        TextView txt_newLead_Status;
        TextView txt_newLead_Budget;

    }

}

【问题讨论】:

  • 第 48 行出现 NullPointerException。这是哪一行?可能是您的光标为空?
  • displayDataAdapternull 吗?将 displayDataAdapter.getItem 更改为 arg0.getItemAtPosition ...并且 SO 没有调试在线服务 ...在自己的代码中发布 NPE 是懒惰
  • 我没听明白。你能解释一下吗?
  • @mvieghofer 在第 48 行 = int i=cursor.getInt(cursor.getColumnIndex("id"));
  • 在从数据库中检索数据之前,您必须打开您的数据库。

标签: java android android-sqlite


【解决方案1】:

当你得到 NullPointerException 时

int i=cursor.getInt(cursor.getColumnIndex("id"));

那么你的光标是null。这意味着

cursor = (Cursor) displayDataAdapter.getItem(position);

返回null

编辑:

在 cmets 中进行了一些讨论后,CursorAdapter 可能更适合您。使用 CursorAdapter,您可以直接将数据库游标与列表视图链接。另请参阅此SO post 或此tutorial 推荐here

【讨论】:

  • 你能给我一些建议吗?
  • 对不起,但是根据您提供的信息,我只能说您的 displayDataAdapter.getItem(position) 返回 null。我不知道 displayDataAdapter 是什么。看一下数据的初始化(可能有空值,而应该没有空值)。如果它是您自己实现的适配器,则您的 getItem 可能无法正常工作。您可以尝试调试您的应用程序并设置断点,以便您可以检查实际数据,这应该有助于您确定问题所在。
  • displayDataAdapter 是扩展 BaseAdapter 的类。自过去四个小时以来我尝试了很多,但我无法解决为什么光标为空的问题。请帮助我找出我错的地方。
  • 我已经发布了 Display_Data_Adapter 类(displayDataAdapter)。
  • 你的 getItem() 只返回你传入的位置。这可以工作......你需要返回显示在你传入位置的对象。也许这个例子可以帮助你位stackoverflow.com/questions/8166497/…
猜你喜欢
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多