2013-05-21 4 views
1

В андроиде У меня есть пользовательский адаптер, в этом пользовательском адаптере Я создаю представление с некоторым текстом и кнопкой для удаления текста. Все это прекрасно работает, и я могу удалить запись из базы данных, но мне не удалось обновить список.Обновление списка в ListFragment из адаптера курсора

Список выглядит немного как это:

------------------------------------ 
text text text text | Delete Button| 
------------------------------------ 
text text text text | Delete Button| 
------------------------------------ 

Мой первый инстинкт должен был использовать что-то вроде этого:

QCListFragment frag = (QCListFragment) getSupportFragmentManager().findFragmentById(R.id.listFragment); 

В какой момент я мог бы вызвать метод внутри моего списка фрагмента повторно -получите список ... Но я не могу этого сделать, потому что мой адаптер не расширяет фрагмент. Поэтому мне трудно сообщить фрагменту, что данные были изменены.

Как бы то ни было, моя последняя мысль состояла в том, чтобы восстановить активность, но я подумал, что это, вероятно, не лучшее, что нужно сделать, и что должен быть лучший способ ... Я уверен, что это что-то простое, что я Мне не хватает моего последнего вопроса!

(я могу разместить больше кода, если это будет полезно) UPDATE: Вот весь мой класс адаптера

общественный класс CalcCursorAdapter расширяет SimpleCursorAdapter реализует фильтруемых {

private Context mContext; 
private ListView mListView; 
private int mLayout; 
private Cursor mcursor; 

protected static class ViewHolder { 
    protected TextView text; 
    protected ImageButton button; 
    private int position; 
    } 


@SuppressWarnings("deprecation") 
public CalcCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) 
{ 
    super(context, layout, c, from, to); 
    this.mContext = context; 
    this.mLayout = layout; 
    this.mcursor = c; 

    //mListView = .getListView(); 

}  

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    TextView summary = (TextView)view.findViewById(R.id.calctvPrice); 
    TextView savings = (TextView)view.findViewById(R.id.calctvSavings); 
    summary.setText(cursor.getString(cursor.getColumnIndexOrThrow("qcFinalPrice"))); 
    savings.setText(cursor.getString(cursor.getColumnIndexOrThrow("qcSavings"))); 



} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    ViewHolder holder = new ViewHolder(); 

    LayoutInflater inflater = LayoutInflater.from(context); 
    View v = inflater.inflate(R.layout.calc_list_item, parent, false); 

    holder.button = (ImageButton) v.findViewById(R.id.qcbtnDelete); 
    holder.button.setOnClickListener(deleteButton); 
    holder.position = cursor.getInt(cursor.getColumnIndexOrThrow("_id")); 
    bindView(v, context, cursor); 
    v.setTag(holder); 


    return v; 

} 

private OnClickListener deleteButton = new OnClickListener() { 
    public void onClick(View v){ 
     View view = (View) v.getParent(); 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     int position = holder.position; 
     DbHelper mDbHelper; 
     mDbHelper = new DbHelper(mContext); 
     mDbHelper.open(); 
     mDbHelper.deleteCalc(position); 
     mDbHelper.close(); 
     String test = Integer.toString(position); 
     Toast.makeText(mContext.getApplicationContext(), test, Toast.LENGTH_SHORT).show(); 
     notifyDataSetChanged(); 

    } 
}; 


public long qcItemId(int position) { 

    return position; 
} 

}

любой помощь очень ценится!

Спасибо.

+0

Вы попробовали notifyDatasetChanged() метод? – Varundroid

+0

Фрагмент не обрабатывает щелчок, адаптер делает это, потому что нажатая кнопка находится внутри списка. и, по крайней мере, насколько мне известно, я не могу вызвать adapter.notifyDatasetChanged(), потому что я внутри адаптера ... – Klaven

+0

Взгляните на мой ответ и сообщите мне, можете ли вы сейчас позвонить notifyDatasetChanged(). Мы попробуем наш уровень, чтобы помочь вам. – Varundroid

ответ

0

Я думаю, вы неправильно поняли концепцию адаптера и фрагмента. Вы можете установить Adapter to Fragment или AdapterView в свой фрагмент. После запроса данных вызовите Adapter.notifyDataSetChanged(), тогда ваш фрагмент или адаптер будут обновлены.

+0

У меня нет адаптивного объекта внутри моего адаптера ... поэтому я не уверен, как я буду выполнять указанную операцию. мой прослушиватель onclick находится внутри моего адаптера, потому что это кнопка, которая находится в каждой строке. – Klaven

+0

вам не нужен объект адаптера внутри адаптера, просто вызовите notifyDataSetChanged(). – Varundroid

+0

Я вызываю notifyDataSetChanged() внутри моего адаптера внутри OnClickListener и ничего не делает. Я разместил свой код выше. – Klaven

0

Когда вы находитесь внутри адаптера, вы можете позвонить по телефону notifyDatasetChanged(). Вам не нужен объект адаптера. Я думаю, вам нужно обновить концепции OOPS. Адаптер расширяет BaseAdapter или ArrayAdapter или SimpleAdapter, все они имеют этот метод, и вам не нужен объект самого класса, чтобы вызвать его собственные методы.

EDIT

notifyDataSetChanged() не работает для вас, потому что вы раздувания вид каждый раз, что не хорошо с точки зрения производительности. Проверьте это Answer. И onContentChanged() вызывается после notifyDataSetChanged(). я не уверен, как это сработало для вас. Я настоятельно рекомендую вам использовать notifyDataSetChanged(), чтобы все работало, не идите на работу.

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