1

Я использую 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); 
    } 
} 
+0

сделать еще одну асинтезу и нажать на кнопку, потому что в вашей асинтеграции вы делаете адаптер = null, что делает добавление в listview, а не замену. –

ответ

0

Вы используете .addAll(), который добавляет данные в данные, которые уже имеет адаптер. Быстрое исправление заключается в том, чтобы просто удалить все данные до вызова .addAll() с помощью .clear().

//... 
this.businesses.clear(); 
this.businesses.addAll(businesses); 
adapter.notifyDataSetChanged(); 
//... 
+0

Это похоже на проблему, но проблема в том, что я должен использовать OnClickListener и добавлять данные в прокрутку, делая предыдущие данные еще доступными. Как я могу это достичь. У меня есть одна AsyncTask для выполнения всех этих функций, поскольку возвращаемые данные одинаковы. Как определить, вызван ли вызов, вызванный кнопкой поиска на панели инструментов или onScrollListener, или результатом поиска по умолчанию (результат сначала заполняется при запуске активности)? – carefree

+0

Прошу продумать то, что вы хотите достичь, и задать новый вопрос SO относительно этой конкретной проблемы. – mach

+0

Спасибо, я решил проблему (с вашим ответом), задав статическую переменную и применив условие, основанное на значении этой переменной. – carefree

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

  • Нет связанных вопросов^_^