I have a listview in my app, which is declared in XML, then the content is passed to it in code based on a string array which I have declared in XML. I'm new to android programming, but I was wondering how I could make the text in certain listview elements bold and darken the listview background behind it.
I have my set names as an array in my strings.xml:
<string-array name="setsArray">
<item>set1</item>
<item>set2</item>
<item>set3</item>
<item>set4</item>
<item>set5</item>
<item>set6</item>
</string-array>
I have my listview declared in the activity's layout.xml
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/listView"
android:layout_below="#+id/app_bar"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
And in the code of the activity I have this:
final ListView setList = (ListView) findViewById(R.id.listView);
setList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, getResources().getStringArray(R.array.setsArray)));
setList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int itemPosition = position;
String itemValue = (String) setList.getItemAtPosition(itemPosition);
if (!itemValue.equals("SPANISH")){
Intent intent = new Intent(view.getContext(), SetViewActivity.class);
intent.putExtra("value", itemValue);
startActivity(intent);
}
}
});
Note that this code takes the name of the set that was clicked on, and passes it onto the next activity with the intent so it knows what to display. If possible I need to keep this intact or replace it with another system which sends something which I can use to distinguish the sets in the next activity.
because you don't use a custom adapter (I guess), try this please:
<string-array name="setsArray">
<item>set1</item>
<item>set2</item>
<item>set3</item>
<item>set4</item>
<item> <![CDATA[ <b>set5</b> ]]> </item>
<item>set6</item>
</string-array>
I hope android using Html.fromHtml() by default :)
Android:Make characters bold in xml
Please watch The World of ListView. It explains the important aspects of ListViews and how to make an adapters for your ListView. Pay particular attention to the part about using getItemViewType() and getViewTypeCount().
I think you'll have to implement custom ListAdapter. In getView() method you'll be able to change style of item based on index.
As a side note, I don't see a reason why you wouldn't use RecyclerView. It's a more flexible and up to date choice for creating lists.
With RecyclerView it could be done like this:
#Override
public void onBindViewHolder(ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
holder.mTextView.setText(mDataset[position]);
if(position == 5) holder.mTextView.setTypeface(null, Typeface.BOLD);
}
Related
i am having a list view in which i would like to give a background color to a row when it is pressed.When i select an item its changing the color but the problem is when i scroll down other rows too are got colored.I don't want that.
Here is my code:
Thanks in advance
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
final String item = (String) parent.getItemAtPosition(position);
Toast.makeText(getBaseContext(), item, Toast.LENGTH_LONG).show();
view=parent.getChildAt(position);
view.setBackgroundColor(Color.GREEN);
}
});
}
I think you should handle that in your adapter. A listview re-uses listelements and in your case the one with green background will be reused when you scroll. Instead you should tell your adapter which item was clicked
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
((YourAdpater)listView.getAdapter()).setSelected(position);
}
});
And in your Adapter's getView() you can then set a background if the current position equals the selected one or not...
Or look at the listview's choice mode http://developer.android.com/reference/android/widget/AbsListView.html#attr_android:choiceMode
I'm not really familiar with it, but it might be helpful...
The nicest way to handle this is to set listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);, which allows you to select multiple list items.
To highlight the selected items, all you have to do is create a custom background selector, which defines how the items will look like in which state. For your example this would be something like this:
selector.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#android:color/white" android:state_activated="false"/>
<item android:drawable="#android:color/green" android:state_activated="true"/>
</selector>
Put this file in your drawable folder and give your list items this background like this:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#drawable/selector">
...
</LinearLayout>
This way you don't have to handle clicks on the items.
You can retrieve the selected items via listview.getCheckedItemPositions()
To highlight a ListView you dont have to manually colour them, Android already has a function for it.
m_ResultsArrayAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_activated_1,m_ResultsArray)
Instead of using a simple_list_item_1 use a simple_list_item_activated_1. This will allow ur list to be highlighted and you can even check which one is checked by using
this.m_ResultsListView.getCheckedItemPosition();
Hopefully this answers your question :>
I implemented the android listview with the ListActivity. Here I have the problem that when i click on the list item no action is performed when the flash color is also not coming that is the orange color. So do you have any idea about this kindly answer to my question.
#Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
super.onListItemClick(l, v, position, id);
Toast.makeText(getApplicationContext(), "msg msg", Toast.LENGTH_SHORT)
.show();
}
I put this code also into the Main ListActivity.
The first thing what you have to note here is, whenever there are Clickable elements like Buttons or ImageButtons present in your ListView element, they take the control of click events. And so your ListView won't get the chance to accept the click event.
What you simply have to do is, set the focusable attribute to false for the Button or ImageButton you have in your ListView. But still they will work without any problem and also your ListView's onListItemClick will also work.
Try this,
<Button android:id="#+id/textsize_increaser"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="#+id/back_button"
android:focusable="false"
android:text=" A + "/>
Here I have added this android:focusable="false" and it works fine. try it.
Have you set the choice mode of ListView to SINGLE :
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
And if you have any clickable imageview or textview or button in the list item, then make them not focusable (in your Adapter class):
yourButton.setFocusable(false);
yourButton.setFocusableInTouchMode(false);
Are you using custom Adapter? and inflating layout with button or any view that eats away the list list view focus as child, then it won't work obviously. make sure to set
android:focusable="false"
to such view in xml file. hope this works for you.
Set this in your listactivity java file
listview1.setFocusable(false);
Actually there is a parameter meant for that to prevent children views from getting focus, just add the following in the parent layout:
android:descendantFocusability="blocksDescendants"
As the documentation explains:
The ViewGroup will block its descendants from receiving focus.
Eclipse suggested me to add textIsSelectable="true" to my TextViews in the layout xml which was used for list view.
Well, if you want to click the items in the list then you should not add those tags.
make sure that you are
Not using Scroll View with List View
Not using Scroll View in your row item layout for List View
If Scroll View is present at any of above place remove it
refer to this post for a solution:
Click is not working on the Listitem Listview android
View v = parent.getChildAt(position);
parent.requestChildFocus(v,view);
v.setBackground(res.getDrawable(R.drawable."Some drawable for clicked row"));
int count = parent.getChildCount();
for(int i=0; i<count; i++)
{
if(i!=position)
{
v = parent.getChildAt(i);
v.setBackground(res.getDrawable(R.drawable."some drawable for not clicked row));
}
}
listview.setOnItemClickListener(new OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View v, int pos,
long id) {
Toast.makeText(v.getContext(), exm.get(pos).getDefinition(),
Toast.LENGTH_SHORT).show();
}
});
listItemButton.setFocusable(false);
listItemButton.setFocusableInTouchMode(false);
Set the above in your adapter. It's not working in XML
I have a listview with a checkbox, an image and a text field. Now I do want to display more than one items in the text field. The problem is that I want the arguments in neat colums. Can I somehow set tabstops or a format or something like that in the text field or do I have to actually make more text fields and set each value in its own field ?
My list should look somewhat like:
[Image] [checkbox] "arg11 arg12 arg13"
[Image] [checkbox] "arg21 arg22 arg23"
[Image] [checkbox] "arg31 arg32 arg33"
Thanks for any advice.
Edit: Just to clarify things. I have a working listview/adapter with the image/checkbox and one textfield already. I am kind of new to Android so all I want to know if there is an elegant way to handle displaying several text items in the text field. In Windows I would simply use tabstopps and they would look ordered and in a column but I don't know my way well enough around android to know if there is something similar or if individual text fields are required to get the text fields in columns.
You create new xml say row.xml, which we can inflate inside listview for each row.
Design the row however you want, for ex:
row.xml
<LinearLayout android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:orientation="horizontal">
<ImageView ..../>
<CheckBox ...../>
<TextView ...../>
<TextView ...../>
</LinearLayout>
Then use CustomAdapter for your listview
like,
listView.setAdapter(new CustomAdapter());
CustomAdapter,
class CustomAdapter extends BaseAdapter{
publicCustomAdapter() {
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
#Override
public int getCount() {
return xyz.size();
}
#Override
public String getItem(int position) {
return xyz.get(position);
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.row, null);
holder = new ViewHolder();
holder.imageView = (ImageViewView)convertView.findViewById(R.id.image);
holder.checkbox = (CheckBox)convertView.findViewById(R.id.checkbox);
holder.textView1 = (TextView)convertView.findViewById(R.id.text1);
holder.textView2 = (TextView)convertView.findViewById(R.id.text2);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
//TODO set the values for views and return view
return convertView;
}
}
You should Re-work on the row xml. I think you may know about the row xml where you can chage the design of each and every row. Take a Relative or Linear Layout and add the views as shown below.
[Image] [checkbox] "text1" "text2 "text3"
[Image] [checkbox] "text1" "text2 "text3"
[Image] [checkbox] "text1" "text2 "text3"
Instead of taking tab spaces, take three different TextView's. keep '1' as weight for each and every TextView and add these to a LinearLayout which is having total weight sum as 3.So all the three TextView will be equally placed in the parent view.
Try this and lemme know whether you fixed it.....
Basically you need to implement your own adapter for your ListView.
First you need to create your own adapter class which either baseAdapter or their derivatives.And then you need to implement your ListView item display logic in it.
Like setting your textViews,imageViews etc.
Check this tutorial for more info.
http://www.vogella.de/articles/AndroidListView/article.html
From one of my earlier posts:
Whenever you want to do processing with the views in a ListView you
need to create a custom adapter that will handle your logic
implementation and pass that information to the views as necessary.
If you are sure about the sizes of text then you can use tabstops in your text. If that doesnt work then your are stuck with extending your row layout. as mentioned by Pavandroid
So in my application I am using a ListView to display data from an ArrayList which holds objects. The data is displayed using the same method as the tutorial on the android developer website:
// automatically adds a ListView to fill the entire screen of this activity
setListAdapter(new ArrayAdapter<Part>(this, R.layout.list_item, Main.parts));
ListView lv = getListView();
// allows the user to start typing to filter the list
lv.setTextFilterEnabled(true);
// set the click listener for each list item
lv.setOnItemClickListener(new OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
}
});
The objects are currently displayed in each list_item:
<!-- Defines the layout for each item being placed in the ListView. -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="16sp" >
</TextView>
So I return each object as such:
public String toString() {
return "Item Number: " + itemNmbr + "\nPrice: " + price + "\nDescription: " + desc;
}
An example of how the list currently looks:
http://imageshack.us/photo/my-images/689/devicet.png/
The problem is, I need to format the title separately from the data. (because it needs to be bold, and possibly spaced out a little further.)
Any ideas? I'm currently testing on how to get two textviews to work together.
Thank you!
I would recommend using a custom adapter extending BaseAdapter.
http://developer.android.com/reference/android/widget/BaseAdapter.html
See this link for an example.
http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/
TL;DR: You choose an option from (a) my listview. Then, you change your mind and type something in (b) my edit text. How do I clear your listview selection and only show your edittext? (and vice versa)
I have an application with a listview of options as well as an edittext to create an own option. I need the user to either choose or create an option, but not both. Here's a drawing of my layout:
Whenever the user selects an option from the listview, I set it as "selected" by making it green, like so:
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_selected="true"
android:drawable="#color/colorPrimary"/>
<item
android:state_selected="false"
android:drawable="#color/windowBackground" />
</selector>
(this is set as the background of my listview)
Problem: I want to unselect the listview option if the user decides to type in their own option since they can only have one option.
User selects an option from the listview
User decides they want to create their own option using the edittext
The listview option is unselected when they start typing their own
I've tried doing the following, but nothing unselects.
e.setOnEditorActionListener(new TextView.OnEditorActionListener()
{
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
for(int i=0; i<=5; i++){
listView.setItemChecked(i, false);
}
listView.clearChoices();
listView.requestLayout()
adapter.notifyDataSetChanged()
}
}
A very puzzling predicament, any help is appreciated!
Edit: here is the layout of the edittext:
<EditText
android:id="#+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBaseline="#+id/textView4"
android:layout_alignBottom="#+id/textView4"
android:layout_toEndOf="#+id/textView4"
android:layout_toRightOf="#+id/textView4"
android:color="#color/colorPrimary"
android:imeOptions="actionDone"
android:inputType="text"
android:textColor="#color/textColorPrimary"
android:textColorHint="#color/colorPrimary" />
Edit: here is the layout of the listview:
<ListView
android:id="#+id/listview"
android:layout_width="wrap_content"
android:layout_height="250dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="#+id/toolbar"
android:background="#drawable/bg_key"
android:choiceMode="singleChoice"
android:listSelector="#color/colorPrimary">
</ListView>
Long Story Short
ListView selector (android:listSelector) is designed to indicate a click event, but not selected items.
If a ListView selector is drawn (after first click) it won't dissapear without drastic changes in the ListView
Hence use only drawables with transparent background if no state is applied to it as a ListView selector. Don't use a plain color resource for it, don't confuse yourself.
Use ListView choice mode (android:choiceMode) to indicate selected items.
ListView tells which row is selected by setting android:state_activated on the row's root view. Provide your adapter with corresponding layout/views to represent selected items correctly.
TL/DR Solutions
You can hide/remove selector with one of the following:
Making the selector transparent getSelector().setAlpha(0)
Resetting the current adapter with setAdapter(myAdapter) (adapter might be the same)
Solutions that might or might not work, depending on the OS version:
Making the list view to refresh layout completely via requestLayout(), invalidate() or forceLayout() methods;
Making the list view to refresh layout via notifyDataSetChanged()
Theory
Well, the built-in selection in ListView is utterly tricky at a first glance. However there are two main distinctions you should keep in mind to avoid confusing like this - list view selector and choice mode.
ListView selector
ListView selector is a drawable resource that is assumed to indicate an event of clicking a list item. You can specify it either by XML-property android:listSelector or using method setSelector(). I couldn't find it in docs, but my understanding is that this resource should not be a plain color, because after it's being drawn, it won't vanish without drastic changes in the view (like setting an adapter, that in turn may cause some glitches to appear), hence such drawable should be visible only while particular state (e.g. android:state_pressed) is applied. Here is a simple example of the drawable that can be used as a List View selector
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:drawable="#android:color/darker_gray" />
<item
android:drawable="#android:color/transparent" />
</selector>
For whatever reason you cannot use a Color State List as List View selector, but still can use plain colors (that are mostly inappropriate) and State List drawables. It makes things somewhat confusing.
After the first click on a List View happens, you will not be able to remove List View selector from the List View easily.
The main idea here is that List View selector is not designed to indicate selected item.
ListView choice mode
ListView choice mode is assumed to indicate selected items. As you might know, primarily there are two choice modes we can use in ListView - Single Choice and Multiple Choice. They allow to track a single or multiple rows selected respectively. You can set them via android:choiceMode XML-property or setChoiceMode() method.
The ListView itself keeps selected rows in it and let them know which one is selected at any given moment by setting android:state_activated property of the row root view. In order to make your rows reflect this state, their root view must have a corresponding drawable set, e.g. as a background. Here is an example of such drawable:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_activated="true"
android:drawable="#android:color/holo_green_light" />
<item
android:drawable="#android:color/transparent" />
</selector>
You can make rows selected/deselected programmatically using the setItemChecked() method. If you want a ListView to clear all selected items, you can use the clearChoices() method. You also can check selected items using the family of the methods: getCheckedItemCount(), getCheckedItemIds(), getCheckedItemPosition() (for single choice mode), getCheckedItemPositions() (for multiple choice mode)
Conclusion
If you want to keep things simple, do not use the List View selector to indicate selected items.
Solving the issue
Option 1. Dirty fix - hide selector
Instead of actually removing selector, changing layouts and implementing a robust approach, we can hide the selector drawable when it's needed and show it later when clicking a ListView item:
public void hideListViewSelector() {
mListView.getSelector().setAlpha(0);
}
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (mListView.getSelector().getAlpha() == 0) {
mListView.getSelector().setAlpha(255);
}
}
Option 2. Thoughtful way
Let's go through your code and make it comply the rules i described step by step.
Fix ListView layout
In your ListView layout the selector is set to a plain color, and therefore your items are colored by it when they are clicked. The drawable you use as the ListView background have no impact, because ListView state doesn't change when its rows are clicked, hence your ListView always has just #color/windowBackground background.
To solve your problem you need at first remove the selector from the ListView layout:
<ListView
android:id="#+id/listview"
android:layout_width="wrap_content"
android:layout_height="250dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="#+id/toolbar"
android:listSelector="#color/colorPrimary"
android:background="#color/windowBackground"
android:choiceMode="singleChoice"/>
Make your rows reflect activated state
In the comments you give your adapter as follows:
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, text1, listOfThings);
You also asked me if it's possible to keep using standard adapter to achieve desired behavior. We can for sure, but anyway a few changes are required. I can see 3 options for this case:
1. Using standard android checked layout
You can just specify a corresponding standard layout - either any of the layouts that use CheckedTextView without changed background drawable as the root component or of those that use activatedBackgroundIndicator as their background drawable. For your case the most appropriate option should be the simple_list_item_activated_1. Just set it as in your ArrayAdapter constructor like this:
final ArrayAdapter<String> adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_activated_1, android.R.id.text1, listOfThings);
This option is the closest to what i understand by 'standard' adapter.
2. Customize your adapter
You can use standard layout and mostly standard adapter with a small exception of getting a view for your items. Just introduce an anonymous class and override the method getView(), providing row views with corresponding background drawable:
final ArrayAdapter<String> adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, android.R.id.text1, listOfThings) {
#NonNull
#Override
public View getView(int position, #Nullable View convertView, #NonNull ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
if (convertView == null) {
view.setBackgroundResource(R.drawable.list_item_bg);
}
return view;
}
};
3. Customize your layout
The most common way of addressing this issue is of course introducing your own layout for the items view. Here is my simple example:
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#drawable/list_item_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="16dp">
<TextView
android:id="#android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</FrameLayout>
I saved it in a file /res/layout/list_view_item.xml Do not forget setting this layout in your adapter:
final ArrayAdapter<String> adapter = new ArrayAdapter(this, R.layout.list_view_item, android.R.id.text1, listOfThings);
Clearing selection
After that your rows will reflect selected state when they are clicked, and you can easily clear the selected state of your ListView by calling clearChoices() and consequence requestLayout() to ask the ListView to redraw itself.
One little comment here that if you want unselect the item when user start typing, but not when he actually clicks the return (done) button, you need to use a TextWatcher callback instead:
mEditText.addTextChangedListener(new TextWatcher(){
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (mListView.getCheckedItemCount() > 0) {
mListView.clearChoices();
mListView.requestLayout();
}
}
#Override
public void afterTextChanged(Editable s) {}
});
Hopefully, it helped.
I have a good solution to do that. Add EditText to your layout which contains on your ListView as this layout:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:id="#+id/list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:choiceMode="singleChoice"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Comment"
android:layout_below="#id/list_view"
android:id="#+id/editText"
android:nextFocusUp="#id/editText"
android:nextFocusLeft="#id/editText"/>
</RelativeLayout>
Then initialize Boolean variable to check whether editText if focused or not for example use this : boolean canBeSelected = true;
Then after setting adapter use this code:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if (canBeSelected) {
listView.setSelector(R.drawable.background);
listView.setSelected(true);
listView.setSelection(i);
} else {
if (!editText.isFocused()){
canBeSelected = true;
listView.setSelector(R.drawable.background);
listView.setSelected(true);
listView.setSelection(i);
}
}
}
});
editText.setOnTouchListener(new View.OnTouchListener() {
#Override
public boolean onTouch(View view, MotionEvent motionEvent) {
canBeSelected = false;
Drawable transparentDrawable = new ColorDrawable(Color.TRANSPARENT);
listView.setSelector(transparentDrawable);
listView.clearChoices();
listView.setSelected(false);
return false;
}
});
editText.addTextChangedListener(new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (editText.isFocused()){
Drawable transparentDrawable = new ColorDrawable(Color.TRANSPARENT);
listView.setSelector(transparentDrawable);
listView.clearChoices();
listView.setSelected(false);
canBeSelected = false;
}
}
#Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
Drawable transparentDrawable = new ColorDrawable(Color.TRANSPARENT);
listView.setSelector(transparentDrawable);
listView.clearChoices();
listView.setSelected(false);
canBeSelected = false;
}
#Override
public void afterTextChanged(Editable editable) {
if (editText.isFocused()) {
Drawable transparentDrawable = new ColorDrawable(Color.TRANSPARENT);
listView.setSelector(transparentDrawable);
listView.clearChoices();
listView.setSelected(false);
canBeSelected = false;
}
}
});
}
Hope it works with you :)
Re-setting the adapter in the edittext listener worked for me:
editText.addTextChangedListener(new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
#Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
listview.clearChoices();
listview.setAdapter(adapter);
Toast.makeText(getApplicationContext(),"Typing" + listview.getSelectedItemPosition(), Toast.LENGTH_SHORT).show();
}
#Override
public void afterTextChanged(Editable editable) {
}
});
I put the selected index in a toast to check if the item was correctly deselected.
Hope this works!!
Just call clear when you make the request for the second data set:
arrayAdapter!!.clear()
You load your first data set
The user select one elements,
This action highlight your item
For any reason you launch the reload of your data set (because edittext's value changed),
at this moment call, clear() on your adapter.
Then you retrieved your dataset, you send it to the arrayAdapter and
No one is selected .
This is because when you clear, it also clear the selected flag