Minimum scroll amount when programmatically selecting ListItem in android ListView - android

refering to this question: how does scrolling in android listview work?
on change from state 2 to 3 the clicked listitem is increased in its size to show more information. if the clicked item was the last one on screen, the extended listitem is not fully visible because the new content flows out at the bottom of the screen.
my current solution is to call "setSelection(index)", if the last visible listitem was clicked. this results in a state were the selection is brought to the top of the screen. this is annoying because the listitem moves from bottom to top.
is there a way to avoid this? this means, is there something to let the listview know, that is should scroll only the minimum amount of pixels, so that the clickeditem is fully visible?
or have i to programm this functionality on my own?

Add a custom OnItemClickListener to the ListView. Implement OnItemClickListener.onItemClick like this:
public void onItemClick(final AdapterView<?> parent, final View view,
int position, long id) {
View hiddenContent = view.findViewById(R.id.hiddenContent);
hiddenContent.setVisibility(View.VISIBLE);
// At this point the layout hasn't be redone and you don't have reliable
// measurements on the view. It would be nice to do something after the view
// has gone through another layout
view.post(new Runnable() {
public void run() {
Rect r = new Rect();
view.getDrawingRect(r);
parent.requestChildRectangleOnScreen(view, r, false);
}
});
}
Whenever you click on a list item to show the hidden content the ListView control will go ahead and do whatever scrolling is needed (or no scrolling if none is needed) to completely show the row.

Related

how to change images on a gridview?

I'm using a Gridview to display a set of images. What I want to do is that when the user taps on one image, it displays an effect that shows the user that some information is being trasmitted wirelessly and when the phone receives such information the image returns to its original state. Something similar to an animated gif.
This is the code I have until now for the onclick event:
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
new Thread(new sendingThread()).start();
}
});
At the moment I have a blue shadow over the image as the only onclick event effect, which i'd like to get rid of and substitute for the one I've mentioned.
AniamtionDrawable, you can either embed it into a single item of a gridview and set it to View.VISIBLE then View.GONE or inflate and add it on top of it.
Not sure which one will be the least expensive one.
To preempt the further question. Start the animation upon a view gaining the focus.
I'd also keep track of which buttons are already tapped/selected via SparseBooleanArray within the adapter. You don't want to spawn too many threads, do you?

Android list view with static selected position

I've working on app that need custom list view...
List view should act like some kind of vertical gallery.
In gallery selected item is always on center.
In my app I use navigation keys only or remote controller.
So there is no fling or regular scrolling effect.
I need for example second element in my list to be selected always.
If I want to move up, all elements are scrolled one place up, and selected item has to be changed, but on same place on the screen like previous selected item.
It's the same thing like gallery only vertical.
Is there a simple way to do this?
Is there a vertical gallery implementation?
How can I make gallery widget vertical?
Or how to customize list view to act like that?
Tnx!
try setting onClick Listener on ListView
ListView listView1=(ListView) findViewById(R.id.listView1);
then implemt a class class SearchItemClickListener implements OnItemClickListener
and set listview.onItemClickListenr you will get position and view.
Hope this helps
You can get the current visible first postion by using,
mListView.getFirstVisiblePosition();
after getting the current visible position and its respective data, you can perform your desired task (i.e. display the large image after getting the thumbnail or something like this).
OR
If you don't want to depend on only first or last position and want to select some other visible row then you can do something like this,
public View getView(int position, View convertView, ViewGroup parent)
{
int visiblePosition = position % nObjects; // nObjects if the total number of objects to display
if(visiblePosition == yourDesiredPosition){
// do your custom work here.
}
}
Here is a demo for vertical slide show,
Hope this will give you some hint about implementing your functionality.
I've managed this using setSelected() method on ListView item...and managing key listener.
Didn't found smarter way to handle this.

how to avoid spinner affect other place?

My code is very long so I will describe my problem. It's about the size and position of a Spinner. My ListView has items, each item has a TextView and a Spinner. The data in Spinners is different. I only operate data of the first one when I click the Spinner. It will pop out. The data in the Spinner comes from a list of database. When I edit the data (delete, move, add) in fact, I edit the data from an array. The question is when I pop out the spinner it will fill the whole screen, show at the centre of screen, the area around it will be gray and if I click the gray area the Spinner will hide again but I need it keep out state so I can do something about its data and don't affect the other area (the grey area). Would anyone help me please? Thank you very much.
If you are trying to detect when the Spinner is hidden then you should implement OnItemSelectedListener in your Activity.
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
// An item was selected. Handle your data here
}
public void onNothingSelected(AdapterView<?> parent) {
// No item was selected
}

Android - OnItemClickListener listview

Here's what I want to do:
I have this list of tasks. When I click on one of the items I want this to appear:
Assuming that menubar can be found with
findViewById(R.id.menubar);
Can someone please tell what code I have to put onItemClickListener
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
NOTE: The menubar visibility its set as GONE.
Thanks!
Without looking at the code, a precise answer is not possible. However, when I first wanted to implement a "Quick Action Bar" similar to the one you have shown, I had followed this example here:
http://code.google.com/p/simple-quickactions/
And this with some styling put in: https://github.com/lorensiuswlt/NewQuickAction3D
Hope this helps....
It is a bit difficult without seeing any code, but I can give you some logic ideas.
Based on your description, I'm assuming that those quick bar controls are hidden on EACH listview item so, it goes:
Fotos (visible)
Action Controls (hidden)
[End of Item]
PROJECTOS (visible)
Action Controls (hidden)
...
I think the OnItemClick method gives you the view (item: Fotos, Projectos, etc) that was clicked as the 2nd argument. If you cast that back to whatever layout you used to create the listview items, you should be able to use findViewByID to get access to the hidden controls that are on each listview and make them visible.
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
//Assuming each item is a linear layout
LinearLayout itemAsLL = (LinearLayout)view;
//find the action bar controls
LinearLayout actionControlsLayout = itemAsLL.findViewById(R.name.of.actioncontrols.id);
//Make it visible
actionControlsLayout.setVisibility(VIEW.Visible);
}
You would need to find a way to hide those controls when another item is clicked? Maybe save the view (or position in the adapterView ) as a class variable and when another item is clicked, go to that view/find that view and hide the controls.
I finally found out the answer. Apparently, when you fill a view with lots of tasks, the adapter does not fill everything when you load the layout, so everytime you scroll down, hes putting more items on the listview.
What you have to do is make sure you put a field "loaded" and, in case is false, it does not show the menubar below that item, otherwise, when you click in one of the items of that list, when you scroll down, since they will have the same relative position (if you click on the first item, the position = 0, when you scroll down, there will be another position = 0) the menubar will appear on both items.
Hope it helps ;)

Listview changes image on number of lines when i'm trying to update one line

I have a list of items, which i'd like to "check" with filled star when user clicks on one item in the list.
I have a ListView with text & image, represented in XML layout, and using simple StringAdapter.
I've implemented the above by doing this:
this.listViewSub.setOnItemClickListener(new OnItemClickListener() {
#Override
public void onItemClick(final AdapterView parent, final View view, final int position,
final long id) {
ImageView img = (ImageView) view.findViewById(R.id.unchkImg);
img.setImageResource(R.drawable.starchk);
I guess its not the right way to do it, but i don't have any idea how else to code it.
This code for some reason changes few random items in the list, and after one click i have about 4-5 items with icon changed.
Any idea how to solve it correctly?
Thanks
It's hard to tell without code, but my first guess is that as the views get recycled, if you don't reset the ImageView to use the default "unchecked" image in the getView method, each time you star an item the view will remain starred, even it is used for a different item. So your adapter should just reset the ImageView's image resource ; though in that case, you'll have to remember which items you starred in order to reset the ImageView correctly : set it to do the default drawable or to the starred one.
At last, after long search - i've found the answer in an article:
http://www.codegod.biz/WebAppCodeGod/Android-ListView-with-dynamic-Images-AID588.aspx
That was a tough one.

Categories

Resources