2017-09-16 4 views
-2

Dans ma demande je veux obtenir une liste du serveur et afficher cette liste dans ChipCloud. ChipCloud a Tag bibliothèque. Link Library:https://github.com/adroitandroid/ChipCloud
.i Écrivons ci-dessous le code, mais lorsque l'application exécuter lorsque cliquez sur les éléments ci-dessous me montrer erreur:Comment puis-je corriger java.lang.IndexOutOfBoundsException: index non valide dans ArrayList sur Android

java.lang.IndexOutOfBoundsException: Invalid index 11, size is 6 
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
at java.util.ArrayList.get(ArrayList.java:308) 
at com.example.com.Activities.FullSearchMini$2$5.chipSelected(FullSearchMini.java:286) 
at com.adroitandroid.chipcloud.ChipCloud.chipSelected(ChipCloud.java:253) 
at com.adroitandroid.chipcloud.Chip.onClick(Chip.java:138) 
at android.view.View.performClick(View.java:4764) 
at android.view.View$PerformClick.run(View.java:19844) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5349) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703) 

Mes codes:

public class FullSearchMini extends AppCompatActivity { 

@BindView(R.id.miniFullSearch_toolbarText) 
EditText fullSearchMini_headerText; 
@BindView(R.id.fullSearchMini_celebritiesRecyclerView) 
RecyclerView fullSearchMini_celebritiesRecyclerView; 
@BindView(R.id.miniFullSearch_movieRecyclerView) 
RecyclerView miniFullSearch_movieRecyclerView; 
@BindView(R.id.miniFullSearch_SeriesRecyclerView) 
RecyclerView miniFullSearch_SeriesRecyclerView; 
@BindView(R.id.miniFullSearch_UserRecyclerView) 
RecyclerView miniFullSearch_UserRecyclerView; 
@BindViews({R.id.fullSearchMini_celebritiesHeaderLay, R.id.miniFullSearch_movieHeaderLay, R.id.miniFullSearch_SeriesHeaderLay, 
     R.id.miniFullSearch_UserHeaderLay}) 
List<RelativeLayout> miniSearchLayouts; 
@BindViews({R.id.celebritiesLine, R.id.moviesLine, R.id.SeriesLine}) 
List<RelativeLayout> miniSearchLines; 
@BindView(R.id.fullSearchMini_didYouMeanLay) 
RelativeLayout fullSearchMini_didYouMeanLay; 
@BindView(R.id.miniFullSearch_LoadLay) 
RelativeLayout miniFullSearch_LoadLay; 
@BindView(R.id.fullSearchMini_chipCloud) 
ChipCloud fullSearchMini_chipCloud; 
@BindView(R.id.fullSearchMini_EmptyLay) 
RelativeLayout fullSearchMini_EmptyLay; 
@BindView(R.id.empty_text) 
TextView empty_text; 
@BindView(R.id.miniFullSearch_LoadProgress) 
ProgressBar miniFullSearch_LoadProgress; 
private Context context; 
private MiniSearchCelebritiesAdapter celebritiesAdapter; 
private MiniSearchMoviesAdapter moviesAdapter; 
private MiniSearchSeriesAdapter seriesAdapter; 
private MiniSearchUsersAdapter userAdapter; 
private List<Celebrity> celebritiesModel = new ArrayList<>(); 
private List<Movie> moviesModel = new ArrayList<>(); 
private List<Series> seriesModel = new ArrayList<>(); 
private List<User> userModel = new ArrayList<>(); 
private String searchKey, chipKey; 
private List<String> cloudChipList = new ArrayList<>(); 
private String[] mostlyMatchedKeywordsStrings; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_mini_full_search); 

    // Initialize 
    ButterKnife.bind(this); 
    context = this; 

    //Set Color to progressBar 
    miniFullSearch_LoadProgress.getIndeterminateDrawable().setColorFilter(Color.parseColor("#ff8d00"), 
      android.graphics.PorterDuff.Mode.SRC_ATOP); 

    celebritiesAdapter = new MiniSearchCelebritiesAdapter(context, celebritiesModel); 
    moviesAdapter = new MiniSearchMoviesAdapter(context, moviesModel); 
    seriesAdapter = new MiniSearchSeriesAdapter(context, seriesModel); 
    userAdapter = new MiniSearchUsersAdapter(context, userModel); 

    initRecyclerView(fullSearchMini_celebritiesRecyclerView); 
    initRecyclerView(miniFullSearch_movieRecyclerView); 
    initRecyclerView(miniFullSearch_SeriesRecyclerView); 
    initRecyclerView(miniFullSearch_SeriesRecyclerView); 
    initRecyclerView(miniFullSearch_UserRecyclerView); 

    // TextWatcher 
    fullSearchMini_headerText.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) { 

     } 

     @Override 
     public void afterTextChanged(Editable editable) { 
      searchKey = editable.toString(); 
      if (searchKey.length() > 1) { 
       getData(searchKey); 
      } 
     } 
    }); 
} 

private void getData(String key) { 
    FullSearchSendData sendData = new FullSearchSendData(); 
    sendData.setKey(key); 
    sendData.setLoadImages(true); 
    sendData.setSearchInCelebrities(true); 
    sendData.setSearchInMovies(true); 
    sendData.setSearchInSeries(true); 
    sendData.setSearchInEpisodes(false); 
    sendData.setSearchInUsers(true); 
    sendData.setPageIndex(1); 
    sendData.setPageSize(4); 
    sendData.setMaxDistance(1); 

    miniFullSearch_LoadLay.setVisibility(View.VISIBLE); 

    InterfaceApi api = ApiClient.getClient().create(InterfaceApi.class); 
    Call<FullSearchResponse> call = api.getFullSearch(sendData); 

    call.enqueue(new Callback<FullSearchResponse>() { 
     @Override 
     public void onResponse(Call<FullSearchResponse> call, Response<FullSearchResponse> response) { 
      FullSearchResponse searchResponse = response.body(); 
      if (searchResponse.getData().getCelebrities() != null) { 
       if (searchResponse.getData().getCelebritiesCount() > 0) { 
        celebritiesModel.clear(); 
        celebritiesModel.addAll(searchResponse.getData().getCelebrities()); 
        celebritiesAdapter.notifyDataSetChanged(); 
        fullSearchMini_celebritiesRecyclerView.setAdapter(celebritiesAdapter); 
        miniSearchLayouts.get(0).setVisibility(View.VISIBLE); 
        miniSearchLines.get(0).setVisibility(View.VISIBLE); 
        fullSearchMini_celebritiesRecyclerView.setVisibility(View.VISIBLE); 

        miniSearchLayouts.get(0).setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View view) { 
          Intent intent = new Intent(context, FullSearch.class); 
          intent.putExtra(ExtraContains.FULL_SEARCH_TEXT.name(), searchKey); 
          startActivity(intent); 
         } 
        }); 
       } else { 
        miniSearchLayouts.get(0).setVisibility(View.GONE); 
        miniSearchLines.get(0).setVisibility(View.GONE); 
        fullSearchMini_celebritiesRecyclerView.setVisibility(View.GONE); 
       } 
      } 
      if (searchResponse.getData().getMovies() != null) { 
       if (searchResponse.getData().getMoviesCount() > 0) { 
        moviesModel.clear(); 
        moviesModel.addAll(searchResponse.getData().getMovies()); 
        moviesAdapter.notifyDataSetChanged(); 
        miniFullSearch_movieRecyclerView.setAdapter(moviesAdapter); 
        miniSearchLayouts.get(1).setVisibility(View.VISIBLE); 
        miniSearchLines.get(1).setVisibility(View.VISIBLE); 
        miniFullSearch_movieRecyclerView.setVisibility(View.VISIBLE); 

        miniSearchLayouts.get(1).setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View view) { 
          Intent intent = new Intent(context, FullSearch.class); 
          intent.putExtra(ExtraContains.FULL_SEARCH_TEXT.name(), searchKey); 
          startActivity(intent); 
         } 
        }); 
       } else { 
        miniSearchLayouts.get(1).setVisibility(View.GONE); 
        miniSearchLines.get(1).setVisibility(View.GONE); 
        miniFullSearch_movieRecyclerView.setVisibility(View.GONE); 
       } 
      } 
      if (searchResponse.getData().getSeries() != null) { 
       if (searchResponse.getData().getSeriesCount() > 0) { 
        seriesModel.clear(); 
        seriesModel.addAll(searchResponse.getData().getSeries()); 
        seriesAdapter.notifyDataSetChanged(); 
        miniFullSearch_SeriesRecyclerView.setAdapter(seriesAdapter); 
        miniSearchLayouts.get(2).setVisibility(View.VISIBLE); 
        miniSearchLines.get(2).setVisibility(View.VISIBLE); 
        miniFullSearch_SeriesRecyclerView.setVisibility(View.VISIBLE); 

        miniSearchLayouts.get(2).setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View view) { 
          Intent intent = new Intent(context, FullSearch.class); 
          intent.putExtra(ExtraContains.FULL_SEARCH_TEXT.name(), searchKey); 
          startActivity(intent); 
         } 
        }); 
       } else { 
        miniSearchLayouts.get(2).setVisibility(View.GONE); 
        miniSearchLines.get(2).setVisibility(View.GONE); 
        miniFullSearch_SeriesRecyclerView.setVisibility(View.GONE); 
       } 
      } 
      if (searchResponse.getData().getUsers() != null) { 
       if (searchResponse.getData().getUsersCount() > 0) { 
        userModel.clear(); 
        userModel.addAll(searchResponse.getData().getUsers()); 
        userAdapter.notifyDataSetChanged(); 
        miniFullSearch_UserRecyclerView.setAdapter(userAdapter); 
        miniSearchLayouts.get(3).setVisibility(View.VISIBLE); 
        miniFullSearch_UserRecyclerView.setVisibility(View.VISIBLE); 

        miniSearchLayouts.get(3).setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View view) { 
          Intent intent = new Intent(context, FullSearch.class); 
          intent.putExtra(ExtraContains.FULL_SEARCH_TEXT.name(), searchKey); 
          startActivity(intent); 
         } 
        }); 
       } else { 
        miniSearchLayouts.get(3).setVisibility(View.GONE); 
        miniFullSearch_UserRecyclerView.setVisibility(View.GONE); 
       } 
      } 

      // Did you mean 
      String[] mostlyMatchedKeywordsStrings = searchResponse.getData().getMostlyMatchedKeywordsText(); 
      cloudChipList.clear(); 
      for (int i = 0; i < mostlyMatchedKeywordsStrings.length; i++) { 
       cloudChipList.add(mostlyMatchedKeywordsStrings[i]); 
       if (i >= mostlyMatchedKeywordsStrings.length - 2) { 
        fullSearchMini_didYouMeanLay.setVisibility(View.VISIBLE); 
        fullSearchMini_chipCloud.addChip(mostlyMatchedKeywordsStrings[i]); 

        Log.e("searchKeys", mostlyMatchedKeywordsStrings[i]); 
       } 
      } 

      fullSearchMini_chipCloud.setChipListener(new ChipListener() { 
       @Override 
       public void chipSelected(int i) { 
        chipKey = cloudChipList.get(i); 
        Intent intent = new Intent(context, FullSearch.class); 
        intent.putExtra(ExtraContains.FULL_SEARCH_TEXT.name(), chipKey); 
        startActivity(intent); 

       } 

       @Override 
       public void chipDeselected(int i) { 

       } 
      }); 

      if (searchResponse.getData().getCelebrities().size() == 0 && searchResponse.getData().getSeries().size() == 0 
        && searchResponse.getData().getMovies().size() == 0 && searchResponse.getData().getUsers().size() == 0) { 
       fullSearchMini_EmptyLay.setVisibility(View.VISIBLE); 
       empty_text.setText(context.getResources().getString(R.string.noResultFound) + " for : " + searchKey); 
      } else { 
       fullSearchMini_EmptyLay.setVisibility(View.GONE); 
      } 

      miniFullSearch_LoadLay.setVisibility(View.GONE); 
     } 

     @Override 
     public void onFailure(Call<FullSearchResponse> call, Throwable t) { 
      miniFullSearch_LoadLay.setVisibility(View.GONE); 
     } 
    }); 
} 

Montrez-moi erreur ci-dessus pour cette ligne:

chipKey = cloudChipList.get(i); 

Comment réparer cette erreur? S'il vous plaît aidez-moi mon ami. J'ai vraiment besoin de ton aide. s'il vous plaît

Répondre

0

l'erreur, il dit,

Invalid index 11, size is 6 

Cela signifie que le nombre réel d'éléments dans votre cloudChipList est seulement 6. C'est, votre fonction searchResponse.getData().getMostlyMatchedKeywordsText(); retourne seulement 6 valeurs et puis son stockées dans la liste de tableau . Mais quand vous appelez la fonction public void chipSelected(int i), si la valeur de i est plus de 5 alors il montrera cette java.lang.IndexOutOfBoundsException. Si vous avez 6 valeurs dans votre liste de tableau alors vous pouvez seulement fournir la valeur d'index de 0 à 5. Dans votre cas, la valeur de i dans public void chipSelected(int i) est 11 et donc l'erreur.

+0

pouvez-vous me envoyer le code vrai? s'il vous plaît mon ami, je suis amateur et j'ai vraiment besoin de votre aide. s'il te plaît mon frère. s'il vous plaît – Jonk

+0

je veux montrer seulement 2 article de la liste – Jonk

+0

pouvez-vous mettre à jour le code complet dans la question? Peut-être que ce sera utile pour identifier où le problème est –

0

L'index de la méthode schipSelected est calculé dans la classe ChipCloud.

fullSearchMini_chipCloud.setChipListener(new ChipListener() { 
      @Override 
      public void chipSelected(int i) { //This is callback from ChipCloud class 
       chipKey = cloudChipList.get(i); 
      } 

      @Override 
      public void chipDeselected(int i) { 

      } 
     }); 

La mise en page fullSearchMini_chipCloud est ajouté des puces en double. Vous devez effacer les enfants existants avant d'ajouter de nouveaux jetons.

Après avoir nettoyé la liste avec

cloudChipList.clear(); 

Retirer Childs existants avec

fullSearchMini_chipCloud.removeAllViews() 
+0

pouvez-vous envoyer moi votre Skype ID? pour voir les codes de projet complet s'il vous plaît mon frère – Jonk

+0

pouvez-vous m'aider mon ami ? – Jonk