2015-08-12 3 views
1

фонаGridView MultiChoiceModeListener не показано в фрагменте

У меня есть Activity, содержащее уникальную Fragment. Fragment содержит GridView, который отображает ряд элементов. Элементы реализуют проверяемый интерфейс, который меняет цвет фона в зависимости от их состояния и работает по назначению.

Теперь я хотел бы использовать MultiChoiceModeListener для своих GridViewItem.

Проблема в том, что я установил MultiChoiceModeListener на GridView, но он не отображается, когда я нажимаю на свои объекты в GridView.

Код

Activity.java:

public class MainMenuActivity extends AppCompatActivity implements View.OnClickListener { 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) {  
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) {  
     int id = item.getItemId(); 

     if (id == R.id.action_settings) { 
      Intent i = new Intent(this, SettingsActivity.class); 
      startActivity(i); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main_menu); 
     setUpComponents(); 
    } 

    private void setUpComponents(){ 
     //Setting up buttons etc. 
    } 

    @Override 
    public void onClick(View v) { 

     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     fragmentTransaction.replace(android.R.id.content, new ChoosePhotosFragment()); 
     fragmentTransaction.addToBackStack(null); 
     fragmentTransaction.commit(); 
     } 
    } 
} 

Fragment.java:

public class ChoosePhotosFragment extends Fragment implements MediaStoreProvider.OnQueryResultListener, AdapterView.OnItemClickListener { 

    private GridView gridView; 
    private GridViewAdapter gridAdapter; 
    private ArrayList<GridViewObject> objects; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_choose_photos, container, false); 
     objects = new ArrayList<>(); 
     gridView = (GridView) v.findViewById(R.id.gvChoosePhotos); 
     gridAdapter = new GridViewAdapter(getActivity(), objects); 
     gridView.setAdapter(gridAdapter); 
     gridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE); 
     gridView.setMultiChoiceModeListener(new MultiChoiceModeListener()); 
     gridView.setOnItemClickListener(this); 

     getData(); 

     return v; 
    } 

    public void getData() { 
     //Fetching and setting up the adapter with data. 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     System.out.println(gridView.isItemChecked(position)); 
    } 

    public class MultiChoiceModeListener implements 
      GridView.MultiChoiceModeListener { 

     @Override 
     public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
      mode.setTitle("Select Items"); 
      mode.setSubtitle("One item selected"); 
      System.out.println("onCreateActionMode"); 
      return true; 
     } 

     @Override 
     public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
      return true; 
     } 

     @Override 
     public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
      System.out.println("onActionItemClicked"); 
      return true; 
     } 


     @Override 
     public void onDestroyActionMode(ActionMode mode) { 
     } 

     @Override 
     public void onItemCheckedStateChanged(ActionMode mode, int position, 
               long id, boolean checked) { 
      System.out.println("onItemCheckedStateChanged"); 
      int selectCount = gridView.getCheckedItemCount(); 
      switch (selectCount) { 
       case 1: 
        mode.setSubtitle("One item selected"); 
        break; 
       default: 
        mode.setSubtitle("" + selectCount + " items selected"); 
        break; 
      } 
     } 
    } 
} 

GridViewItem.xml:

<com.marcusjacobsson.vault.widgets.CheckableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="5dp" 
    android:background="@drawable/grid_item_background" 
    android:orientation="vertical" 
    android:padding="5dp"> 

    <ImageView 
     android:id="@+id/image" 
     android:layout_width="100dp" 
     android:layout_height="100dp" /> 

    <TextView 
     android:id="@+id/text" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="5dp" 
     android:ellipsize="end" 
     android:gravity="center" 
     android:singleLine="true" 
     android:textSize="12sp" /> 

</com.marcusjacobsson.vault.widgets.CheckableLayout> 

CheckableLayout.java:

public class CheckableLayout extends LinearLayout implements Checkable { 
    private boolean mChecked; 
    private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked}; 

    public CheckableLayout(Context context) { 
     super(context); 
    } 

    public CheckableLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CheckableLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public int[] onCreateDrawableState(int extraSpace) { 
     final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); 
     if (isChecked()) { 
      mergeDrawableStates(drawableState, CHECKED_STATE_SET); 
     } 
     return drawableState; 
    } 

    @Override 
    public void setChecked(boolean b) { 
     if (b != mChecked) { 
      mChecked = b; 
      refreshDrawableState(); 
     } 
    } 

    public boolean isChecked() { 
     return mChecked; 
    } 

    public void toggle() { 
     setChecked(!mChecked); 
    } 
} 

Фоновый селектор моего CheckableLayout (Фон меняет цвет в зависимости от состояния CheckableLayout):

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_checked="true" > 
     <!-- This applies when the item is checked. --> 
     <shape android:shape="rectangle" > 
      <solid android:color="#000" /> 
     </shape> 
    </item> 

    <item> 
     <!-- This applies when the item is not checked. --> 
     <shape android:shape="rectangle" > 
      <solid android:color="#FFF" /> 
     </shape> 
    </item> 
</selector> 

Наконец, GridView, который расположен в макете ChoosePhotosFragment:

<GridView 
     android:id="@+id/gvChoosePhotos" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="5dp" 
     android:clickable="true" 
     android:columnWidth="100dp" 
     android:drawSelectorOnTop="true" 
     android:focusable="true" 
     android:gravity="center" 
     android:numColumns="auto_fit" 
     android:stretchMode="columnWidth" 
     android:verticalSpacing="5dp" /> 

Постановка задачи и вопрос

Как указано выше, когда я проверяю/нажимаю элемент в своем GridView, я ожидаю, что MultiChoiceMode перекрыт ActionBar. В настоящее время это не так. MultiChoiceMode не вызывается вообще (сообщения System.out печатаются в журнале, и визуальный режим не отображается).

Я попытался следующие без успеха:

  • Установка ImageView и TextView в GridViewItem.xml к clickable="false" и checkable="false".
  • Изменение GridView.CHOICE_MODE_MULTIPLE к GridView.CHOICE_MODE_MULTIPLE_MODAL (это не только не работает, , но и не останавливало GridView элементов из меняющегося фона, как будто они больше не изменились состояние)

Я не могу понять, что это неправильно, так мой вопрос просто; что случилось с моим кодом?

ответ

0

Я все еще ищу ответ на этот вопрос, но я применил временное обходное решение, используя the contextual action mode. Разница от MultiChoiceListener заключается в том, что я обрабатываю проверку/снятие отметки с GridView.OnItemClickListener вместо метода onItemCheckedStateChanged, предоставляемого MultiChoiceListener.

Смежные вопросы