【问题标题】:Making Adapter for a list with some null values为具有一些空值的列表制作适配器
【发布时间】:2013-09-01 12:49:57
【问题描述】:

有一个列表,我想使用我自己的自定义适配器在 ListView 中显示。 所以这个列表有一些空值,还有一些“重要的”非空值。

可能是这样的:

(N代表Null)

(D代表一些有价值的数据)

我的列表: [N,N,D,D,N,N,D,N,D,N,N] 例如。

所以我得到了我的适配器,但我无法处理列表中的空值。

这是我的适配器:

公共类 ItemAdapter 扩展 ArrayAdapter {

List<Item> itemList;
private Activity act;
boolean selling;

public ItemAdapter(Activity act, List<Item> itemList, boolean selling) {
    super(act, R.layout.item_view_layout, itemList);

    this.itemList = itemList;
    this.act = act;
    this.selling = selling;
}

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


        ViewHolder holder;
        final Item itemManipulated = itemList.get(position);

        if (convertView == null) {

            convertView = new ItemInShopView(act, itemManipulated);

            holder = new ViewHolder();
            holder.convertView = convertView;
            holder.itemNameTextView = (TextView) ((ItemView) convertView).getItemNameTextView();
            holder.iconImageView = (ImageView) ((ItemView) convertView).getItemIconImageView();
            holder.coinView = (CoinView) ((ItemInShopView) convertView).getCoinView();
            holder.coinView.init(act);
            holder.itemRarityHidedTextView = (TextView) ((ItemView) convertView).getItemRarityHidedTextView();

            convertView.setTag(holder);

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


            holder.itemNameTextView.setText(itemManipulated.getName());
            holder.iconImageView.setImageResource(itemManipulated.getIcon());
            holder.itemRarityHidedTextView.setText(itemManipulated.getRarity());

            Colorer.setTextViewColorByItemRarity(holder.itemNameTextView, holder.getRarity(), act);

            if (selling) {
                holder.coinView.setCoins(itemManipulated.getSellPrice());
            } else {
                holder.coinView.setCoins(itemManipulated.getPrice());
            }

            holder.convertView.setOnClickListener(new OnClickListenerWithPreventDoubleTapper(itemManipulated));

            holder.convertView.setOnLongClickListener(new OnLongClickListener() {

                @Override
                public boolean onLongClick(View v) {
                    return false;
                }
            });

            return convertView;


}

class OnClickListenerWithPreventDoubleTapper extends OnClickListenerWithPreventDoubleTap {

    Item item;

    public OnClickListenerWithPreventDoubleTapper(Item item) {
        this.item = item;

    }

    @Override
    protected void performAction() {
        new ItemDialog(act, item).show();
    }

}

static class ViewHolder {

    TextView itemRarityHidedTextView;
    TextView itemNameTextView;
    ImageView iconImageView;
    CoinView coinView;

    View convertView;

    public String getRarity() {
        return itemRarityHidedTextView.getText().toString();
    }
}

}

我怎样才能实现某种方法来让适配器处理空值并且在那里什么都不显示,或者可能显示一个没有任何内容的虚拟布局?

我无法创建没有空值的新列表并将这些新列表传递给适配器,因为空值在其他视图中具有重要意义。

我希望我的问题很清楚。如果可以的话,请帮忙。

【问题讨论】:

    标签: android android-adapter


    【解决方案1】:

    为什么不只是?

        if (itemManipulated != null){
            holder.itemNameTextView.setText(itemManipulated.getName());
            holder.iconImageView.setImageResource(itemManipulated.getIcon());
            holder.itemRarityHidedTextView.setText(itemManipulated.getRarity());
    
            Colorer.setTextViewColorByItemRarity(holder.itemNameTextView, holder.getRarity(),act);
    
            if (selling) {
                holder.coinView.setCoins(itemManipulated.getSellPrice());
            } else {
                holder.coinView.setCoins(itemManipulated.getPrice());
            }
       } else {
            holder.itemNameTextView.setText("No Item");
            ... (whatever default values you like)
       }
    

    编辑: 如果您根本不想显示空值,则需要做一些更复杂的事情。

    在getView中:找到第n条实际数据

    在getCount中:返回实际数据的条数

    getView:
    int posInArray = -1;
    for (int i =0; i <= position; i++){
        posInArray++;
        while(itemList.get(posInArray) == null){
            posInArray++;
        }
    }
    itemManipulated = itemList.get(posInArray);
    ...
    
    
    getCount:
    int count = 0;
    for(int i = 0; i < itemList.size(); i++){
        if (itemList.get(i) != null){
           count++;
        }
    }
    return count;
    

    【讨论】:

    • 我只需要忽略空值,就像它们不存在一样。我不需要 null 的列表项。
    猜你喜欢
    • 2016-11-09
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多