开发者

Filter text and image in a custom listView with ArrayAdapter

When I use an ArrayList <ArrayList<String>>, the text is filtered, but the images don't appear correctly (the order of the images stays the 开发者_如何学编程same).

When I use an ArrayList <HashMap<String, String>>, the text is not well filtered (all elements are filtered).

What is wrong with my code? (Please see code for the ArrayList <HashMap<String, String>> below.)

ListActivity :

public class myListActivity extends ListActivity{

private ImageInDiscountCardListAdapter adapter;
private EditText filterText;
private ArrayList<HashMap<String, String>> retailerList;
private HashMap<String, String> retailerInfo;
private TextWatcher filterTextWatcher = new TextWatcher() {

    public void afterTextChanged(Editable s){
    }

    public void beforeTextChanged(CharSequence s, int start, int count, int after){
    }

    public void onTextChanged(CharSequence s, int start, int before, int count){
        if (adapter!=null){
            adapter.getFilter().filter(s);
        }
    }

};

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_layout);

    addImageUrl();

    this.filterText = (EditText) findViewById(R.id.name);
    this.filterText.addTextChangedListener(filterTextWatcher);  

    this.adapter = new ImageInDiscountCardListAdapter(this, retailerList);
    setListAdapter(adapter);

}

@Override
public void onDestroy(){

    adapter.imageLoader.stopThread();
    setListAdapter(null);
    filterText.removeTextChangedListener(filterTextWatcher);
    super.onDestroy();

}

@Override
protected void onListItemClick(ListView l, View v, int position, long id){

    //this.filterText.setText(this.item.get(position));

}

public void addImageUrl(){

    this.retailerList = new ArrayList<HashMap<String,String>>();

    this.retailerInfo = new HashMap<String, String>();
    retailerInfo.put("name", "Fnac");
    retailerInfo.put("imageUrl", "http://android-france.fr/wp-content/uploads/2010/09/FNAC.jpg");
    this.retailerList.add(retailerInfo);

    // etc...

}

Adapter :

public class ImageInDiscountCardListAdapter extends ArrayAdapter<HashMap<String, String>> {

    private Activity activity;
    private ArrayList<HashMap<String, String>> retailerList;
    private static LayoutInflater inflater;
    public ImageLoader imageLoader; 

    public ImageInDiscountCardListAdapter(Activity activity, ArrayList<HashMap<String, String>> retailerList) {

        super(activity, android.R.layout.simple_list_item_1, retailerList);
        this.activity = activity;
        this.retailerList = retailerList;
        inflater = (LayoutInflater)this.activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.imageLoader = new ImageLoader(this.activity.getApplicationContext());

    }

    public static class ViewHolder{
        public TextView text;
        public ImageView image;
    }

    public View getView(int position, View convertView, ViewGroup parent){

        View view = convertView;
        ViewHolder holder;

        if(view == null){
            view = inflater.inflate(R.layout.retailer_row, null);
            holder = new ViewHolder();
            holder.text=(TextView)view.findViewById(R.id.retailer_name);;
            holder.image=(ImageView)view.findViewById(R.id.retailer_image);
            view.setTag(holder);
        }

        else{
            holder=(ViewHolder)view.getTag();
        }

        holder.text.setText(getItem(position).get("name"));
        holder.image.setTag(this.retailerList.get(position).get("imageUrl"));
        imageLoader.DisplayImage(this.retailerList.get(position).get("imageUrl"), activity, holder.image);

        return view;

    }

}


Your getview function is strange... why did you do different code in if(view == null){ ....

That whole section is used to recycle the view when it comes in so you don't need to instanciate a new view.

But you use it to put custom code in it?

This is what one of my adapter getview() function looks like

public View getView(int position, View convertView, ViewGroup parent)
{
    View v = convertView;
    ViewGroup p = parent;
    LayoutInflater inflater;

    // Create a new view only if we cannot recycle the one passed to this function.
    if (v == null)
    {
        inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.artifact_list_item, p, false);
    }

Then you can add your custom code.

That is probably where I would start investigating Sebastien.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜