2012-03-26 3 views
0

내보기에서 데이터를 새로 고치려고 할 때 내 custom simplecursoradapter 내에서 내 NullPointerException을 알아내는 작업. SimpleCursorAdapter를 사용할 때 NotifyDataSetChanged()를 사용할 수 없으므로 새 어댑터를 만들어야하고 필요한 데이터를 전달하는 데 어려움이 있습니다. .dbetch에 대한 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을 얻지 않도록 Activity를 참조하는 올바른 문법에 문제가 있다고 생각한다. 이 값이 어댑터를 사용하는 동안 변경되지 않습니다 때문에

답변

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 (어댑터); 내려 갔다. 어떤 아이디어? dbh 객체를 올바르게 할당하고 생성합니까? – DeucePie

관련 문제