0

這是一個在StackOverflow中稍微浮動的問題,並且在將此問題標記爲重複項之前,我知道this link。但是,這個問題很模糊,沒有代碼,似乎也沒有得到充分的回答。從ActionMode.Callback.onDestroyActionMode()刷新ListView

所以對我的問題:

我有一個ListFragment(MainListFragment)認爲,onLongItemClick,開闢了Contextual Action Bar。此上下文操作欄中的一個菜單項允許刪除長按的ListView項目。

在實現ActionMode.Callback的類中,我可以刪除長按項目,但我需要ListView在刪除後自行刷新,以便用戶不必切換片段以查看刪除的效果。

在這裏你可以看到我onLongItemClickListenerMainListFragment

this.getListView().setOnItemLongClickListener(new OnItemLongClickListener(){ 

     @Override 
     public boolean onItemLongClick(AdapterView<?> adapter, View view, 
       int pos, long id) { 
      // TODO Auto-generated method stub 
      Log.d("My Debug Bitches", "made it to the listener"); 
      MainListContextualMenu menu = new MainListContextualMenu(); 
      //view.startActionMode(menu); 
      ActionMode mode = getActivity().startActionMode(menu); 
      Object[] tags = new Object[2]; 
      tags[0] = view.getRootView().getContext(); 
      tags[1] = pos; 
      mode.setTag(tags); 
      //view.setSelected(true); 
      return true; 
     } 

    }); 

這裏是我的ActionMode.Callback-實現類:

public class MainListContextualMenu implements ActionMode.Callback{ 

@Override 
public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
    // TODO Auto-generated method stub 

    switch(item.getItemId()){ 
    case R.id.main_list_contextual_menu_delete: 

     //MainActivity activity = (MainActivity) mode.getCustomView().getContext(); 
     //activity.getLists().remove(mode.getTag()); 

     Object[] tags = (Object[]) mode.getTag(); 
     MainActivity activity = (MainActivity) tags[0]; 
     int index = (Integer) tags[1]; 
     //Log.d("My Debug Bitches","" +index); 
     //Log.d("My Debug Bitches", "size before " + activity.getLists().size()); 
     activity.getLists().remove(index); 
     //Log.d("My Debug Bitches", "size after " + activity.getLists().size()); 
     break; 
    case R.id.main_list_contextual_menu_edit: 
     break; 
    } 


    return false; 
} 

@Override 
public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
    // TODO Auto-generated method stub 
    MenuInflater inflater = mode.getMenuInflater(); 
    inflater.inflate(R.menu.main_list_contextual_menu, menu); 
    Log.d("My Debug Bitches", "menu inflated"); 
    return true; 
} 

@Override 
public void onDestroyActionMode(ActionMode mode) { 
    // TODO Auto-generated method stub 
    Object[] tags = (Object[]) mode.getTag(); 
    MainActivity activity = (MainActivity) tags[0]; 
    ListView view = (ListView) activity.getCurrentFocus(); 
} 

@Override 
public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
    // TODO Auto-generated method stub 
    return false; 
} 

} 

我已經用我的invalidateViews()方法onDestroyActionMode()內無濟於事嘗試,而且我見過別人推薦notifyDataSetChange()

但是,我不知道如何在ActionMode.Callback中使用這些解決方案。如果你看看我的onLongClick()方法,我使用mode.setTag()來通過被單擊的ListView項目的MainActivityposition。這是好的形式嗎?

我只是想能夠在ActionMode.Callback.onDestroyActionMode()方法內刷新ListViewMainListFragment

有沒有人得到這個工作之前,如果是這樣,他/她有什麼建議嗎?

回答

1

我在根據您的實施建議這個答案,可能有更好的方法,首先創建一個方法getAdapter(),它將返回您的listview所用的adapter

ArrayAdapter adapter; 

public ArrayAdapter getAdapter() 
    { 
     // TODO Auto-generated method stub 
     return adapter; 
    } 

現在改變你這樣的代碼這一點,添加這個activity.getAdapter().notifyDataSetChanged();

case R.id.main_list_contextual_menu_delete: 

     //MainActivity activity = (MainActivity) mode.getCustomView().getContext(); 
     //activity.getLists().remove(mode.getTag()); 

     Object[] tags = (Object[]) mode.getTag(); 
     MainActivity activity = (MainActivity) tags[0]; 
     int index = (Integer) tags[1]; 
     //Log.d("My Debug Bitches","" +index); 
     //Log.d("My Debug Bitches", "size before " + activity.getLists().size()); 
     activity.getLists().remove(index); 
     activity.getAdapter().notifyDataSetChanged(); 
     //Log.d("My Debug Bitches", "size after " + activity.getLists().size()); 
     break; 

希望這將有助於。