создание чего-то вроде контекстной панели действий

Я работаю над проектом, и он почти завершен. но я так долго застрял на проблеме. В моем приложении используется контекстная панель действий для выбора элементов списка, но, как вы должны знать, контекстная панель действий недоступна для более старых версий 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;

        }

но поскольку я не могу вспомнить этот метод каждый раз, когда пользователь выбирает элемент, он по-прежнему показывает одно и то же поведение в первый раз, но если я снова прокручиваю вверх и вниз, все работает.

Я был бы очень признателен, если бы кто-то мог дать мне решение этой проблемы.

P.S. если вы знаете лучший способ добиться того, чего я хочу, пожалуйста, дайте мне знать, но я должен закончить этот проект максимум через 2 дня, поэтому, пожалуйста, предложите что-нибудь, что не займет много времени.

заранее спасибо


person Ashkan Poorghasem    schedule 21.02.2014    source источник


Ответы (1)


Просто используйте ActionBarCompat или ActionBarSherlock.

person FD_    schedule 21.02.2014
comment
ActionBarSherlock: это огромный проект, и мне требуется много времени, чтобы изменить мой ActionBarCompat на ActionBarSherlock (кроме того, мне не нравится использовать ABS). - person Ashkan Poorghasem; 21.02.2014
comment
ActionBarCompat: я использую ABC, но, насколько мне известно, он не обеспечивает совместимость с CAB. - person Ashkan Poorghasem; 21.02.2014