NullPointerException в OnClick () при получении базы данных - PullRequest
0 голосов
/ 26 марта 2012

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

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

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

1 Ответ

1 голос
/ 26 марта 2012

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

Пример: из родительского действиявы бы сделали что-то вроде

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

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

...