I have searched a lot, but no any solutions are working for me. I am seting a custom arrayadapter which has a imageview and a textview. I kept an edittext where i want to add text and i wish to get the list filtered by these given texts, When i use a string type array adapter this works great, but its not working in my custom adapter, here is my code:
public class CurrenciesFrom extends Activity implements OnItemClickListener {
ListView lvCurrencies;
String[] countryCode = { "BDT Bangladesh","BBF bafa" ,"USD America", "UMK Umaka","KRW Korea",
"INR India" };
int[] flag = { R.drawable.bdt, R.drawable.usd, R.drawable.aud,
R.drawable.ic_launcher ,R.drawable.usd, R.drawable.aud};
ArrayAdapter<Currency> adapter;
List<Currency> l;
EditText etsearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.currencies);
initializer();
lvCurrencies.setAdapter(adapter);
lvCurrencies.setOnItemClickListener(this);
etsearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
CurrenciesFrom.this.adapter.getFilter().filter(s.toString());
}
});
}
private List<Currency> getModel() {
List<Currency> list = new ArrayList<Currency>();
for (int i = 0; i < countryCode.length; i++) {
list.add(get(countryCode[i], flag[i]));
}
list.get(1).setSelected(true); // select one item by default
return list;
}
private Currency get(String s, int place) {
return new Currency(s, place);
}
private void initializer() {
lvCurrencies = (ListView) findViewById(R.id.lvCurrencies);
etsearch=(EditText)findViewById(R.id.etSearch);
lvCurrencies.setTextFilterEnabled(true);
// countryCode = getResources().getStringArray(R.array.Currencies);
l = getModel();
Collections.sort(l, new Comparator<Currency>() {
@Override
public int compare(Currency c1, Currency c2) {
return c1.getName().compareToIgnoreCase(c2.getName());
}
});
adapter = new Customarrayadapter(this, l);
}
My custom adapter class is:
package com.powergroupbd.yahoo;
import java.util.List;
import android.app.Activity;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
public class Customarrayadapter extends ArrayAdapter<Currency> {
private final List<Currency> list;
private final Activity context;
public Customarrayadapter(Activity context, List<Currency> list) {
super(context, R.layout.showlist, list);
this.context = context;
this.list = list;
}
static class ViewHolder {
protected TextView text;
protected ImageView sub;
protected CheckBox checkbox;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView == null) {
LayoutInflater inflator = context.getLayoutInflater();
view = inflator.inflate(R.layout.showlist, null);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) view.findViewById(R.id.label);
viewHolder.text.setTextColor(Color.WHITE);
viewHolder.sub = (ImageView) view.findViewById(R.id.sub);
viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
viewHolder.checkbox
.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
Currency element = (Currency) viewHolder.checkbox.getTag();
element.setSelected(buttonView.isChecked());
System.out.println("Checked : " + element.getName());
}
});
view.setTag(viewHolder);
viewHolder.checkbox.setTag(list.get(position));
} else {
view = convertView;
((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.text.setText(list.get(position).getName());
holder.sub.setImageResource(list.get(position).getPlace());
holder.checkbox.setChecked(list.get(position).isSelected());
return view;
}
}
Please help me :(
User this code, for filter the text
public void onTextChanged(CharSequence s, int start,
int before, int count)
{
textlength = edittext.getText().length();
text_sort.clear();
image_sort.clear();
for (int i = 0; i < text.length; i++)
{
if (textlength <= text[i].length())
{
if (edittext.getText().toString().
equalsIgnoreCase((String) text[i].subSequence(0, textlength)))
{
text_sort.add(text[i]);
image_sort.add(image[i]);
}
}
}
listview.setAdapter(new MyCustomAdapter(text_sort, image_sort));
}
}
for more, refer this site it may help you http://android-helper.blogspot.in/2011/07/android-search-in-custom-listview.html
The accepted answer is very misleading and ignores the actual problem. The OP is incorrectly subclassing ArrayAdapter
. You should never track your own list of data and instead access that data through the proper adapter methods. Eg, getItem(position)
. The ArrayAdapter
makes no guarentees that the List
instance you pass into it stays the same.
In fact, during a filter operation, it copies the data over to a new ArrayList
instance. That means your list used in the subclass is no longer referring to the same list in the ArrayAdapter
. Since you are accessing your own list in the getView()
method; instead of pulling from getItem()
, any filtering changes will be missed. In fact by this point, you also broke the ability to add or remove from the adapter as well.
Most important rule when subclassing ArrayAdapter
. Never keep an external list of data. Always refer into the ArrayAdapter
instead.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.