0

我正在做一个项目,它几乎完成了。但我已经被困在一个问题上这么久了。我的应用程序使用上下文操作栏来选择列表项,但您必须知道,上下文操作栏不适用于旧版本的 android,例如姜饼,我想保持对它们以及 11+ 的兼容性。所以我决定创建两个布局,一个使用实际的上下文操作栏,另一个使用我自己定制的 CAB。我开始构建这个项目,直到现在一切都很顺利。

所以我使用下面的代码来捕获第一次长按和其他单击以选择项目:

@Override
    public boolean onItemLongClick ( AdapterView < ? > adapterView , View view , int position , long id ) {

        selectedItems.add( position );

        this.listView.getChildAt( position ).setBackgroundColor( getResources( ).getColor( R.color.list_item_selected ) );
        getActivity( ).invalidateOptionsMenu( );

        return true;

    }

    @Override
    public void onListItemClick ( ListView listView , View view , int position , long id ) {

        if ( selectedItems.size( ) == 0 ) {

            getActivity( ).invalidateOptionsMenu( );

        } else {

            if ( !selectedItems.contains( position ) ) {

                selectedItems.add( position );
                view.setBackgroundColor( getResources( ).getColor( R.color.list_item_selected ) );

            } else {

                selectedItems.remove( Integer.valueOf( position ) );
                view.setBackgroundColor( getResources( ).getColor( R.color.list_item_deselected ) );

            }

            getActivity( ).invalidateOptionsMenu( );

        }

    }

只有一个问题,那就是当我选择一个项目并且我向下滚动时也选择了很多其他项目。现在我知道是什么导致了这个问题,我试图通过将这些行添加到我的自定义适配器来解决它:

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

            View listItemView = convertView;

            if ( listItemView == null ) {

                LayoutInflater layoutInflater = ( LayoutInflater ) this.context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

                listItemView = layoutInflater.inflate( id , parent , false );

                ApplicationsListViewHolder viewHolder = new ApplicationsListViewHolder( );

                viewHolder.textViewAppName = ( TextView ) listItemView.findViewById( R.id.list_item_fragment_applications_list_textview_application_name );
                viewHolder.textViewAppSize = ( TextView ) listItemView.findViewById( R.id.list_item_fragment_applications_list_textview_application_size );
                viewHolder.imageViewAppStorage = ( ImageView ) listItemView.findViewById( R.id.list_item_fragment_applications_list_imageview_application_storage );
                viewHolder.imageViewAppLogo = ( ImageView ) listItemView.findViewById( R.id.list_item_fragment_applications_list_imageview_application_icon );

                listItemView.setTag( viewHolder );

            }

            ApplicationsListViewHolder viewHolder = ( ApplicationsListViewHolder ) listItemView.getTag( );

            viewHolder.textViewAppName.setText( this.applicationManager.getAppName( this.values.get( position ) ) );
            viewHolder.textViewAppSize.setText( "Version : " + this.applicationManager.getAppVersion( this.values.get( position ) ) );
            viewHolder.imageViewAppLogo.setImageDrawable( this.applicationManager.getAppIcon( this.values.get( position ) ) );

            if ( ApplicationsListFragmentCompat.selectedItems.contains( position ) ) {

                listItemView.setBackgroundResource( R.color.list_item_selected );

            } else {

                listItemView.setBackgroundResource( R.color.list_item_deselected );

            }

            if ( this.applicationManager.checkStorage( this.values.get( position ) ) ) {

                viewHolder.imageViewAppStorage.setImageResource( R.drawable.ic_action_sd_storage );

            } else if ( this.applicationManager.checkStorage( this.values.get( position ) ) == false ) {

                viewHolder.imageViewAppStorage.setImageResource( R.drawable.ic_action_phone );

            }

            return listItemView;

        }

但是由于每次用户选择一个项目时我都无法回忆起这种方法,所以它第一次仍然显示相同的行为,但是如果我再次上下滚动,一切正常。

如果有人能给我一个解决方案,我将不胜感激。

PS如果你知道实现我想要的更好的方法,请告诉我,但我最多必须在 2 天内完成这个项目,所以请提出一些不费时的建议。

提前致谢

4

1 回答 1

0

只需使用ActionBarCompatActionBarSherlock

于 2014-02-21T11:28:07.730 回答