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