Обновление textview при действии после изменения данных в классе адаптера
у меня есть textview txtQuantity в моей активности панели мониторинга. Я написал отдельный класс для пользовательского адаптера, который будет содержать продаваемой продукции.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dashboard);
list = (ListView) findViewById(R.id.listSoldItems);
txtAmount = (TextView) findViewById(R.id.txtAmount);
txtItems = (TextView) findViewById(R.id.txtItems);
// init listview
adapter = new Sold_item_adaptor(Dashboard.this, soldItemsList);
list.setAdapter(adapter);
Я могу удалить элементы из списка с помощью адаптера. Код для удаления элементов записывается в класс адаптера.
public View getView(final int position, View convertView, ViewGroup parent) {
View vi = convertView;
if (convertView == null)
vi = inflater.inflate(R.layout.list_row_sold_item, null);
TextView txtListItem = (TextView) vi.findViewById(R.id.txtListItem);
final TextView txtQuantity = (TextView) vi.findViewById(R.id.txtQuantity);
ImageView imgCancel = (ImageView) vi.findViewById(R.id.imgCancel);
HashMap<String, String> mapData = new HashMap<String, String>();
mapData = data.get(position);
txtListItem.setText(mapData.get("product"));
txtQuantity.setText(mapData.get("qty"));
imgCancel.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
doButtonOneClickActions(txtQuantity, position);
}
});
return vi;
}
private void doButtonOneClickActions(TextView txtQuantity, int rowNumber) {
// Do the actions for Button one in row rowNumber (starts at zero)
data.remove(rowNumber);
notifyDataSetChanged();
}
в моей активности панели мониторинга я поддерживаю количество выбранных элементов, общую сумму. Теперь, если я удаляю элемент из listview, код из пользовательского адаптера удаляет элемент, но как я могу получить уведомление / сигнал на панели мониторинга для обновления количества.
4 ответов
предоставляя простой обратный вызов.
для этой работы напишите простой интерфейс в вашем адаптере
public interface OnDataChangeListener{
public void onDataChanged(int size);
}
и добавьте сеттер для слушателя (также в адаптере)
OnDataChangeListener mOnDataChangeListener;
public void setOnDataChangeListener(OnDataChangeListener onDataChangeListener){
mOnDataChangeListener = onDataChangeListener;
}
теперь добавьте дополнительный код в следующий блок в адаптере
private void doButtonOneClickActions(TextView txtQuantity, int rowNumber) {
...
if(mOnDataChangeListener != null){
mOnDataChangeListener.onDataChanged(data.size());
}
}
в вашей деятельности приборной панели вам необходимо зарегистрировать слушателя
protected void onCreate(Bundle savedInstanceState) {
...
adapter.setOnDataChangeListener(new Sold_item_adaptor.OnDataChangeListener(){
public void onDataChanged(int size){
//do whatever here
}
});
}
вот и все;).
основные идеи:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dashboard);
list = (ListView) findViewById(R.id.listSoldItems);
txtAmount = (TextView) findViewById(R.id.txtAmount);
txtItems = (TextView) findViewById(R.id.txtItems);
// init listview
adapter = new Sold_item_adaptor(Dashboard.this, soldItemsList,txtAmount);
list.setAdapter(adapter);
в адаптера:
public class MyAdapter extends ArrayAdapter<SoldItemsList > {
private Context context;
private mTotalQty;
private TextView mTxtAmountAdapter;
public OfferAdapter(Context context, int resource,SoldItemsList object,TextView txtAmount ) {
super(context, resource, objects);
this.context = context;
this.mTxtAmountAdapter = txtAmount;
}
//...
imgCancel.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
doButtonOneClickActions(position);
// update totalAmount
mTxtAmountAdapter.setText(Integer.valueOf(totalAmount).toString()));
}
});
imgPlus.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
qtyClickAction(position);
// update totalQty
mTxtAmountAdapter.setText(Integer.valueOf(totalAmount).toString()));
}
});
переопределить notifyDataSetChanged() в классе адаптера ... и делай, что хочешь ...
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
// Your code to nofify
}
Как я понимаю вопрос, вас интересует способ обновления пользовательского интерфейса вне адаптера после doButtonOneClickActions ();
самый простой способ-использовать https://github.com/greenrobot/EventBus
примеры можно найти здесь http://awalkingcity.com/blog/2013/02/26/productive-android-eventbus/
Если вы не хотите этого делать, вы можете создать обратный вызов http://android-er.blogspot.dk/2013/09/implement-callback-function-with.html