onItemCheckStateChanged中的setBackgroundResource不适用于第一次选择

问题描述 投票:0回答:1

我正在开发一个Android项目,我有一个网格视图,我正在使用MultiChoiceModeListener进行设置。

当我长按时,它成功创建了上下文操作栏,但在创建CAB的初始项目上设置setBackgroundResource没有任何影响,但是所有后续项目都被选中,后台资源已成功应用。以下是我使用的代码:

gridView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
        gridView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener()
        {

            @Override
            public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked)
            {
                Log.d("DirectoryPicker-CAB", "CheckedStateChanged");
                //findViewById((int)gridView.getItemIdAtPosition(position)).setBackgroundColor(ContextCompat.getColor(DirectoryPicker.this, R.color.appPrimaryColour));
                //Toast.makeText(DirectoryPicker.this, "Item CAB Clicked: Checked: " + (checked ? "true" : "false"), Toast.LENGTH_LONG).show();
                Toast.makeText(DirectoryPicker.this, "Position: " + position, Toast.LENGTH_LONG).show();
                if (checked)
                {

                    //gridView.getChildAt(position).setBackgroundColor(ContextCompat.getColor(DirectoryPicker.this, R.color.appPrimaryColour));
                    Log.d("DirectoryPicker-View", gridView.getChildAt(position).toString());
                    gridView.getChildAt(position).setBackgroundResource(R.color.appPrimaryColour);
                    mode.invalidate();


                    directoryAdapter.getItem(position).setSelected(true);
                    selectedDirectories.add(directoryAdapter.getItem(position));

                }
                else
                {
                    directoryAdapter.getItem(position).setSelected(false);
                    FileManager.DirectoryOrFileInfo selectedDirectory = directoryAdapter.getItem(position);
                    for (int i = 0; i < selectedDirectories.size(); i++)
                    {
                        if (selectedDirectories.get(i) == selectedDirectory)
                        {
                            selectedDirectories.remove(i);
                            selectedDirectory.setSelected(false);
                        }
                    }
                    gridView.getChildAt(position).setBackgroundColor(ContextCompat.getColor(DirectoryPicker.this, android.R.color.transparent));
                }
                mode.setTitle(selectedDirectories.size() + " selected");
            }

            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu)
            {
                MenuInflater inflater = getMenuInflater();
                inflater.inflate(R.menu.file_dir_cab_menu, menu);
                Log.d("DirectoryPicker-CAB", "OnActionModeCreate");
                return true;
            }

            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu)
            {
                return true;
            }

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item)
            {
                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode)
            {
                selectedDirectories.clear();
            }
        });

为什么后台资源未成功应用于创建CAB的长按的第一个项目,但它适用于所有后续选择。

android listview multichoiceitems
1个回答
0
投票

我知道为什么现在不行。创建CAB时,它会触发getView函数在我的适配器中再次调用,因此最终会将视图重置为原来的状态。

因此,我在getView方法中更改了我的适配器,因此它检查项目是否标记为已选中,并设置后台资源。

© www.soinside.com 2019 - 2024. All rights reserved.