2012-03-26 6 views
0

私のビュー内のデータを更新しようとしているときに、自分のsimplecursoradapter内で自分のNullPointerExceptionを調べる作業をしています。 SimpleCursorAdapterを使用する場合、NotifyDataSetChanged()を使用することはできませんので、新しいアダプタを作成する必要があり、必要なデータを渡すのが難しいです。 。dbフェッチのOnClick()内のNullPointerException

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( "SUBCATEGORY")です。およびカーソルnewCursor = dbh.fetch(1、subcategory);、アダプターを使用しているアクティビティーを参照する必要があることを示しています。私はNullPointerExceptionを取得しないように、アクティビティを参照する正しい構文に問題があると思います。この値は、アダプタを使用している間は変わりませんので、

答えて

1

あなたが本当にあなたの親アクティビティからサブカテゴリを渡す必要があります(代わりにあなたが行に特異的に結合する一つ一つの時間を取り出す)

例:親アクティビティからあなたそれはその文字列を取り、その後、私が持っているコンストラクタを追加した

+0

アダプタ内にあなたのサブカテゴリそれを変数に割り当てられているので、次に

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

ような何かをするだろう、明らかにあなたは、アダプタのコンストラクタを変更する必要があります追加フィールドとDxSimpleCursorAdapterを呼び出すListActivityは現在サブカテゴリ値を渡しますが、** Cursor newCursor = dbh.fetch(1、subcategory); **でNullPointerExceptionが発生する問題が残ります。メソッドfetch()は他のアクティビティでも機能していますので、私の限られたJava知識に問題があるかどうかはわかりません。 – DeucePie

+1

dbhはnullに見えます。 DxDbAdapter dbhオブジェクトを割り当てたり作成したりするコードのどこにも表示されません。 – dymmeh

+0

dbh = new DxDbAdapter(context)を追加しました。 \t dbh.open();上記の私のコードに、今、私のNullPointerExceptionはlv.setAdapter(adapter);に落ちました。何か案は? dbhオブジェクトを正しく割り当てて作成していますか? – DeucePie

関連する問題