Возможный дубликат:
Есть ли способ вызвать notifyDataSetChanged() из основного действия для пользовательского адаптера элемента внутри другого пользовательского адаптера?
у меня есть два адаптера listarray A и B. «A» содержит несколько кнопок, которые при нажатии должны обрабатывать данные, присутствующие в «B», а затем уведомлять адаптер «B» о том, что произошли некоторые изменения, так что «B» обновляется и отображает новые данные . Я вижу, что эта проблема задавалась ранее -custom">здесь в SO. Но решение не дает адекватной информации.
Спасибо за решение... Я попытался реализовать это, но он не распознает, какая кнопка была нажата (он рассматривает весь список как один объект). Кроме того, он также не обновляет содержимое списка, хотя я пытался сохранить сортировку по умолчанию.
headerListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View v, int arg2,
long arg3) {
sorter = new TwoWaySorter();
Message msg = new Message();
Log.i("Click","arg0.getId():"+arg0.getId());
Log.i("Click", v.getId() + " id is " + v.toString());
Log.i("Click","arg2:"+arg2+" arg3:"+arg3);
switch (v.getId()) {
case R.id.headerList_quantity: // perform sort over the quantity
Log.i("Click", "qty clicked");
System.out.println("..Item is clicked..");
msg.what = UPDATE_QTY;
updateListHandler.sendMessage(msg);
//sorter.sortBasedOn(contentList, "symQty");
//contentAdapter.notifyDataSetChanged();
break;
case R.id.headerList_price: // perform sort over price
Log.i("Click", "list price clicked");
msg.what = UPDATE_PRICE;
updateListHandler.sendMessage(msg);
//sorter.sortBasedOn(contentList, "price");
//contentAdapter.notifyDataSetChanged();
break;
}
}});
private Handler updateListHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_LIST:
sorter = new TwoWaySorter();
Log.i("Click", "sort based on priceYesterday");
sorter.sortBasedOn(contentList, "priceYesterday");
contentAdapter.notifyDataSetChanged();
break;
}
}};
Кроме того, на всякий случай вы хотите увидеть адаптер. Обратите внимание, что для TextView установлено значение setClickable="true"
public class HeaderAdapter extends ArrayAdapter<Header> {
final Header[] listSymbols;
private TwoWaySorter sorter;
private Vector<Content> contentList;
//private ArrayAdapter<Content> contentAdapter;
public HeaderAdapter(Context context, int symResourceID, Header[] objects,
Vector<Content> contentList, ArrayAdapter<Content> contentAdapter) {
super(context, symResourceID, objects);
listSymbols = objects;
sorter = new TwoWaySorter();
this.contentList = contentList;
//this.contentAdapter = contentAdapter;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.twoway_header_right, parent, false);
}
Header headerRec = listSymbols[position];
TextView symQty = (TextView) row.findViewById(R.id.headerList_quantity);
symQty.setText("" + headerRec.symQty);
Log.i("Click","symQty id"+symQty.getId());
//symQty.setOnClickListener(this);
TextView symPx = (TextView) row.findViewById(R.id.headerList_price);
symPx.setText("" + headerRec.price);
Log.i("Click","symPx id"+symPx.getId());
//symPx.setOnClickListener(this);
TextView symPxC = (TextView) row
.findViewById(R.id.headerList_priceChange);
symPxC.setText("" + headerRec.priceYesterday);
// symPxC.setOnClickListener(this);
TextView symVal = (TextView) row.findViewById(R.id.headerList_value);
symVal.setText("" + headerRec.daysGain);
// symVal.setOnClickListener(this);
TextView symValC = (TextView) row
.findViewById(R.id.headerList_valueChange);
symValC.setText("" + headerRec.daysGainPercent);
// symQty.setOnClickListener(this);
TextView symValCP = (TextView) row
.findViewById(R.id.headerList_valueChangePercent);
symValCP.setText("" + headerRec.change);
// symQty.setOnClickListener(this);
TextView symQuote = (TextView) row.findViewById(R.id.headerList_quote);
symQuote.setText("" + headerRec.week52High);
// symQty.setOnClickListener(this);
row.setBackgroundColor(R.color.light_gray);
return row;
}
/*@Override
public void onClick(View v) {
Log.i("Click", v.getId() + " " + v.toString());
switch (v.getId()) {
case R.id.headerList_quantity: // perform sort over the quantity
Log.i("Click", "qty clicked");
sorter.sortBasedOn(contentList, "symQty");
MainActivity.contentAdapter.notifyDataSetChanged();
break;
case R.id.headerList_price: // perform sort over price
Log.i("Click", "list price clicked");
sorter.sortBasedOn(contentList, "price");
MainActivity.contentAdapter.notifyDataSetChanged();
break;
case R.id.headerList_priceChange: // perform sort over price change
sorter.sortBasedOn(contentList, "priceYesterday");
MainActivity.contentAdapter.notifyDataSetChanged();
Log.i("Click", "price change clicked");
break;
case R.id.headerList_value:
Log.i("Click", "list value clicked");
sorter.sortBasedOn(contentList, "change");
MainActivity.contentAdapter.notifyDataSetChanged();
break;
case R.id.headerList_valueChange:
Log.i("Click", "value change clicked");
sorter.sortBasedOn(contentList, "daysGain");
MainActivity.contentAdapter.notifyDataSetChanged();
break;
case R.id.headerList_valueChangePercent:
Log.i("Click", "change percent clicked");
sorter.sortBasedOn(contentList, "daysGainPercent");
MainActivity.contentAdapter.notifyDataSetChanged();
break;
case R.id.headerList_quote:
Log.i("Click", "return clicked");
sorter.sortBasedOn(contentList, "returns");
MainActivity.contentAdapter.notifyDataSetChanged();
break;
//}
*/ //} }