Highlight Custom ListView Item in Loop - android

Hello i want to change background of my listView item.but it only highlight on touch.but i want to change the background until i change the focus on other item.
What i did so far is below.
Back.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_enabled="false" android:state_focused="true"
android:drawable="#android:color/black" />
<item android:state_pressed="true"
android:drawable="#android:color/holo_red_dark" />
<item android:state_focused="true"
android:drawable="#android:color/holo_red_dark" />
ListView
<ListView
android:id="#+id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:fastScrollEnabled="true"
android:drawSelectorOnTop="true"
android:clickable="true"
android:listSelector="#drawable/listviewcolor"
android:scrollingCache="false">
</ListView>
In Main i have tried everything but does not works it only highlight on touch.
but i want to keep highlight until i change it .
ListView.requestFocus();
ListView.setActivated(true);
ListView.setPressed(true);
ListView.setItemChecked(4, true);
ListView.requestFocusFromTouch();
ListView.setSelection(2);

This can be achieved only by using customAdapter in the following way.
Initially a Listview will lose its focus, when user touches some other item in the layout design. One way of keeping it stay selected, even when it's out of focus is by:
Keeping track of selected position from ListView.
Use the selected position in the ListView adapter and set its view background color according to the selection.
By doing this your background color will stay selected.
Example:
Inside your custom Adapter:
Private int studentListItemSelected;
public void ItemSelected(int itemPosition)
{
//This method will keep track which position of the List is Selected and the background color of it is inside this.
this.studentListItemSelected=studentListItemSelected;
notifyDataSetChanged();
}
public View getView(int position, View convertView, ViewGroup parent)
{
//layout inflation code
if(this.studentListItemSelected==position)
{
convertView.setBackgroundColor(Color.Red);
}
else
{
convertView.setBackgroudnColor(Color.White);
}
return convertView;
}
In your Layout Java file:
yourListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
adapter.ItemSelected(position);
});

Related

Android ListView unselect item

I am developing an application that have a ListView. In this ListView, when I touch in one item the background color of this item changes, to show that the item is selected.
Howerver, the layout have an EditText too:
<ListView
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="#+id/pratosListView"
android:layout_marginBottom="#dimen/activity_vertical_margin"
android:layout_weight="0.8"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:id="#+id/quantidadeEditText"
android:layout_marginRight="#dimen/activity_horizontal_margin"
style="#style/EditText"/>
and when I touch the EditText the item selected in ListView is unselected, in other words, the background color back to the original color. I don't want this happens.
This is my selector (list_item_selector.xml):
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="#drawable/item_list_selected"/>
<item android:state_pressed="true" android:drawable="#drawable/item_list_pressed"/>
<item android:state_focused="true" android:drawable="#drawable/item_list_focused"/>
<item android:drawable="#drawable/item_list_normal"/>
</selector>
Here I set the background of the item (item_lista_pedidos.xml):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="#dimen/activity_all_magim"
android:orientation="horizontal"
android:weightSum="5"
android:baselineAligned="false"
android:background="#drawable/list_item_selector">
.....
</LinearLayout>
And here is the implementation of the click listener:
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// salva a posicao do item selecionado
lastPositionSelected = position;
// salva o objeto relativo ao item selecionado
servicoSelected = servicos.get(position);
view.setSelected(true);
}
Someone have some idea to avoid the item to be unselected when I touch in EditText?
As mentioned here, If you want to detect outside touch only outside of EditText, you can detect touch event in the containing view, and then, given you have your EditText view:
Rect editTextRect = new Rect();
myEditText.getHitRect(editTextRect);
if (!editTextRect.contains((int)event.getX(), (int)event.getY())) {
//touch was outside edittext
}
Or you add a touch listener both to the EditText and the container, and return false in the one of the EditText, this way it will be intercepted and not forwarded to the parent. So, all the touches you detect in the listener of the parent, will not belong to the EditText.

how to implement setselector in listview without changing the caption textcolor of listview items

I am having a listview which I am populating using inflater. When I implement selector with some color it actually come on top of listview item which is fine, but it also affecting text of listview. The textfont color also get changes according to the selector color. How can I implement selector without affecting my listview text font color
layout.xml that includes the ListView:
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:listSelector="#drawable/listitem_selector"
/>
listitem_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="#drawable/listitem_pressed" />
<item android:state_focused="true" android:drawable="#drawable/listitem_selected" />
</selector
Or, you can set the selector of the View by Overriding the getView() method of your ListAdapter. Check more here
It will help you!!
Android: Programmatically set the listSelector for a ListView to the default for the current theme
private static void setDefaultListSelector(ListView listView, Context context) {
TypedArray typedArray = context.obtainStyledAttributes(null, new int[]{android.R.attr.listSelector}, android.R.attr.listViewStyle, 0);
Drawable drawable = typedArray.getDrawable(0);
listView.setSelector(drawable);
}
You can detect the position of the current selected item
OnItemClickListener listViewOnItemClick = new OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> adapter, View arg1, int position, long id) {
mSelectedItem = position;
mAdapter.notifyDataSetChanged();
}
};
Override the getView method of your adapter
#Override
public View getView(int position, View convertView, ViewGroup parent) {
final View view = View.inflate(context, R.layout.item_list, null);
if (position == mSelectedItem) {
// set your color
}
return view;
}

Keyboard navigation with Android GridView doesn't scroll grid

I'm trying to use a keyboard to navigate through a GridView of items.
In the short demo, which only contains a GridView (containing item views with android:focusable="true"), you can see that none of the items gain focus - the grid is the thing that scrolls (the items don't turn orange).
Adding the android:descendantFocusability="afterDescendants" allows each item to be focused first, but still, doesn't continue to scroll the GridView so you can navigate down:
Clicking on an item (with mouse or by pressing Return if the item was focused, after the descendent focusability fix) turns an item blue - indicating it's in pressed state.
#layout/activity_my.xml:
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="2" />
#layout/dummy_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/dummy_item_parent"
android:layout_width="match_parent"
android:layout_height="150dp"
android:gravity="center"
android:focusable="true"
android:clickable="true"
android:background="#drawable/item_background" />
#drawable/item_background.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="#android:color/holo_blue_light" />
<item android:state_focused="true" android:drawable="#android:color/holo_orange_light" />
<item android:drawable="#android:color/holo_red_light" />
</selector>
MyActivity.java (with ListAdapter):
public class MyActivity extends Activity {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
AbsListView listview = (AbsListView) findViewById(R.id.listview);
listview.setAdapter(new DummyAdapter(getLayoutInflater()));
}
private static class DummyAdapter extends BaseAdapter {
private static final int COUNT = 25;
private final LayoutInflater layoutInflater;
DummyAdapter(LayoutInflater layoutInflater) {
this.layoutInflater = layoutInflater;
}
#Override
public int getCount() {
return COUNT;
}
#Override
public String getItem(int position) {
return "Item " + position;
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = layoutInflater.inflate(R.layout.dummy_item, parent, false);
}
((TextView) view).setText(getItem(position));
return view;
}
}
}
Swapping the GridView for a ListView, without changing the adapter, or the item views/item view attributes, will behave as expected - items can be focused and the ListView will scroll to the bottom, so that all items can be focused using just keyboard input. Also, using a RecyclerView with LinearLayoutManager / GridLayoutManager will also work correctly.
I have tried this on API 16 and 22 with the same results. I have tried settings the android:descendantFocusability attribute on the GridView to afterDescendents with the same result.
I tried your code and it doesn't work with GridView, as you said, but i have some issue also with ListView. The ListView scrolls correctly, but only the first item of every page is highlighted.
With these little modifications you can achieve the effect you want on both GridView and ListView.
Remove android:descendantFocusability in activity_my.xml:
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="2" />
Remove android:focusable in dummy_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/dummy_item_parent"
android:layout_width="match_parent"
android:layout_height="150dp"
android:gravity="center"
android:clickable="true"
android:background="#drawable/item_background" />
Change from android:state_focused to android:state_selected in item_background.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="#android:color/holo_blue_light" />
<item android:state_selected="true" android:drawable="#android:color/holo_orange_light" />
<item android:drawable="#android:color/holo_red_light" />
</selector>

How to Enable and Disable Image button on Each List Item Click for Lazy Adapter [duplicate]

So I have an activity with 2 ListView widgets, when you select a value in the first one, the second is populated with values related to the selection in the first ListView. This mechanic works without a problem, but now I want the user choices to stay highlighted. I've read a good ammount of question related to this topic and it seems there is a myriad of ways one can accomplish this but after trying about 4-5 of em' I still can't get it to work.
I've got it working on the second ListView using the android:listSelector="#CCCCCC" XML Attribute, but this seems to be wiped clean once a OnItemClickListener is introduced into the mix (like the one I use on my first ListView).
So far here's what I've got:
Custom OnItemClickListener I found browsing various answer regarding this topic (slightly modified it in order for it to load my info the second ListView):
private class ItemHighlighterListener implements OnItemClickListener {
private View oldSelection = null;
public void clearSelection() {
if(oldSelection != null) {
oldSelection.setBackgroundColor(android.R.color.transparent);
}
}
public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
clearSelection();
oldSelection = view;
view.setBackgroundDrawable(view.getContext().getResources().getDrawable(R.drawable.list_selector));
loadClubs(mXMLPortalOptions.getRegion(pos).getId());
mClubList.setAdapter(new ArrayAdapter<String>(getApplicationContext(), R.layout.list_item_white, mClubs));
}
}
Here's my list_selector.xml file :
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true"><shape>
<solid android:color="#CCCCCC" />
</shape></item>
<item android:state_selected="false"><shape>
<solid android:color="#FFFFFF" />
</shape></item>
</selector>
The method (OnItemClick) is called and executed, but the background of my ListItem stays the same color :/
I can't believe that this simple task has proven so complicated.
If I have omitted code that could be useful or if my question is lacking details, feel free to point that out and I'll do my best to explain myself.
Put a position variable for selected item. Change the position in onItemClicked() method. Check the selected position in List Adapter inside getView() and set the background for the selected item.
public class TestAdapter extends BaseAdapter
{
private Context context;
private ArrayList<TestList> testList;
private int selectedIndex;
private int selectedColor = Color.parseColor("#1b1b1b");
public TestAdapter(Context ctx, ArrayList<TestList> testList)
{
this.context = ctx;
this.testList = testList;
selectedIndex = -1;
}
public void setSelectedIndex(int ind)
{
selectedIndex = ind;
notifyDataSetChanged();
}
#Override
public int getCount()
{
return testList.size();
}
#Override
public Object getItem(int position)
{
return testList.get(position);
}
#Override
public long getItemId(int position)
{
return position;
}
private class ViewHolder
{
TextView tv;
}
#Override
public View getView(int position, View convertView, ViewGroup parent)
{
View vi = convertView;
ViewHolder holder;
if(convertView == null)
{
vi = LayoutInflater.from(context).inflate(R.layout.test_list_item, null);
holder = new ViewHolder();
holder.tv = (TextView) vi;
vi.setTag(holder);
}
else
{
holder = (ViewHolder) vi.getTag();
}
if(selectedIndex!= -1 && position == selectedIndex)
{
holder.tv.setBackgroundColor(Color.BLACK);
}
else
{
holder.tv.setBackgroundColor(selectedColor);
}
holder.tv.setText("" + (position + 1) + " " + testList.get(position).getTestText());
return vi;
}
}
Now set the selectedIndex variable when a list item clicked.
public class TestActivity extends Activity implements OnItemClickListener
{
// Implemented onItemClickListener
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
adapter.setSelectedIndex(position);
}
}
To expand on Shaiful's great solution, you might not get his to work in your situation.
If you are using have your code all in public void onListItemClick(ListView l, View v, int index, long id), if you're using fragments and have to declare an interface instead of implementing OnListItemClickListener, or whatever is causing your IDE to generate errors, you might have to access variables and methods statically.
public static int selectedPosition = 0;
ArrayAdapter<Your_obj> adapter = null;
#Override
public void onListItemClick(ListView l, View v, int index, long id) {
super.onListItemClick(l, v, index, id);
selectedPosition = index;
Your_adapter.setSelectedIndex(selectedPosition);
adapter.notifyDataSetChanged();
}
And in Your_adapter:
private static int selectedIndex;
//public Your_adapter...
public static void setSelectedIndex(int ind) {
selectedIndex = ind;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
WellHolder holder = null;
if (null == convertView) {
//set up your "holder"
}
if (position == selectedIndex) {
convertView.setBackgroundColor(convertView.getResources().getColor(R.color.cyan));
}
else {
convertView.setBackgroundColor(convertView.getResources().getColor(R.color.silver));
}
return convertView;
}
Some other differences are that you don't have to initialize any variables as "0" or "-1" and notifyDataSetChanged() is called in your activity.
Once again, thanks for your solution #Shaiful. It certainly helped save me time trying to get what is default in iOS to work for Android, all while avoiding selector/item/focused/pressed/etc.
I faced similar problem. That's my solution:
First add custom list selector to your list view:
<ListView
android:id="#+id/list"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:listSelector="#drawable/listselector" />
Inside listselector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_accelerated="false"
android:drawable="#drawable/bg" />
</selector>
And finally a drawable bg.xml with color of your highlight:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#33b5e6"/>
</shape>
I think the best and easiest solution is this. You don't need to set any android:listSelector on the ListView itself or do any changes to the adapter. You don't even need to call any setSelection(position) in the OnItemClickListener as it is handled automatically.
Set to your ListView:
android:choiceMode="singleChoice"
Set background of the list item itself:
android:background="?android:attr/activatedBackgroundIndicator"
That's it.
This way you'll get default system behavior. That's how it is done in the default android.R.layout.simple_list_item_activated_1 layout.
lv.setSelector(R.drawable.highlighter);
put a highlighter.png image in drawable folder
simplest way to highlight selected item in list view.
I was looking for it two weeks ago and the result is that is not possible with a drawable selector.
For more info read this post in Android Developers Blog: Touch Mode
In resume: Only when your finger are on the screen, item is selected.
Other possibility is save which item is selected in a var and paint different using your custom adapter like Shaiful says.
//create a list_itemselectorin drawable folder
//you will get the list item selected background color change once you select //the item
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Focused State -->
<item android:state_focused="true"><shape>
<solid android:color="#66FFFFFF" />
</shape></item>
<!-- Pressed State -->
<item android:state_pressed="true"><shape>
<solid android:color="#color/Black" />
</shape></item>
<!-- Default State -->
<item><shape>
<solid android:color="#color/Black" />
</shape></item>
</selector>
//create a list in layout folder
<ListView
android:id="#+id/mySlidingList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:choiceMode="singleChoice"
android:divider="#color/GrayHot"
android:dividerHeight="1dip"
android:listSelector="#drawable/list_itemselector"
android:scrollbars="none" />
// And see the output.
If you can use a drawable for displaying listItem Highlighted then you should use following code:-
listView.setSelector(R.drawable.bg_image);
It works.
There is simple fully-XML solution, which worked for me.
Firstly, define XML-drawable with selector code in which "normal" state will correspond to "selected unpressed" visual state of a list item, and state_pressed=true to "pressed" visual state.
Example of file "custom_item_selector.xml", resembling Holo blue selection:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid
android:color="#643292ff">
</solid>
<stroke
android:width="1dp"
android:color="#c83292ff">
</stroke>
</shape>
</item>
<item>
<shape android:shape="rectangle">
<solid
android:color="#323292ff">
</solid>
<stroke
android:width="1dp"
android:color="#783292ff">
</stroke>
</shape>
</item>
</selector>
(may also set focused state there).
Secondly, apply this xml-drawable as ListView's listSelector and set it's desired choiceMode:
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/listView"
android:choiceMode="singleChoice"
android:listSelector="#drawable/custom_item_selector"/>
That's all. It allows to define different visual states for "simply selected" and "pressed selected" items, for example making items brighter on press.
To keep the list items(multiple selection) highlighted, when clicked(activated), please follow the steps.
1. Set background to list item layout as drawable.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#drawable/list_item_selector">
<ImageView
android:id="#+id/icon"
android:layout_width="22px"
android:layout_height="22px"
android:layout_marginLeft="4px"
android:layout_marginRight="10px"
android:layout_marginTop="4px"
android:src="#mipmap/ic_launcher" >
</ImageView>
<TextView
android:id="#+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="#+id/label"
android:textSize="20px" >
</TextView>
</LinearLayout>
2. drawable selector
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="#android:color/holo_red_light" />
<item android:state_activated="true" android:drawable="#android:color/holo_orange_dark" />
</selector>
3. Listview set multiple choice mode
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
When Pressed:
Below image shows, when user selected multiple list items.
When Activated:
To summarize this post and maybe help someone else in future I suggest the answer :)
First, we need to create res/drawable/list_item_background.xml file with the following contents:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_activated="true"
android:drawable="#color/list_item_activated" />
<item
android:drawable="#color/list_item_default" />
</selector>
Specify your drawable resources, of course. And you can also add other <item> elemens with different states like state_pressed, state_focused etc.
Then, we should set the background parameter to our custom list item ViewGroup element (f.i. res/layout/list_item_layout.xml) like this:
android:background="#drawable/list_item_background"
The next step is modifying our custom Adapter class. Here is the following code fragment:
public class CustomAdapter extends BaseAdapter {
private List<Item> items;
private LayoutInflater itemInflater;
private int selectedIndex; // add this
public CustomAdapter(Context c, List<Item> items) {
this.items = items;
this.itemInflater = LayoutInflater.from(c);
selectedIndex = -1; // add this
}
/* add this */
public void setSelectedIndex(int index) {
selectedIndex = index;
notifyDataSetChanged();
}
/* other adapter's stuff */
#Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = itemInflater.inflate(R.layout.list_item_layout, parent, false);
}
// add this
convertView.setActivated(selectedIndex != -1 && position == selectedIndex);
/* do some stuff */
return convertView;
}
}
Finally, we should call the setSelectedIndex(position) adapter's method in onItemClick(...) method of AdapterView.OnItemClickListener.
public class YourActivity extends Activity
implements AdapterView.OnItemClickListener {
private CustomAdapter mCustomAdapter;
/* activity implementation */
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mCustomAdapter.setSelectedIndex(position);
}
}
Now, we can be satisfied with proper list items highlighting :)
P.S. If we want to enable multiple choice mode on our list we'll just place the following string to our activity class where listView instance is kept:
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
Thus, we'll get proper multiple items highlighting.
-- Hope this helps anyone :)

Android ListView listSelector not working

I am trying to set a custom selector to a ListView. It's working fine on newer devices but not working on lower version of devices.I want the ListView selected item to be stay highlighted.
Please help.
Thanks in advance.
ListView.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="#+id/listViewBell"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:cacheColorHint="#00000000"
android:choiceMode="singleChoice"
android:divider="#b5b5b5"
android:dividerHeight="1dp"
android:listSelector="#drawable/list_selector_color" >
</ListView>
</LinearLayout>
list_selectror_color.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid android:color="#color/list_selector" />
<stroke
android:dashWidth="2dp"
android:width="1dp"
android:color="#color/white" />
</shape>
I have also tried with selector but nothing happens
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#drawable/list_selector_color" android:state_pressed="true"/>
<item android:drawable="#drawable/list_selector_color" android:state_focused="true"/>
<item android:drawable="#drawable/list_selector_color" android:state_selected="true"/>
<item android:drawable="#drawable/list_selector_normal"/>
</selector>
Here is my Custom adapter getView Method
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.listview_bell_items, parent,
false);
ImageView imageview = (ImageView) convertView
.findViewById(R.id.list_bell_image);
imageview.setImageResource(mDataImage[position]);
TextView textview = (TextView) convertView
.findViewById(R.id.txt_bell_title);
textview.setText(mDataText[position]);
return convertView;
}
I had similar problem. Sorry, cannot comment, so I post a possible answer.
Remove android:listSelector="#drawable/list_selector_color" property from your ListView declaration
In your R.layout.listview_bell_items specify your custom selector for a root layout. E.g., if root layout of your list item is RelativeLayout, try:
<RelativeLayout ... android:background="#drawable/listitem_selector">...
The same goes for any other type of Layout.
If this still still does not give you the result you want, provide more details.
Update
Ok, if nothing else helps, there's a temporary dirty workaround of your problem. I do not see why it would not work.
Introduce a selectedPos variable holding currently selected item.
private class MyAdapter extends .../*your base adapter*/ {
private static final int NOT_SELECTED = -1;
private int selectedPos = NOT_SELECTED;
// if called with the same position multiple lines it works as toggle
public void setSelection(int position) {
if (selectedPos == position) {
selectedPos = NOT_SELECTED;
} else {
selectedPos = position;
}
notifyDataSetChanged();
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if (position == selectedPos) {
// your color for selected item
view.setBackgroundColor(Color.parseColor("#000000"));
} else {
// your color for non-selected item
view.setBackgroundColor(Color.parseColor("#FFFFFF"));
}
return view;
}
}
Now, add the following code after you create and set ListView's adapter:
final MyAdapter adapter = new MyAdapter(...);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
adapter.setSelection(position);
}
});
That is what I found out:
To get the list selector working the are two approaches:
1)
You use the OnItemClickListener.
Then the list selector drawable/color will work as expected when set it on the list view.
Then you may use a TouchListener for getting ClickEvents of any child view instead of using a ClickListener.
2)
You have set ClickListener on any child of the row view.
In this case the list selector will not work when been set on the list view, so you have to set your list selector drawable/color as background of the row view.

Categories

Resources