构建类似上下文操作栏的东西

时间:2014-02-21 11:26:00

标签: android android-listview contextual-action-bar

我正在研究一个项目,它已接近尾声。但是我已经坚持了很久了。 我的应用程序使用上下文操作栏来选择列表项,但是你必须知道,上下文操作栏不适用于旧版本的android,例如gingerbread,我想保持它们以及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;

        }

但是由于每次用户选择一个项目时我都记不住这个方法,所以第一次它仍会显示相同的行为,但如果我再次向上和向下滚动,一切都会有效。

如果有人能给我一个解决方案,我真的很感激。

P.S。如果你知道一个更好的方法来达到我想要的目的,请告诉我,但我必须在2天内完成这个项目,所以请提出一些不费时的建议。

提前致谢

1 个答案:

答案 0 :(得分:0)