2016-08-05 2 views
0

Я пытаюсь сделать ListView с пользовательским ArrayAdapter. Когда я использую оригинальный ArrayList она работает нормально, но когда я обновляю ArrayList и использовать notifyDataSetChanged(), чтобы обновить значения в ListView аварий приложение и возвращает мне ошибку: Invalid index 4, size is 4Android - Пользовательский ArrayAdapter с проблемами с индексами

Вот мой код

private void configuraPaisesAdapter() { 

    paisesAdapter = new ArrayAdapter<PaisCodigo>(this, R.layout.layout_duas_linhas_cell, paisesFiltrado) { 

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

      View row = convertView; 

      if(convertView == null){ 
       LayoutInflater inflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       row = inflater.inflate(R.layout.layout_duas_linhas_cell, null); 
      } 

      PaisCodigo pais = paisesFiltrado.get(position); 

      if(pais != null) { 
       TextView layoutDuasLinhasLinha1 = (TextView) row.findViewById(R.id.layoutDuasLinhasLinha1); 
       TextView layoutDuasLinhasLinha2 = (TextView) row.findViewById(R.id.layoutDuasLinhasLinha2); 
       ImageView layoutDuasLinhasCheckMark = (ImageView) row.findViewById(R.id.layoutDuasLinhasCheckMark); 

       layoutDuasLinhasLinha1.setText(pais.getNome()); 

       layoutDuasLinhasCheckMark.setVisibility(View.INVISIBLE); 

       if (pais.getNome().equals(pais.getNomeIngles())) { 
        layoutDuasLinhasLinha2.setVisibility(View.GONE); 

       } else { 
        layoutDuasLinhasLinha2.setVisibility(View.VISIBLE); 
        layoutDuasLinhasLinha2.setText(pais.getNomeIngles()); 
       } 

       if(paisSelecionado != null) { 
        if(paisSelecionado.getObjectId().equals(pais.getObjectId())) { 
         layoutDuasLinhasCheckMark.setVisibility(View.VISIBLE); 
        } else { 
         layoutDuasLinhasCheckMark.setVisibility(View.INVISIBLE); 
        } 
       } 
      } 

      return row; 
     } 

     @Override 
     public Filter getFilter() { 

      final Filter paisesFilter = new Filter() { 
       @Override 
       protected FilterResults performFiltering(CharSequence charSequence) { 

        FilterResults resultadoPaisesFiltrado = new FilterResults(); 

        if(charSequence != null && charSequence.length() > 0) { 
         ArrayList<PaisCodigo> paisesTemp = new ArrayList<PaisCodigo>(); 

         for(PaisCodigo pais : paises) { 
          if(pais.getNome().toLowerCase().contains(charSequence.toString().toLowerCase()) || pais.getNomeIngles().toLowerCase().contains(charSequence.toString().toLowerCase())) { 
           paisesTemp.add(pais); 

           System.out.println(pais.getNome()); 
          } 
         } 

         resultadoPaisesFiltrado.values = paisesTemp; 
         resultadoPaisesFiltrado.count = paisesTemp.size(); 
        } else { 
         resultadoPaisesFiltrado.values = paises; 
         resultadoPaisesFiltrado.count = paises.size(); 
        } 

        return resultadoPaisesFiltrado; 
       } 

       @Override 
       protected void publishResults(CharSequence charSequence, FilterResults filterResults) { 

        System.out.println(filterResults.count); 

        if(filterResults.count > 0) { 
         paisesFiltrado = (ArrayList<PaisCodigo>) filterResults.values; 

         notifyDataSetChanged(); 
        } else { 
         notifyDataSetInvalidated(); 
        } 
       } 
      }; 

      return paisesFilter; 
     } 
    }; 

    paisesListView.setAdapter(paisesAdapter); 
} 

И поиск EditText конфигурации.

private void configuraControladorDeBusca() { 

    controladorDeBuscaEditText.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

      paisesAdapter.getFilter().filter(charSequence); 

      if(controladorDeBuscaEditText.getText().toString().isEmpty()) { 
       limparBuscaButton.setVisibility(View.INVISIBLE); 
      } else { 
       limparBuscaButton.setVisibility(View.VISIBLE); 
      } 
     } 

     @Override 
     public void afterTextChanged(Editable editable) { 

     } 
    }); 
} 

Заранее благодарен.

+0

использовать этот универсальный адаптер: https://gist.github.com/pskink/2dd4d17a93caf02ff696533e82f952b0 – pskink

ответ

0

Решено. Необходимо реализовать

@Override 
public int getCount() { 
    return paisesFiltrado.size(); 
} 
+0

почему вы создать пользовательские 'Filter' вместо использования адаптера, который уже реализует' Filterable'? – pskink

+0

Ну, я новое программирование в Android. Это то, что я впервые нашел. Я собираюсь взглянуть на опции «Filterable» – GuiDupas

+0

просто посмотрите на адаптер, который я разместил, используйте его как 'new MatchableArrayAdapter (это, R.layout.layout_duas_linhas_cell, paisList) {...' – pskink