Я использую ListView
, который заполнен пользовательским адаптером, который расширяет BaseAdapter
. Данные извлекаются из внешнего сервера с AsyncTask
и методом onPostExecute из AsyncTask
вызывает метод ListActivity
, который устанавливает адаптер для отображения данныхОбновить ListView с пользовательским адаптером, который расширяет BaseAdapter
ListView
также реализует OnScrollListener
для извлечения данных на свитке и добавить в нижнюю части.
Я ActionBar
(Toolbar
) с пользовательской точки зрения, которая содержит EditText
поля и Button
по щелчку из которых, опять-таки, это же AsyncTask
призван принести новые данные со значениями запроса, переданных из Toolbar
.
Проблема в том, что нажата кнопка на панели инструментов. Я хочу, чтобы ListView
был заполнен полностью новыми данными, заменяющими старые значения, но вместо этого новые данные добавляются в нижней части списка (как если бы вызывается OnClickListener
).
Link1 Я проверил, Link2 но никто не похоже, чтобы помочь
И конечно главный удар будет использовать NotifyDataSetChange
, и я использую это тоже, но не стоит.
Мой метод для установки адаптера
public void setBusinesses(ArrayList<BusinessListData> businesses) {
imgFetcher = new BusinessListIconTask(this);
layoutInflator = LayoutInflater.from(this);
if (this.businesses == null || adapter == null) {
this.businesses = new ArrayList<>();
adapter = new BusinessListDataAdapter(this, imgFetcher,
layoutInflator, this.businesses);
businessList.setAdapter(adapter);
}
this.businesses.addAll(businesses);
adapter.notifyDataSetChanged();
/* Activates when scrolling to bottom of list */
businessList.setOnScrollListener(new OnScrollListener() {
public int currentScrollState;
public int currentFirstVisibleItem;
public int currentVisibleItemCount;
public int totalItemCount;
public int lastItem;
boolean isLoading = false;
public void onScrollStateChanged(AbsListView view, int scrollState) {
this.currentScrollState = scrollState;
this.isScrollCompleted();
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
this.currentFirstVisibleItem = firstVisibleItem;
this.currentVisibleItemCount = visibleItemCount;
this.totalItemCount = totalItemCount;
this.lastItem = firstVisibleItem + visibleItemCount;
}
private void isScrollCompleted() {
if (this.lastItem == this.totalItemCount) {
/*** In this way I detect if there's been a scroll which has completed ***/
if (!isLoading) {
isLoading = true;
getScrollData(metroTxt, metroLoc, metroId);
}
} else {
businessList.removeFooterView(footerView);
}
}
});
}
настройки пользовательской панели инструментов с поисковыми полями
void showCustomView(String metroTxt, String metroLoc, String metroId) {
LayoutInflater mInflater = LayoutInflater.from(this);
if (mCustomView == null)
mCustomView = mInflater.inflate(R.layout.custom_action_bar, null);
mToolbar.removeView(mCustomView);
mToolbar.addView(mCustomView);
Log.d("I'm inside custom view", "txt" + metroTxt);
abKeyword = (CustomAutoCompleteTextView) mCustomView
.findViewById(R.id.ab_keyword);
abLocation = (CustomAutoCompleteTextView) mCustomView
.findViewById(R.id.ab_location);
ab_search = (Button) mCustomView
.findViewById(R.id.ab_search);
abKeyword.append(metroTxt);
abLocation.setVisibility(View.GONE);
ab_search.setVisibility(View.GONE);
abKeyword.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus || !abKeyword.getText().toString().isEmpty() || !abLocation.getText().toString().isEmpty()) {
abLocation.setVisibility(View.VISIBLE);
ab_search.setVisibility(View.VISIBLE);
} else {
abLocation.setVisibility(View.GONE);
ab_search.setVisibility(View.GONE);
}
}
});
abKeyword.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable editable) {
// TODO Auto-generated method stub
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
String newText = s.toString();
BusinessInfoSuggestionTask autocompleteTask = new BusinessInfoSuggestionTask(BusinessResultListActivity.this);
String acType = "keyword";
if (s.length() >= 1) {
abLocation.setVisibility(View.VISIBLE);
ab_search.setVisibility(View.VISIBLE);
autocompleteTask.execute(newText, acType, cActivity);
} else {
abLocation.setVisibility(View.GONE);
ab_search.setVisibility(View.GONE);
}
}
});
ab_search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
String abKey = abKeyword.getText().toString();
String abLoc = abLocation.getText().toString();
String abId = "";
getBusinesses(abKey, abLoc, abId);
Log.d("I'm clicked", "button on toolbar clicked");
}
});
}
Методы получения данных с сервера
/* Get Businesses data from server */
private void getBusinesses(String metroTxt, String metroLoc, String metroId) {
// TODO Auto-generated method stub
String first = "first";
BusinessListApiTask spTask = new BusinessListApiTask(
BusinessResultListActivity.this);
try {
spTask.execute(metroTxt, metroLoc, metroId, first);
} catch (Exception e) {
spTask.cancel(true);
}
}
/* Fetch more data on scroll */
private void getScrollData(String metroTxt, String metroLoc, String metroId) {
// TODO Auto-generated method stub
String first = "next";
BusinessListApiTask spTask = new BusinessListApiTask(
BusinessResultListActivity.this);
try {
spTask.execute(metroTxt, metroLoc, metroId, first); //Call AsyncTask to fetch data from server
} catch (Exception e) {
spTask.cancel(true);
}
}
сделать еще одну асинтезу и нажать на кнопку, потому что в вашей асинтеграции вы делаете адаптер = null, что делает добавление в listview, а не замену. –