使用自定义适配器和视图持有者的Android列表视图

时间:2014-03-11 06:08:17

标签: android listview custom-adapter

我正在尝试使用视图持有者制作自定义适配器。

Log.i(CardHolderConstants.LOGIN_INFO, "cardsize>0");
        myListAdapater=new MyListAdapater(this,cardList);       
        listview.setAdapter(myListAdapater);

我在这里调用扩展baseadpater的类mylist。 CardList包含从数据库中检索的卡对象列表。

    static class ViewHolder{
        public TextView cardId,cardNumber,cardName;

    }

    class MyListAdapater extends BaseAdapter{
        List<Card> cardListForDisplay;
         LayoutInflater inflater ; Context context;
        public MyListAdapater(Context context,List<Card> cardListForDisplay) {
            super();
            Log.i(CardHolderConstants.LOGIN_INFO, "inside mylist");
            this.cardListForDisplay = cardListForDisplay;
            this.context=context;

        }



        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return cardListForDisplay.size();
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(int arg0, View view, ViewGroup parent) {            
            View rowView = view; 
            ViewHolder holder;
            if(rowView==null){  
                holder=new ViewHolder();
                inflater = ((Activity) context).getLayoutInflater();
                  rowView = inflater.inflate(R.layout.card_list, parent, false);                  
                  holder.cardId=(TextView)rowView.findViewById(R.id.displayCardID);
                  holder.cardName=(TextView)rowView.findViewById(R.id.displayCardName);
                  holder.cardNumber=(TextView)rowView.findViewById(R.id.displayCardNumber);
                  rowView.setTag(holder);
            }
            else{
                holder=(ViewHolder) rowView.getTag();
            }
            Log.i(CardHolderConstants.CARD_HOLDER, "inside getView class");
            for(Card card:cardListForDisplay){
                if(card!=null){
                long cardID= card.getCardId();
                String cardName=card.getCardName();
                long cardNumber=card.getCardNumber();
                if(Utils.isNumberNullOrEmpty(cardID)==false && Utils.isNumberNullOrEmpty(cardNumber)==false
                        && Utils.isStringNullOrEmpty(cardName)==false)
                 holder.cardId.setText(Long.toString(cardID));
                 holder.cardNumber.setText(Long.toString(cardNumber));
                 holder.cardName.setText(cardName);
                }
            }


            return rowView;
        }

    }
}

初始化类时,不会调用get view方法 打印构造函数中的日志。为什么我的getview方法没有被调用。 列表正在显示。但正在显示相同的项目。在listview中迭代的正确方法是什么

5 个答案:

答案 0 :(得分:2)

你有

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return 0;
}

应该是

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return cardListForDisplay.size();
}

也改为

public Object getItem(int arg0) {
    return arg0; // can be cardListForDisplay.get(arg0)
}

@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0; // can be cardListForDisplay.indexOf(getItem(arg0))
}

编辑:

Card card = (Card) cardListForDisplay.get(position);      
long cardID= card.getCardId();
String cardName=card.getCardName();
long cardNumber=card.getCardNumber();
holder.cardId.setText(Long.toString(cardID));
holder.cardNumber.setText(Long.toString(cardNumber));
holder.cardName.setText(cardName);

答案 1 :(得分:2)

你必须改变两件事,

  1. 更改getItem方法
    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }
    
  2.     @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return cardListForDisplay.get(arg0);
        }
    
    1. 您的获取View方法应该为一个视图执行工作,即一次一行。因为这将被调用每一行,所以需要for循环。
    2. 将其更改为以下内容,

          if(rowView==null){  
                  holder=new ViewHolder();
                  inflater = ((Activity) context).getLayoutInflater();
                    rowView = inflater.inflate(R.layout.card_list, parent, false);                  
                    holder.cardId=(TextView)rowView.findViewById(R.id.displayCardID);
                    holder.cardName=(TextView)rowView.findViewById(R.id.displayCardName);
                    holder.cardNumber=(TextView)rowView.findViewById(R.id.displayCardNumber);
                    rowView.setTag(holder);
              }
              else{
                  holder=(ViewHolder) rowView.getTag();
              }
              Log.i(CardHolderConstants.CARD_HOLDER, "inside getView class");
              Card card = getItem(position);
                  if(card!=null){
                  long cardID= card.getCardId();
                  String cardName=card.getCardName();
                  long cardNumber=card.getCardNumber();
                  if(Utils.isNumberNullOrEmpty(cardID)==false && Utils.isNumberNullOrEmpty(cardNumber)==false
                          && Utils.isStringNullOrEmpty(cardName)==false)
                   holder.cardId.setText(Long.toString(cardID));
                   holder.cardNumber.setText(Long.toString(cardNumber));
                   holder.cardName.setText(cardName);
                  }    
      
      
              return rowView;
          }
      

答案 2 :(得分:1)

只需从

更改此处
@Override
public int getCount() {
// TODO Auto-generated method stub
return 0;
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return cardListForDisplay.size();
}

也在这里

 @Override
 public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return arg0;
}

@Override
public long getItemId(int arg0) {
    // TODO Auto-generated method stub
    return arg0;
}

最后改变这个

class MyListAdapaterextends BaseAdapter{

class MyListAdapaterextends extends BaseAdapter{

答案 3 :(得分:0)

正确覆盖'getCount'....检查此方法的'return'值

答案 4 :(得分:0)

您的getCount()方法的硬编码返回0。所以ListAdapter认为列表对象的列表/数组中没有项目。

改变这个:

 @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return 0;
        }

类似于:

return sizeOfyourList;
相关问题