Как обновить список из этого адаптера, который реализует ListAdapter

У меня есть адаптер, который реализует ListAdapter,

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

Метод notifyDataSetChanged() недоступен в ListAdapter

Отредактировано:

public class ShoppingListAdapter implements ListAdapter {

ArrayList<ProductInfoDTO> data;
private LayoutInflater inflater = null;
Context context;
Activity activity;
String TAG = getClass().getSimpleName();

DBQuery mDBQuery;

public ShoppingListAdapter(Context context, ArrayList<ProductInfoDTO> data) {

    this.context = context;
    this.data = data;
    activity = (Activity) context;
    inflater = ((Activity) context).getLayoutInflater();

    mDBQuery = new DBQuery(context);
}

@Override
public int getCount() {
    return data.size();
}

@Override
public Object getItem(int position) {

    return data.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
    return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {   

    MyCartItemView view = null;

    if (convertView == null) {
        view = new MyCartItemView(activity, data.get(position));
    } else {
        view = (MyCartItemView) convertView;
    }
    view.setPosition(position);

    Button delete;

    delete = (Button) view.findViewById(R.id.delete);

    delete.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            Toast.makeText(context, "delete clicked", Toast.LENGTH_SHORT)
                    .show();

            // delete from database
            mDBQuery.DeleteCartData(data.get(position).cart_id);

            // delete from data
            data.remove(data.get(position));

            // now I want to refresh the list here                              

        }
    });


    return view;
}

@Override
public int getViewTypeCount() {
    return data.size();
}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public boolean isEmpty() {
    return false;
}

@Override
public void registerDataSetObserver(DataSetObserver observer) {

}

@Override
public void unregisterDataSetObserver(DataSetObserver observer) {

}

@Override
public boolean areAllItemsEnabled() {
    return true;
}

@Override
public boolean isEnabled(int position) {
    return true;
}
}

person Jayesh    schedule 27.06.2013    source источник
comment
Вы реализовали ListAdapter напрямую? Вместо этого вам следует расширить один из подклассов BaseAdapter. BaseAdapter поставляется с методом notifyDataSetChanged(), который вы ищете.   -  person devconsole    schedule 27.06.2013
comment
Без кода... посмотрите здесь, если это ваш случай stackoverflow.com/questions/14859766/   -  person AlexBcn    schedule 27.06.2013
comment
@AlexBcn: в ссылке, о которой вы говорите, ScoreListAdapter расширяет ArrayAdapter‹Score› и в моем случае реализует ListAdapter   -  person Jayesh    schedule 27.06.2013
comment
@Jayesh, также вы не опубликовали код, в котором вы устанавливаете адаптер в свой список в действии!   -  person 7bluephoenix    schedule 27.06.2013
comment
Я столкнулся с той же проблемой и все еще ищу решение. Настоящие ответы предлагают только альтернативы использованию ListAdapter, они фактически не решают поставленную проблему.   -  person Daniel    schedule 27.03.2015


Ответы (4)


Вместо использования ListAdapter расширьте Adapter с помощью BaseAdapter. Затем вы можете использовать notifyDataSetChanged.


Изменить: см. ниже.

https://stackoverflow.com/a/13431786/1995735

person 7bluephoenix    schedule 27.06.2013

Попробуйте использовать

public class ShoppingListAdapter extends BaseAdapter {
    // add unimplemented methods...
}

вместо public class ShoppingListAdapter implements ListAdapter{}. Если есть ошибка, сообщите нам, что говорит ошибка.

person Neoh    schedule 27.06.2013
comment
нужно решение, а не предложение - person Jayesh; 27.06.2013
comment
В демо-версии swipelistview packageAdapter расширяет baseAdapter и отлично работает. Нам нужно понять, где ваша ошибка, если вам нужно решение. - person Neoh; 27.06.2013
comment
нигде нет ошибки, братан, разве ты не видел код, я только что добавил один комментарий, который // теперь я хочу обновить список здесь, и я загружаю демонстрационный код для swipeListView из github, и они реализуют ListAdapter - person Jayesh; 27.06.2013
comment
@Neoh, он не дал код, в котором он устанавливает адаптер в свой список, и ожидает от нас ТОЧНЫХ ответов! - person 7bluephoenix; 27.06.2013
comment
Можете ли вы указать мне, какой файл определяет класс ShoppingListAdapter? - person Neoh; 27.06.2013
comment
я просто использую класс SwipeListView.java оттуда, и адаптер там не находится, я создаю здесь свой собственный адаптер, но основная проблема заключается в том, можем ли мы обновить список из ListAdapter или нет? - person Jayesh; 27.06.2013
comment
В этой демонстрации есть пример класса адаптера под названием PackageAdapter. Если вы научитесь создавать свой собственный класс, похожий на этот класс, вы можете обновить список. ListAdapter не сможет обновить список, если вы не реализуете все так же, как BaseAdapter. Но зачем изобретать велосипед? - person Neoh; 27.06.2013

Попробуйте этот код..

delete.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        Toast.makeText(context, "delete clicked", Toast.LENGTH_SHORT)
                .show();

        // delete from database
        mDBQuery.DeleteCartData(data.get(position).cart_id);

        // delete from data
        data.remove(data.get(position));

    your_listview.invalidateViews(); //refresh the list here                              

    }
});
person Mehul Ranpara    schedule 27.06.2013
comment
отображать ошибку в этой строке, notifyDataSetChanged(); метод неприменим к ListAdapter.... :( - person Jayesh; 27.06.2013
comment
но у меня нет объекта ListView в адаптере, он находится в действии или фрагменте, в моем случае ListView находится во фрагменте, обычно нам нравится этот listview.setAdapter(customAdapter); из активности или фрагмента, но у нас нет объекта listview внутри класса адаптера - person Jayesh; 27.06.2013

Этот конкретный метод вызывает DataSetObserver. Вы можете очень легко воссоздать тот же метод. Вы должны сослаться на исходный код для BaseAdapter, чтобы увидеть реализацию интерфейса ListAdapter. Вы можете найти его здесь по адресу grepcode. вы также должны включить в свой код метод add(object), чтобы сделать его более отзывчивым и пригодным для повторного использования.

реализация DataSetObserver

public class YourClass extends Something implements ListAdapter{
     private final DataSetObservable mObservable = new DataSetObservable();
     @Override
    public void registerDataSetObserver(DataSetObserver observer) {
        mObservable.registerObserver(observer);
    }

    @Override
    public void unregisterDataSetObserver(DataSetObserver observer) {
        mObservable.unregisterObserver(observer);
    }
    public void notifyDataSetChanged(){
        mObservable.notifyChanged();
    }
    public void notifyDataSetInvalidated(){
        mObservable.notifyInvalidated();
    }

добавление метода добавления

public void add(YourDataType object){ data.add(object);}

Самое интересное начинается с создания настоящего адаптера, который можно фильтровать, и вы должны посмотреть на grepcode для ArrayAdapter и увидеть все, что с ним связано. Одна из лучших вещей в Android — это открытый исходный код. Так что если сомневаетесь, читайте. Переменные говорят сами за себя, а примечания на высшем уровне.

person jmodine    schedule 28.01.2016