Raj
Raj

Reputation: 217

Floating List view in android?

Is it possible to create a list view in android that is not fixed to a particular position and user can move the list view on a gesture some what floating listview that can be moved anywhere on the screen?I tried finding it but could not find some link.Does any one have some idea about it?

Upvotes: 0

Views: 1929

Answers (4)

karn
karn

Reputation: 6033

You can achieve this by setting an OnTouchListener on the list view and overriding it's onTouch() method. In the onTouch() method you will have to handle the touch events like(ACTION_DOWN, ACTION_MOVE). Here is how you can handle touch event:

@Override
public boolean onTouch (View v, MotionEvent event)
{
    switch(event.getAction() & MotionEvent.ACTION_MASK)
    {
        case MotionEvent.ACTION_DOWN:
            start.set(event.getX(), event.getY());     //saving the initial x and y position
            mode = DRAG;
            break;
        case MotionEvent.ACTION_MOVE:
            if(mode == DRAG) {
                float scrollByX = event.getX() - start.x;    //computing the scroll in X
                float scrollByY = event.getY() - start.y;    //computing the scroll in Y
                v.scrollBy((int)scrollByX/20, 0);            
            }
            break;
    }   
    return false;
}

When the user places the finger down on the screen the ACTION_DOWN event is triggered and when the user drags his finger on the screen ACTION_MOVE event is triggered. Hence a drag event is a combination of ACTION_DOWN and ACTION_MOVE.
Once you have the scrollX and scrollY value the you can move the view on the screen by passing these values to the scrollBy() method of the View class.

Here in the code there are two things to notice:

  • first is that I have passed 0 as the value of scrollY as it will prevent the list view to be dragged and scrolled simultaneously.
  • second is that the return value is false as you want the android to handle the scrolling of the list items

Here you can find the complete code for this

Upvotes: 2

devunwired
devunwired

Reputation: 63303

In the Android framework, the word "floating" is usually synonymous with new Window (such as a Dialog). It depends somewhat on what your end goal is, but if you want to create a ListView that floats over the rest of the content in your hierarchy, that you can easily hide and show, you should probably consider wrapping that view inside a PopupWindow, which has methods to allow you to easily show the window with showAsDropdown() and shotAtLocation() and also move it around while visible with update().

This is how the newer versions of the SDK create pop-up lists for Spinner and Menu

Upvotes: 0

coder
coder

Reputation: 10520

I would move the listview using the margins from the layout.

Outline:

  • Override OnTouch, and based on the event.getX() and event.getY(), update the margins of the listview as follows:

if the parent is a relative layout:

RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)mListView.getLayoutParams();
lp.leftMargin = event.getX();
lp.topMargin = event.getY();
mListView.setLayoutParams(lp);

Add the dispatchTouchEvent to your activity so that events from the listview get passed up to onTouch:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    onTouchEvent(ev);
    return super.dispatchTouchEvent(ev);
}

Hope this helps.

Upvotes: 2

Emir Kuljanin
Emir Kuljanin

Reputation: 3911

Although it's hard to maintain, AbsoluteLayout lets you specify a position in (x,y) coordinates. You would just declare your ListView inside a AbsoluteLayout, get a handle to it in java code where you intercept the clicks and then set new coordinates.

Upvotes: 0

Related Questions