【问题标题】:Having trouble in for custom listview adapter class自定义列表视图适配器类遇到问题
【发布时间】:2014-04-21 01:03:57
【问题描述】:

我尝试创建一个扩展 SimpleAdapter 的类并覆盖 getView() 方法以防止我的列表视图出现颜色变化问题(当第一项回收到底部时,颜色也会再次出现)。但是,我是这样写的:

公共类适配器扩展 SimpleAdapter {

    public Adapter(Context context, List<? extends Map<String, ?>> data,
            int resource, String[] from, int[] to) {
        super(context, data, resource, from, to);
        // TODO Auto-generated constructor stub
    }

    class ViewHolder {
        TextView txt_textview = null;
        TextView txt_distance = null;
        TextView txt_starimage = null;
        ImageView txt_imageview = null;
    }

    HashMap<Integer, View> lmap = new HashMap<Integer, View>();

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        View view = super.getView(position, convertView, parent);
        ViewHolder holder = null;


        if (lmap.get(position) == null) {
            view =LayoutInflater.from(getApplicationContext()).inflate(
                    R.layout.activity_bank_listview_item,null);
            holder = new ViewHolder();
            holder.txt_starimage = (TextView) view
                .findViewById(R.id.bank_listview_starimage);
            holder.txt_imageview = (ImageView) view
                .findViewById(R.id.bank_listview_imageview);
            holder.txt_distance = (TextView) view
                    .findViewById(R.id.bank_listview_distance);
            holder.txt_textview = (TextView) view
                    .findViewById(R.id.bank_listview_textview);

            lmap.put(position, view);
            view.setTag(holder);
        } else {
            view = lmap.get(position);
            holder = (ViewHolder) view.getTag();
        }

        return view;
    }


} 

但是listview只出现第一页listview项,后面的页面是空的(只包含空布局)。我怎么解决这个问题?谢谢!

【问题讨论】:

    标签: android android-listview android-adapter


    【解决方案1】:

    问题出在这一行:

    if (lmap.get(position) == null) {
    

    您应该检查 convertView 是否为空。如果它为空,则需要为新视图充气。如果不是,您应该重复使用它。

    例如

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
       LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
       ViewHolder holder;
       if (convertView == null){
           convertView = inflater.inflate(R.layout.row, parent, false);
           holder = new ViewHolder();
           init(convertView, holder); // findViewById stuff
           convertView.setTag(holder);
       } else {
           holder = (ViewHolder) convertView.getTag();
       }
    
       setView(position, holder, convertView); // fill in the textviews, set background color etc.
       return convertView;
    

    }

    【讨论】:

    • 感谢您的回复!但我对 LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 中的“context”(context.getSystemService...) 有问题无法解析显示上下文...
    • 要使用上下文,需要将其存储在适配器构造函数中的局部变量中。
    • 如:public Adapter(Context context, List extends Map> data, int resource, String[] from, int[] to) { private Context context;超级(上下文、数据、资源、从、到); // TODO 自动生成的构造函数存根 }... 开头?再次感谢您的帮助!
    • 我收回本地。在适配器类中定义一个变量,以便它可以被其中定义的所有方法访问。将上下文存储到您在构造函数中定义的变量中。
    猜你喜欢
    • 2012-02-21
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多