新加参数,控制listview的显示,而不是获得listView中的View对象直接改变!

来源:互联网 发布:美国人常用的软件 编辑:程序博客网 时间:2024/05/17 06:31

(1)在listView中,若需要控制ListView显示的状态,如item被选中时变红色,没有选中时变黑色,刚开始使用的方法是将直接取出所有item的View,组成一个view对象的list,然后在使用listview的类中判定选中的位置,改变相应的view,这种方法对于litview的数据比较少的时候可以有效控制,但对于多一点的情况,就容易出现内存问题。。多亏师兄提醒~

正确的方法:

(1)数据打包:自定义一个数据类,包括了控制listView的每个item的显示需要的 变量,如上述需求,需要在这个类中添加成员变量 boolean isSelected。

数据类:

public class TradeTitleAndIcon {    public String titleName;    public int titleIcon;    public int titleIconRed;    public boolean selected;    public TradeTitleAndIcon(String titleName,int titleIcon,int titleIconRed,boolean selected)    {        this.titleName=titleName;        this.titleIcon=titleIcon;        this.titleIconRed=titleIconRed;        this.selected=selected;    }}

(2)adapter类:按要求定义getView方法,返回的View应该是由isSelected变量控制的。View的数据来源于上述类的对象组成的list。

import android.content.Context;import android.graphics.Color;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import com.tmall.mobile.pad.R;import com.tmall.mobile.pad.ui.trade.data.TradeTitleAndIcon;import java.util.ArrayList;public class TitleListAdapter extends BaseAdapter{    ArrayList<TradeTitleAndIcon> tradeTitleAndIconList;    private Context context;    private TextView titleView;    private TextView iconView;    public TitleListAdapter(Context c, ArrayList<TradeTitleAndIcon> tradeTitleAndIconList)    {        this.tradeTitleAndIconList=tradeTitleAndIconList;        this.context = c;    }    @Override    public int getCount() {        // TODO Auto-generated method stub        return tradeTitleAndIconList.size();    }    @Override    public Object getItem(int i) {        // TODO Auto-generated method stub        return tradeTitleAndIconList.get(i);    }    @Override    public long getItemId(int i) {        // TODO Auto-generated method stub        return i;    }    public void setItemSelected(int position)    {        for (TradeTitleAndIcon tradeTitleAndIcon:tradeTitleAndIconList)        {            tradeTitleAndIcon.selected=false;        }        tradeTitleAndIconList.get(position).selected=true;        notifyDataSetChanged();    }    @Override    public View getView(int i, View view, ViewGroup viewgroup) {        titleView = null;        iconView=null;        if(view == null){            view = LayoutInflater.from(context).inflate(R.layout.trade_list_item_info, null);        }        titleView=(TextView)view.findViewById(R.id.TradeItemTitle);       titleView.setText(tradeTitleAndIconList.get(i).titleName);        iconView=(TextView)view.findViewById(R.id.TradeItemIcon);        if (tradeTitleAndIconList.get(i).selected)        {            titleView.setTextColor(Color.RED);            iconView.setBackgroundResource(tradeTitleAndIconList.get(i).titleIconRed);        }        else        {            titleView.setTextColor(Color.WHITE);            iconView.setBackgroundResource(tradeTitleAndIconList.get(i).titleIcon);        }        return view;    }}

(3)在adapter中定义setItemSelected方法,在这个方法中可改变数据list中的数据,注意最后一定要调用notifyDataSetChanged()方法,才能让数据的改变带动listView显示的改变。

    public void setItemSelected(int position)    {        for (TradeTitleAndIcon tradeTitleAndIcon:tradeTitleAndIconList)        {            tradeTitleAndIcon.selected=false;        }        tradeTitleAndIconList.get(position).selected=true;        notifyDataSetChanged();    }

方法调用:

    titleListView.setOnItemClickListener(mOnItemClickListener);
     mOnItemClickListener = new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                String itemTitle = itemTitles.get(position);                TradeItemClickEvent clickEvent = new TradeItemClickEvent(itemTitle, getEventId(itemTitle));                getMessageBus().post(clickEvent);                mTitleListAdapter.setItemSelected(position);     allIconItemViews.get(position).setBackgroundResource(itemIconsRed.get(position));            }        };
0 0
原创粉丝点击