我正在做一个项目,它几乎完成了。但我已经被困在一个问题上这么久了。我的应用程序使用上下文操作栏来选择列表项,但您必须知道,上下文操作栏不适用于旧版本的 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 天内完成这个项目,所以请提出一些不费时的建议。
提前致谢