2017-06-03 74 views
1

这GIF说明了什么,我试图完成:Android的平稳过渡删除

ideal behavior

所有ListView的项目,除了被点击的一个被移除,并平滑过渡到ListView控件的中心,现在大小为1

的问题是,每当在适配器的ArrayList中的项目被移除,换句话说,被点击除了第一任何其他项目时,我得到这种不连续的过渡所在的地方d项目及其文字跳到前面第一个项目的位置转移前: unwanted behavior

final String[] items = {"foo", "bar", "The Quick Brown Fox", "qwerty"}; 
    final ArrayList<String> alItems = new ArrayList<>(Arrays.asList(items)); 

    final ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.tv1, alItems); 
    final ViewGroup main = (ViewGroup) findViewById(R.id.main); 
    final ListView lv = (ListView)findViewById(R.id.theListView); 
    lv.setAdapter(adapter); 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      // Remove all items except for the chosen one 

      TransitionManager.beginDelayedTransition(main); 
      alItems.subList(0, position).clear(); // Remove items before clicked item 
      alItems.subList(1, alItems.size()).clear(); // Remove items after clicked item 
      adapter.notifyDataSetChanged(); 

     } 
    }); 

我怀疑它与ArrayList中越来越设置为幕后新的ArrayList的事情。没有跳跃的情况下完成所需效果的好方法是什么?

回答

1

黑客警报!

TransitionManager.beginDelayedTransition(main); 
    // set all but selected to empty string 
    // this leaves the list intact but only displaying selected item 
    for (int i=0; i<alItems.size(); i++) { 
     if(i != position) { 
      alItems.set(i, ""); 
     } 
    } 
    adapter.notifyDataSetChanged(); 

    // now wait a while & clear the list 
    Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      alItems.subList(0, position).clear(); // Remove items before clicked item 
      alItems.subList(1, alItems.size()).clear(); // Remove items after clicked item 
      adapter.notifyDataSetChanged(); 
     } 
    }; 
    Handler handler = new Handler(); 
    handler.postDelayed(runnable, 200);  // 200ms or whatever delay looks good 

如果你足够绝望,这可能会给你你想要的。