2016-06-01 2 views
-2

격자 항목 클릭을 기반으로 목록보기를 채우고 싶습니다. 사용자가 첫 번째 그리드 아이템을 클릭하면리스트 뷰를 보여주고 싶습니다. 나는 SQLite 데이터베이스를 미리 채웠다.null 객체 참조에서 Intent.getExtras()를 수정하는 방법은 무엇입니까?

내가 시도한 것은 첫 번째 활동에서 항목을 클릭하여 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' +'new DBAccess (context)'... 당신 자신이'Activity'를 확장 한 클래스에서 new 연산자를 사용해서는 안됩니다. – Selvin

답변

3

모든 dbaccess를 우선이 활동을 확장하는 데 필요하지 않습니다, it.Update에게 getQuotes

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; 
} 

를 제거하고 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 함수에 문자열을 전달해야합니다.

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? 
    ... 
} 
,
관련 문제