2017-06-03 76 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 

如果你足夠絕望,這可能會給你你想要的。