2017-09-16 92 views
-2

在我的應用我想從服務器獲取一些列表,並出示該列表分爲ChipCloudChipCloud標籤庫。 庫鏈接:https://github.com/adroitandroid/ChipCloud
。我寫下面的代碼,但是當點擊物品告訴我下面錯誤運行應用程序時:如何解決java.lang.IndexOutOfBoundsException:ArrayList中無效的指數在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) 

我的代碼:

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); 
     } 
    }); 
} 

告訴我此線以上錯誤:

chipKey = cloudChipList.get(i); 

我該如何解決這個錯誤?請幫我我的朋友。我真的需要你的幫助。請

回答

0

在它說的錯誤,

Invalid index 11, size is 6 

這意味着在你的cloudChipList元素的實際數量只有6也就是說,你searchResponse.getData().getMostlyMatchedKeywordsText();函數只返回6個值然後將其存放在數組列表。但是當您撥打public void chipSelected(int i)功能時,如果i的值大於5,則會顯示此java.lang.IndexOutOfBoundsException。如果您的數組列表中有6個值,那麼您只能提供從0到5的索引值。在您的情況下,public void chipSelected(int i)中的i的值是11,因此是錯誤。

+0

你能送我真正的代碼?請我的朋友,我是業餘的,真的需要你的幫助。請我的兄弟。請 – Jonk

+0

我想顯示列表中的項目 – Jonk

+0

只有2項可以更新問題中的完整代碼嗎?也許這將有助於確定問題的出處 –

0

schipSelected方法的索引正在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) { 

      } 
     }); 

fullSearchMini_chipCloud佈局被加入一式兩份的芯片。在添加新芯片之前,您需要清除現有的孩子。

清除與

cloudChipList.clear(); 

列表後刪除現有孩子的用

fullSearchMini_chipCloud.removeAllViews() 
+0

你可以發給我你的Skype賬號嗎?看看你的全部項目代碼。請問我的兄弟 – Jonk

+0

你能幫我嗎? ? – Jonk

相關問題