I want to change the background color of one of my views in my listview
myListView.getView(int position, View convertView, ViewGroup parent).setBackgroundColor(0x00FFE303);
I know what position is - this will be my index of the arrayadapter, but I don't know what view and viewgroup are. I have declared them above this line, but I don't know what to initialize them to
help?
I'm not sure you want to be calling getView() manually like that. getView is called automatically by Android when a item in a listview is drawn to the screen. What would be most common to do, would be to extend an Adapter class (like ArrayAdapter) and #Override the getView() method.
Related
I have a ListView which I want to be able to toggle between two states. In the first state, all items in the list are a square shape besides some text. In the second state, all items in the list are the same except that the square shape is now a circle shape. What I want is to be able to transition the square in all visible items to a circle and vice-versa (using a ViewSwitcher or something like that). Anyone know whether this is possible and how I could go about implementing it? (My ListView's data comes from an ArrayAdapter.)
Turned out to be simpler than first thought. In the getView(int position, View convertView, ViewGroup parent) method of my adapter, I inflate a new View if convertView is null, and following that I find my ViewSwitcher from within my View, check the ViewSwitcher.getDisplayedChild() method, and call ViewSwitcher.showNext() or ViewSwitcher.showNext() as appropriate.
Inside my getView method I want to get a specific child view. I know that my adapter holds several items, by doing calling getCount:
getCount();
According to the JavaDoc:
public abstract int getCount ()
Added in API level 1
How many items are in the data set represented by this Adapter.
Now in my getView method:
public View getView(final int position, View convertView, ViewGroup parent) {
View lastAddedItem = parent.getChildAt(getCount()-1);
if(lastAddedItem == null) {
Log.w("ListAdapter", "View is null");
}
}
This message always appears in the LogCat, which means that the View I try to grab is Null.
I've also tried this:
View lastAddedItem = parent.getChildAt(parent.getChildCount()-1);
So how can I grab a specific view from my ViewGroup object?
I know that my adapter holds several items, by doing calling
getCount:
Yes it does, but the getCount()(returning the items in the Adapter) method of an adapter has nothing to do with getting the children of a ListView with getChildAt()(where you should use getChildCount() as this will return the Views present in the ViewGroup).
lastAddedItem = parent.getChildAt(parent.getChildCount()-1);
This should return a non-null view, the last view returned by the getView() method.
I just want to animate a specific View in my ViewGroup
If you are going to animate a list row(or part of that row) when it becomes visible than register a scroll listener for the ListView and start the animation from there when the target view is appearing on the screen.
I don't how are you implemented the rest of the adapter, but if you are doing it in the right way, and I am right, the parent only contains the Views being displayed on the device's screen, and each time you pull down or pull up the list, it modifies the content of those views, that is why you get Null.
What you want to achieve (animate a view), should be done in runtime, checking if the view currently being displayed in the screen should be animated or not.
Hope it helps.
I woud like to create a listview that alternates background images. For example, the first item would have background image a and the second item would have background image b and the third backgroud a. In basic terms I would like help on creating a listview that for every odd item (egg first, third, fith) has a certian background image different to those listview items which are even (egg second, fourth, and sixth listview item). Here's an exampe.
http://www.gadgetreview.com/wp-content/uploads/2011/10/SIRI-Reminders.jpg
In this example the speech bubbles are background image and each different background image is a different listview item.
In your list adapter in the getView method divide the position attribute that gets sent into the method by 2. If the remaining number is 0 than you are in the even row of your listview. Depending on that you can change the layout of your list view item.
#Override
public View getView(int position, View convertView, ViewGroup parent) {
if(position % 2 = 0)
//set layout for even row
}else{
//set layout for odd row
}
Last time that I tried I didn't find an xml parameter to do that, but you can try to use the same workaround used in this question:
Stack Overflow: How do I alternate colors in between Listviews?
you have to make your own custom adapter and then in the following method:
public View getView(int position, View convertView, ViewGroup parent) {
}
you can use position to change the background if position is odd
There is SetEmptyView method in list view use it
listView.setEmptyView( findViewById( R.id.empty_list_view ) );
I would like to create List Activity in Android where each row will contain different layout. For e.g. first row contains an edit text and a text view. Second row contains a button. Third row contains only an image.Thus, each row element as different layout.Please help me with this.
You can create custom adapter, and use a array of layout ids.
In adapter getView method:
public View getView(final int position, View convertView, ViewGroup parent)
you can inflate different layout for different position value.
Implement a custom ListView. In the getView() method, depending on the data being processed, inflate a different layout as required.
If you are using the convertView, I guess you might also want to set a tag to the views being returned from getView() to mark what type of layout it is using. When reusing, you can check the tag, if its not the required type, then inflate a new one, etc.
How can I color code individual rows in a ListView exactly like it is done in the native MESSAGING app? I do NOT want to simply do alternating rows, but I want to copy the format used in the MESSAGING app, where message rows have a different background color based on the username of the message.
FYI:
I am currently extending SimpleAdapter and overriding getView(int position, View convertView, ViewGroup parent). In this method, I am trying to calculate setting the background color based on the position as compared to a list of 'positions to highlight' that I am maintaining each time I update the list, but so far this is only working the first time the list is updated.
In class that overrides SimpleAdapter:
#Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if(highlightPositions.contains(new Integer(position))){
view.setBackgroundColor(highlightColor);
}
else{
view.setBackgroundColor(normalColor);
}
return view;
}
Thank you for any guidance you can offer!
I think you need to call notifyDataSetChanged() on your ListAdapter. This forces the list to refresh, calling your overridden getView() method.
Thanks for the help. Actually, the code I listed does in fact work. The problem turned out to be a small mistake in my keeping track of the list positions to highlight in the highlightPositions list. Once I corrected that, and in fact highlightPositions list did indeed contain the correct positions to highlight, then it worked properly.