Вызвано: java .lang.ArrayIndexOutOfBoundsException: length = 1; index = 1 - PullRequest
0 голосов
/ 29 мая 2020

Я написал пользовательский список просмотра вместе с функцией поиска. Код выглядит следующим образом:

public class FaqActivity extends AppCompatActivity {
    ListView listView;
    ListViewAdapter adapter;
    String[] title;
    int[] icon;
    ArrayList<faqmodellist> arrayList = new ArrayList<>();

    private final String TAG =  FaqActivity.class.getCanonicalName();

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

        listView = findViewById(R.id.list_item);
        Toolbar toolbar = findViewById(R.id.toolbar);
        toolbar.setNavigationIcon(R.drawable.ic_n_back);
        setSupportActionBar(toolbar);

        title = new String[]{
                "Battery",
                "Cpu",
                "Display",
                "Memory",
                "Sensor"
        };
        icon = new int[]{R.drawable.ic_n_help};

        listView = findViewById(R.id.listView);

        for (int i = 0; i < title.length; i++) {
            faqmodellist model = new faqmodellist(title[i], icon[i]);
            Log.i(TAG, "onCreate: array is" + Arrays.toString(icon));
            //bind all strings in an array
            arrayList.add(model);
        }

        //pass results to listViewAdapter class
        adapter = new ListViewAdapter(this, arrayList);

        //bind the adapter to the listview
        listView.setAdapter(adapter);

    }

    @Override
    public boolean onCreatePanelMenu(int featureId, Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);

        MenuItem myActionMenuItem = menu.findItem(R.id.appSearchBar);
        final SearchView searchView = (SearchView) myActionMenuItem.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                if (TextUtils.isEmpty(s)) {
                    adapter.filter("");
                    listView.clearTextFilter();
                } else {
                    adapter.filter(s);
                }
                return true;
            }
        });
        return true;
    }

}  

Custom listview adapter:

public class ListViewAdapter extends BaseAdapter {

    private Context mContext;
    private LayoutInflater inflater;
    private List<faqmodellist> modellist;
    private ArrayList<faqmodellist> arrayList;

    public ListViewAdapter(Context context, List<faqmodellist> modellist) {
        mContext = context;
        this.modellist = modellist;
        inflater = LayoutInflater.from(mContext);
        this.arrayList = new ArrayList<>();
        this.arrayList.addAll(modellist);
    }

    public static class ViewHolder{
        TextView mTitleTv;
        ImageView mIconIv;
    }

    @Override
    public int getCount() {
        return modellist.size();
    }

    @Override
    public Object getItem(int i) {
        return modellist.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(final int position, View view, ViewGroup parent) {
        ViewHolder holder;
        if (view==null){
            holder = new ViewHolder();
            view = inflater.inflate(R.layout.item_listview, parent);

            //locate the views in row.xml
            holder.mTitleTv = view.findViewById(R.id.mainTitle);
            holder.mIconIv = view.findViewById(R.id.mainIcon);

            view.setTag(holder);

        }
        else {
            holder = (ViewHolder)view.getTag();
        }
        //set the results into textviews
        holder.mTitleTv.setText(modellist.get(position).getTitle());
        //set the result in imageview
        holder.mIconIv.setImageResource(modellist.get(position).getIcon());

        //listview item clicks
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (modellist.get(position).getTitle().equals("Battery")){
                    //start FaqAnswersActivity with title for actionbar and text for textview
                    Intent intent = new Intent(mContext, FaqAnswersActivity.class);
                    intent.putExtra("actionBarTitle", "Battery");
                    intent.putExtra("contentTv", "This is Battery detail...");
                    mContext.startActivity(intent);
                }
                if (modellist.get(position).getTitle().equals("Cpu")){
                    //start FaqAnswersActivity with title for actionbar and text for textview
                    Intent intent = new Intent(mContext, FaqAnswersActivity.class);
                    intent.putExtra("actionBarTitle", "Cpu");
                    intent.putExtra("contentTv", "This is Cpu detail...");
                    mContext.startActivity(intent);
                }
                if (modellist.get(position).getTitle().equals("Display")){
                    //start FaqAnswersActivity with title for actionbar and text for textview
                    Intent intent = new Intent(mContext, FaqAnswersActivity.class);
                    intent.putExtra("actionBarTitle", "Display");
                    intent.putExtra("contentTv", "This is Display detail...");
                    mContext.startActivity(intent);
                }
                if (modellist.get(position).getTitle().equals("Memory")){
                    //start FaqAnswersActivity with title for actionbar and text for textview
                    Intent intent = new Intent(mContext, FaqAnswersActivity.class);
                    intent.putExtra("actionBarTitle", "Memory");
                    intent.putExtra("contentTv", "This is Memory detail...");
                    mContext.startActivity(intent);
                }
                if (modellist.get(position).getTitle().equals("Sensor")){
                    //start FaqAnswersActivity with title for actionbar and text for textview
                    Intent intent = new Intent(mContext, FaqAnswersActivity.class);
                    intent.putExtra("actionBarTitle", "Sensor");
                    intent.putExtra("contentTv", "This is Sensor detail...");
                    mContext.startActivity(intent);
                }
            }
        });


        return view;
    }

    //filter
    public void filter(String charText){
        charText = charText.toLowerCase(Locale.getDefault());
        modellist.clear();
        if (charText.length()==0){
            modellist.addAll(arrayList);
        }
        else {
            for (faqmodellist model : arrayList){
                if (model.getTitle().toLowerCase(Locale.getDefault()).contains(charText)){
                    modellist.add(model);
                }
            }
        }
        notifyDataSetChanged();
    }

}  

Когда я запускаю этот код, я получаю эту ошибку:

Вызвано: java .lang.ArrayIndexOutOfBoundsException: length = 1; index = 1
в com.dell.helpmodule.screen.ui.activity.FaqActivity.onCreate (FaqActivity. java: 52)
в android .app.Activity.performCreate (Activity. java : 7893)
в android .app.Activity.performCreate (Activity. java: 7880)
в android .app.Instrumentation.callActivityOnCreate (Instrumentation. java: 1307)
в android .app.ActivityThread.performLaunchActivity (ActivityThread. java: 3279)
в android .app.ActivityThread.handleLaunchActivity (ActivityThread. java: 3443)
в android .app .servertransaction.LaunchActivityItem.execute (LaunchActivityItem. java: 83)
в android .app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor. java: 135)
в android .app.servertransaction .TransactionExecutor.execute (TransactionExecutor. java: 95)
в android .app.ActivityThread $ H.handleMessage (ActivityThread. java: 2040)
в android .os.Handler.dispatchMessage (Обработчик. java: 107)
в android .os.Looper.l oop (Looper. java: 224)
в android .app.ActivityThread.main (ActivityThread. java: 7520)
в java .lang.reflect.Method.invoke (собственный метод)
в com. android .internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit. java: 539)
в com. android .internal.os.ZygoteInit.main (ZygoteInit. java: 950)

В массиве изображений всего один элемент, и массив начинается с позиции 0. Как исправить ошибку?

1 Ответ

1 голос
/ 29 мая 2020

У вас есть только 1 элемент в массиве значков .. если вы хотите добавить такой же значок ко всем элементам faqModelList, вы должны заменить инициализацию вашей модели в l oop на:

faqmodellist model = new faqmodellist(title[i], R.drawable.ic_n_help);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...