2016-06-01 9 views
-2

グリッドアイテムのクリックに基づいてリストビューを作成したいとします。ユーザーが最初のグリッド項目をクリックすると、それに応じてリストビューを表示したいと思います。私はここにSQLiteデータベースを使用しています。nullオブジェクトリファレンスでIntent.getExtras()を修正するにはどうすればよいですか?

私が試みたのは、最初のアクティビティでアイテムクリックIDを取得してDBクラスに渡すことでした。これは私がプログラムをデバッグするときに得ているものです。

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference 
     at com.example.sra.hellosrilanka.DBAccess.getQuotes(DBAccess.java:51) 
     at com.example.sra.hellosrilanka.ContactView.onCreate(ContactView.java:29) 

DBACCESSクラス:

public class DBAccess extends Activity { 
private SQLiteOpenHelper openHelper; 
private SQLiteDatabase database; 
private static DBAccess instance; 
String passedVar=null; 

public DBAccess(Context context) { 

    this.openHelper =new HelloDatabase(context); 
} 

public static DBAccess getInstance(Context context) { 
    if (instance == null) { 
     instance = new DBAccess(context); 
    } 
    return instance; 
} 

public void open() { 
    this.database = openHelper.getWritableDatabase(); 
} 

public void close() { 
    if (database != null) { 
     this.database.close(); 
    } 
} 



public List<String> getQuotes() { 
    List<String> list = new ArrayList<>(); 
    Integer value; 

    Bundle extras = getIntent().getExtras(); 
    String a = extras.getString("ID_EXTRA"); 


    if(extras != null) 
    { 
     Cursor cursor = database.rawQuery("SELECT org_name FROM org_name WHERE category_id = \""+ a +"\"" , null); 
     /* Cursor cursor = database.rawQuery("SELECT org_name FROM org_name WHERE category_id="+a, null);*/ 
     /*Cursor cursor = database.rawQuery("SELECT org_name FROM org_name WHERE category_id='ID_EXTRA'", null);*/ 
     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) { 
      list.add(cursor.getString(0)); 
      cursor.moveToNext(); 
      cursor.close(); 
     } 
    } 

    /* if (passedVar != null) { 


    }*/ 

    return list; 
}} 

連絡先ビュークラス:

public class ContactView extends Activity { 
private ListView listView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.list_view); 


    this.listView = (ListView) findViewById(R.id.listView); 
    DBAccess databaseAccess = DBAccess.getInstance(this); 
    databaseAccess.open(); 
    List<String> quotes = databaseAccess.getQuotes(); 
    databaseAccess.close(); 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, quotes); 
    this.listView.setAdapter(adapter); 

} 

}

メインアクティビティクラス

public class MainActivity extends AppCompatActivity { 

GridView grid; 
Toolbar toolbar; 
private ListView listView; 

String [] result; 
Context context; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    grid = (GridView) findViewById(R.id.grid); 


    toolbar=(Toolbar)findViewById(R.id.toolBar); 
    setSupportActionBar(toolbar); 

    grid.setAdapter(new CustomAdapter(this)); 
      grid.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
        /*Intent intent=new Intent(MainActivity.this,ContactView.class); 
        intent.putExtra("catid", id); 
        startActivity(intent);*/ 

        Intent i=new Intent(MainActivity.this ,ContactView.class); 
        i.putExtra("ID_EXTRA",String.valueOf(id)); 
        startActivity(i); 

       } 




      });}} 
+1

主な問題は 'DBAccess extends Activity' +'新しいDBAccess(context) '...あなた自身が' Activity'を拡張したクラスでnew演算子を使うことは決してしないでください。 – Selvin

答えて

3

まず

public List<String> getQuotes(String id) { 
    List<String> list = new ArrayList<>(); 
    Integer value; 


    if(id != null) 
    { 
     Cursor cursor = database.rawQuery("SELECT org_name FROM org_name WHERE category_id = \""+ id +"\"" , null); 
     /* Cursor cursor = database.rawQuery("SELECT org_name FROM org_name WHERE category_id="+a, null);*/ 
     /*Cursor cursor = database.rawQuery("SELECT org_name FROM org_name WHERE category_id='ID_EXTRA'", null);*/ 
     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) { 
      list.add(cursor.getString(0)); 
      cursor.moveToNext(); 
      cursor.close(); 
     } 
    } 

    /* if (passedVar != null) { 


    }*/ 

    return list; 
} 

it.UpdateあなたgetQuotesを削除し、ContactViewで意図から値を取得し、活動を拡張するために必要はありません。

public class ContactView extends Activity { 
private ListView listView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.list_view); 


    this.listView = (ListView) findViewById(R.id.listView); 
    DBAccess databaseAccess = DBAccess.getInstance(this); 
    databaseAccess.open(); 
    List<String> quotes = databaseAccess.getQuotes(getIntent().getStringExtra("ID_EXTRA")); 
    databaseAccess.close(); 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, quotes); 
    this.listView.setAdapter(adapter); 

} 
+0

ありがとうございます@USKMobility。今それは働いている。リスト内の項目が1つ以上あるグリッドをクリックすると、アプリが自動的にクラッシュします。ここに何か悪いことはありますか? list.add(cursor.getString(0)); – coderaizer

0

DBAccessクラスはインテントによって開始されていないため、取得する意思はありません。

ContactViewクラスでインテントとバンドルを取得し、その文字列をDBAccessクラスのgetQuotes関数に渡す必要があります。すべてDBACCESSの

0

あなたは、ContactViewActivityのインスタンスをDBAccessのコンストラクタに渡した後、参照を保持しませんでした。

ContactViewActivity.onCreate:

DBAccess databaseAccess = DBAccess.getInstance(this); 

DBAccess.getInstance:

public static DBAccess getInstance(Context context) { 
    if (instance == null) { 
     instance = new DBAccess(context); // ok let's take a look into the constructor 
    } 
    return instance; 
} 

DBACCESS(コンストラクタ)。

public DBAccess(Context context) { 

    this.openHelper =new HelloDatabase(context); 
    // you will lose a reference to this context when returning 
} 

DBAccess.getQuotes:

public List<String> getQuotes() { 
    List<String> list = new ArrayList<>(); 
    Integer value; 

    Bundle extras = getIntent().getExtras(); // now, get intent from what? 
    ... 
} 
関連する問題