Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从ArrayList更改后使用McClickListener<&燃气轮机;简化或适应_Android_Nullpointerexception_Simplecursoradapter_Onitemclick - Fatal编程技术网

Android 从ArrayList更改后使用McClickListener<&燃气轮机;简化或适应

Android 从ArrayList更改后使用McClickListener<&燃气轮机;简化或适应,android,nullpointerexception,simplecursoradapter,onitemclick,Android,Nullpointerexception,Simplecursoradapter,Onitemclick,我仍然在思考内容提供者、加载器和SimpleCursorAdapter(我发现使用旧的startManagingCursor方法更容易)。本质上,我有一个ListView活动,当单击一个列表项时,它将打开一个新的活动,该活动的所有字段都填充了来自DB的数据。然后,用户可以删除记录,或者更改字段并保存更改。我会为这篇文章的篇幅提前道歉,但我不确定什么可能/可能不相关 我将首先向您提供旧代码(正在运行): public class FuncLogbook extends DashMenuActivi

我仍然在思考内容提供者、加载器和SimpleCursorAdapter(我发现使用旧的startManagingCursor方法更容易)。本质上,我有一个ListView活动,当单击一个列表项时,它将打开一个新的活动,该活动的所有字段都填充了来自DB的数据。然后,用户可以删除记录,或者更改字段并保存更改。我会为这篇文章的篇幅提前道歉,但我不确定什么可能/可能不相关

我将首先向您提供旧代码(正在运行):

public class FuncLogbook extends DashMenuActivity implements OnItemClickListener {

private ListView list_LogbookResults;
private ListAdapter list_LogbookAdap;
private ArrayList<DBDetails> LogbookArrayList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView (R.layout.dash_logbook);

    list_LogbookResults = (ListView) findViewById(R.id.list_logbook);
    list_LogbookResults.setOnItemClickListener(this);

    LogbookArrayList = new ArrayList<DBDetails>();
    list_LogbookAdap = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList());
    list_LogbookResults.setAdapter(list_LogbookAdap);
}

@SuppressWarnings("deprecation")
public List<String> populateList() {
    List<String> BGLResultsList = new ArrayList<String>();

    DBProvider mDBLogbook = new DBProvider();
    AddDBHelper logbook = new AddDBHelper(this);
    logbook.open();
    Cursor cur = logbook.getEntries();
    Cursor cur = mDBLogbook.query(DBProvider.CONTENT_URI, null, null, null, null);
    startManagingCursor(cur);

    while (cur.moveToNext()) {
        String RowID = cur.getString(0);
        String Time = cur.getString(1);
        String Date = cur.getString(2);
        String BGL = cur.getString(5);

        DBDetails detailsClass = new DBDetails();
        detailsClass.setuRow(RowID);
        detailsClass.setuTime(Time);
        detailsClass.setuDate(Date);
        detailsClass.setuBGL(BGL);          

        LogbookArrayList.add(detailsClass);
        BGLResultsList.add("BGL: " + BGL + "\nRow ID: " + RowID
                +"\nDate: " + Date +"\nTime: " + Time);
    }
    return BGLResultsList;
}

@Override
protected void onResume() {
    super.onResume();
    LogbookArrayList = new ArrayList<DBDetails>();
    list_LogbookAdap = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList());
    list_LogbookResults.setAdapter(list_LogbookAdap);
}

@Override
protected void onStart() {
    super.onStart();
    LogbookArrayList = new ArrayList<DBDetails>();
    list_LogbookAdap = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList());
    list_LogbookResults.setAdapter(list_LogbookAdap);
}

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {      
    Intent UpdateDBDetails = new Intent(this, UpdateDBDetails.class);

    DBDetails clickedObject = LogbookArrayList.get(arg2);
    Bundle dataBundle =  new Bundle();
    dataBundle.putString("clickeduRowId", clickedObject.getuRow());
    dataBundle.putString("clickeduTime", clickedObject.getuTime());
    dataBundle.putString("clickeduDate", clickedObject.getuDate());
    dataBundle.putString("clickeduBGL", clickedObject.getuBGL());

    UpdateDBDetails.putExtras(dataBundle);
    startActivity(UpdateDBDetails);
}
public class FuncLogbook extends ListActivity implements
LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener {

private SimpleCursorAdapter adapter;
private ArrayList<DBDetails> LogbookArrayList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView (R.layout.dash_logbook);     
    this.getListView().setDividerHeight(2);
    fillData(); 

    ListView list = getListView();
    list.setOnItemClickListener(this); }

protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
}

private void fillData() {
    String[] from = new String[] { AddDBHelper.KEY_BGL, AddDBHelper.KEY_ROWID,
            AddDBHelper.KEY_CATEG, AddDBHelper.KEY_TIME };
    int[] to = new int[] {R.id.logBGL, R.id.logRowID, R.id.logCateg, R.id.logTime };

    getLoaderManager().initLoader(0, null, this);
    adapter = new SimpleCursorAdapter(this, R.layout.logbook_item, null, from, to, 0);

    setListAdapter(adapter);        
}

public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String[] projection = { AddDBHelper.KEY_ROWID, AddDBHelper.KEY_BGL,
            AddDBHelper.KEY_CATEG, AddDBHelper.KEY_TIME };
    CursorLoader cl = new CursorLoader(this, DBProvider.CONTENT_URI,
            projection, null, null, null);
    return cl;
}

public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    adapter.swapCursor(data);
}

public void onLoaderReset(Loader<Cursor> loader) {
    adapter.swapCursor(null);
}

public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {       
    Intent UpdateDBDetails = new Intent(this, UpdateDBDetails.class);   

    /*DBDetails clickedObject = LogbookArrayList.get(pos);
    Bundle dataBundle =  new Bundle();
    dataBundle.putString("clickeduRowId", clickedObject.getuRow());
    dataBundle.putString("clickeduTime", clickedObject.getuTime());
    dataBundle.putString("clickeduDate", clickedObject.getuDate());
    dataBundle.putString("clickeduBGL", clickedObject.getuBGL());

    UpdateDBDetails.putExtras(dataBundle);*/
    startActivity(UpdateDBDetails);
}
如果我没有向游标添加强制转换,它就会抛出一个错误,因此
cursor c=(cursor)adapter.getItem(pos)

这仍然不起作用。Logcat显示:

10-21 23:24:02.167: E/CursorWindow(2663): Failed to read row 2, column -1 from a CursorWindow which has 8 rows, 4 columns.
10-21 23:24:02.178: E/AndroidRuntime(2663): FATAL EXCEPTION: main
10-21 23:24:02.178: E/AndroidRuntime(2663): java.lang.IllegalStateException: Couldn't read row 2, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
10-21 23:24:02.178: E/AndroidRuntime(2663):     at android.database.CursorWindow.nativeGetString(Native Method)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at android.database.CursorWindow.getString(CursorWindow.java:434)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at android.database.CursorWrapper.getString(CursorWrapper.java:114)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at com.rone.glucometer.FuncLogbook.onItemClick(FuncLogbook.java:227)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at android.widget.AdapterView.performItemClick(AdapterView.java:298)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at android.widget.AbsListView.performItemClick(AbsListView.java:1086)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2855)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at android.widget.AbsListView$1.run(AbsListView.java:3529)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at android.os.Handler.handleCallback(Handler.java:615)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at android.os.Looper.loop(Looper.java:137)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at android.app.ActivityThread.main(ActivityThread.java:4745)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at java.lang.reflect.Method.invokeNative(Native Method)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at java.lang.reflect.Method.invoke(Method.java:511)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-21 23:24:02.178: E/AndroidRuntime(2663):     at dalvik.system.NativeStart.main(Native Method)
更新
我意识到上面的logcat错误是因为我没有列出onCreateLoader中的所有列;为了简单和缩小尺寸,我在本例中只列出了4列,但我有近15列。谢谢,您的代码运行得很好。您的第二次尝试没有成功,因为您使用的是与使用基于
光标的适配器相同的
ArrayList
,现在还没有初始化。相反,您应该从适配器中获取
光标
(使用
getItem(position)
方法,您将在正确的行中获取
光标
位置),并从中获取数据:

public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {       
    Intent UpdateDBDetails = new Intent(this, UpdateDBDetails.class);   
    Cursor c = adapter.getItem(position);
    Bundle dataBundle =  new Bundle();
    dataBundle.putString("clickeduRowId", c.getString(c.getColumnIndex(the_index_for_this_column_data))); // One of the fields from AddDBHelper.KEY_BGL, AddDBHelper.KEY_ROWID, AddDBHelper.KEY_CATEG, AddDBHelper.KEY_TIME
    // the same for the other fields. 

    UpdateDBDetails.putExtras(dataBundle);
    startActivity(UpdateDBDetails);
}
public void-onItemClick(AdapterView父项、视图、int-pos、长id){
Intent UpdateDBDetails=新Intent(此为UpdateDBDetails.class);
光标c=适配器.getItem(位置);
Bundle-dataBundle=新Bundle();
dataBundle.putString(“ClickedRowId”,c.getString(c.getColumnIndex(此列数据的索引));//AddDBHelper.KEY\u BGL、AddDBHelper.KEY\u ROWID、AddDBHelper.KEY\u CATEG、AddDBHelper.KEY\u TIME中的一个字段
//其他字段也一样。
更新的bdetails.putExtras(数据绑定);
startActivity(更新的b详细信息);
}

另外,为了安全起见,在实例化适配器后调用
LoaderManager

您试图获取游标/数据库中不存在的列。使用
Log.e
语句查看
c.getColumnIndex()
中的哪个返回-1(表示未找到任何列)。
public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {       
    Intent UpdateDBDetails = new Intent(this, UpdateDBDetails.class);   
    Cursor c = adapter.getItem(position);
    Bundle dataBundle =  new Bundle();
    dataBundle.putString("clickeduRowId", c.getString(c.getColumnIndex(the_index_for_this_column_data))); // One of the fields from AddDBHelper.KEY_BGL, AddDBHelper.KEY_ROWID, AddDBHelper.KEY_CATEG, AddDBHelper.KEY_TIME
    // the same for the other fields. 

    UpdateDBDetails.putExtras(dataBundle);
    startActivity(UpdateDBDetails);
}