2012-03-26 2 views
0

Работа над вычислением моего исключения NullPointerException в моей пользовательской simplecursoradapter при попытке обновить данные в моем представлении. При использовании SimpleCursorAdapter вы не можете использовать NotifyDataSetChanged(), поэтому мне нужно создать новый адаптер, и мне трудно передать необходимые данные.NullPointerException внутри OnClick() on db fetch

public class DxSimpleCursorAdapter extends SimpleCursorAdapter { 
Context context; 
Activity activity; 
DxDbAdapter dbh; 
DxSimpleCursorAdapter adapter; 
ListView lv; 

protected String subcategory; 

public DxSimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, String param) { 
    super(context, layout, c, from, to); 
    this.context=context; 
    this.activity=(Activity) context; 
    subcategory = param; 
} 

public DxSimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
    super(context, layout, c, from, to); 
    this.context=context; 
    this.activity=(Activity) context; 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    LayoutInflater inflater = LayoutInflater.from(context); 
    View row = inflater.inflate(R.layout.list_detail, null); 
    ViewHolder holder = new ViewHolder(); 
    holder.image = (ImageView) row.findViewById(R.id.fav); 
    holder.diagnosis = (TextView) row.findViewById(R.id.diagnosis); 
    holder.code = (TextView) row.findViewById(R.id.code); 
    row.setTag(holder); 
    return row; 
} 

class ViewHolder { 
    ImageView image; 
    TextView diagnosis; 
    TextView code;  
} 

class Status { 
    int status; 
    Long id; 
} 

@Override 
public void bindView(View v, Context con, Cursor cursor) { 
    ViewHolder holder = (ViewHolder) v.getTag(); 

    int favstatus = cursor.getInt(cursor.getColumnIndex(DxDbAdapter.FAV)); 
    Status state = new Status(); 

    if (favstatus == 1) { 
     holder.image.setImageResource(R.drawable.btn_star_on_normal); 
     state.status = 1; 
    } 
    else if (favstatus == 0) { 
     holder.image.setImageResource(R.drawable.btn_star_off_normal); 
     state.status = 0; 
    } 

    long id = cursor.getLong(cursor.getColumnIndex(DxDbAdapter.DIAG_ID)); 
    state.id = id; 
    holder.image.setTag(state); 
    holder.diagnosis.setText(cursor.getString(cursor.getColumnIndex(DxDbAdapter.DIAG))); 
    holder.code.setText(cursor.getString(cursor.getColumnIndex(DxDbAdapter.DIAG_CODE))); 

    holder.image.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Status current_state = (Status) v.getTag(); 

      ImageView fav = (ImageView) v.findViewById(R.id.fav); 
      fav.setImageResource(R.drawable.ic_fav); 

      if (current_state.status == 1) { 
       Toast toast = Toast.makeText(context,"Update fav status to 1",Toast.LENGTH_SHORT); 
       toast.show(); 
      } 
      else if (current_state.status == 0) { 
       Toast toast = Toast.makeText(context,"Update fav status to 0",Toast.LENGTH_SHORT); 
       toast.show(); 
      } 

        dbh = new DxDbAdapter(context); 
      dbh.open(); 
      Cursor newCursor = dbh.fetch(1, subcategory); 
      String[] columns = new String[] {"diagnosis", "diagcode"}; 
      int[] to = new int[] {R.id.diagnosis, R.id.code}; 
      adapter = new DxSimpleCursorAdapter(context, R.layout.list_detail, newCursor, columns, to); 
      lv.setAdapter(adapter); 
     } 
    }); 
    String diag = cursor.getString(cursor.getColumnIndex(DxDbAdapter.DIAG)); 
    String code = cursor.getString(cursor.getColumnIndex(DxDbAdapter.DIAG_CODE)); 
    holder.diagnosis.setText(diag); 
    holder.code.setText(code); 
} 

Вопрос заключается в подкатегории = getIntent() getStringExtra ("подкатегорию"). и Курсор newCursor = dbh.fetch (1, подкатегория); и что я должен ссылаться на Activity, который использует адаптер. Я предполагаю, что у меня возникают проблемы с правильным синтаксисом для ссылки на Activity, так что я не получаю исключение NullPointerException.

ответ

1

Вы действительно должны пройти в подкатегории из родительской деятельности, так как это значение не изменится при использовании адаптера (вместо извлечения его каждый раз, когда вы связывать подряд)

Ex: от родительской активности вы бы сделать что-то вроде

String subcategory = getIntent().getStringExtra("SUBCATEGORY"); 
DxSimpleCursorAdapter adapter = DxSimpleCursorAdapter(context, layout, c, from, to, subcategory); 
listView.setAdapter(adapter); 

тогда, очевидно, вы должны изменить конструктор адаптера, так он взял эту строку, а затем назначен его в подкатегории переменного в адаптере

+0

я добавил конструктор, который имеет дополнительное поле и ListActivity, которое вызывает DxSimpleCursorAdapter, теперь передают значение подкатегории, но у меня все еще есть проблема с NullPointerException, возникающая на ** Cursor newCursor = dbh.fetch (1, подкатегория); **. Метод fetch() работал в других действиях, поэтому я не уверен, что проблема с моими ограниченными знаниями Java. – DeucePie

+1

dbh выглядит как null. Я не вижу нигде в вашем коде, где вы назначаете или создаете свой объект dbh DxDbAdapter – dymmeh

+0

Я добавил dbh = новый DxDbAdapter (контекст); \t dbh.open(); к моему коду выше, и теперь мое NullPointerException перешло к lv.setAdapter (адаптер) ;. Есть идеи? Правильно ли я назначаю и создаю объект dbh? – DeucePie

 Смежные вопросы

  • Нет связанных вопросов^_^