ListView滚动时隐藏并显示浮动按钮

时间:2014-12-16 20:23:30

标签: android listview onscrolllistener

嘿伙计们,我在我的应用程序中创建了一个listView和一个浮动按钮,我希望隐藏和返回的效果取决于滚动状态。当正在滚动ListView时,按钮隐藏得很好,但当滚动停止时,按钮不会返回到其初始位置。

有什么想法吗?

我的代码:

public class MainActivity extends ActionBarActivity {
    private ImageButton btn;
    private ListView lv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final String[] items = {"Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "item 6", "Item 7", "Item 8", "Item 9", "Item 10", "Item 11", "Item 12", "Item 13", "Item 14", "item 15"};
        lv = (ListView)findViewById(R.id.listView);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, items);
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this, "You have selected " + items[position].toString(), Toast.LENGTH_SHORT).show();

            }
        });
        lv.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

                if(scrollState == SCROLL_STATE_TOUCH_SCROLL){
                    btn.animate().translationYBy(350);
                }else{
                    btn.animate().cancel();
                }

            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

            }
        });
        btn = (ImageButton)findViewById(R.id.add_button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "Floating Button Pressed", Toast.LENGTH_SHORT).show();
            }
        });
    }

}

提前致谢!!!

4 个答案:

答案 0 :(得分:10)

这可以防止按钮以短晃动的方式启动:

public void onScrollStateChanged(AbsListView view, int scrollState) {
            int btn_initPosY=btn.getScrollY();
            if (scrollState == SCROLL_STATE_TOUCH_SCROLL) {
                btn.animate().cancel();
                btn.animate().translationYBy(150);
            } else {
                btn.animate().cancel();
                btn.animate().translationY(btn_initPosY);
            }
        }

答案 1 :(得分:6)

对于Android浮动操作按钮,它对滚动事件作出反应,您可以使用此链接:

https://github.com/makovkastar/FloatingActionButton

答案 2 :(得分:4)

这将做你想要的事情

lv.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

                if(scrollState == SCROLL_STATE_TOUCH_SCROLL){
                    btn.animate().cancel();
                    btn.animate().translationYBy(350);
                }else{
                    btn.animate().cancel();
                    btn.animate().translationYBy(-350);
                }

            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

            }
        });
        btn = (ImageButton)findViewById(R.id.add_button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "Floating Button Pressed", Toast.LENGTH_SHORT).show();
            }
        });

答案 3 :(得分:2)

@Override
    public void onScrollStateChanged(AbsListView view, int scrollState){
        int btnPosY = buttonFab.getScrollY();
        if (scrollState == SCROLL_STATE_TOUCH_SCROLL) {
            buttonFab.animate().cancel();
            buttonFab.animate().translationYBy(150);
        } else if (scrollState == SCROLL_STATE_FLING) {
            buttonFab.animate().cancel();
            buttonFab.animate().translationYBy(150);
        } else {
            buttonFab.animate().cancel();
            buttonFab.animate().translationY(btnPosY);
        }

    }