android适配器listview,更改为一行

时间:2016-07-21 22:01:37

标签: android listview

我有一个listView持有项目,其中一个项目突出显示。

当他们点击某个项目时,我希望不再突出显示突出显示的卡片,并突出显示新项目。

到目前为止我做了什么。

我用一个列表调用适配器,列表中的一个项是defaultItem,它是true或false。

当getView被调用时,我有一个if defaultItem,并且我对这些项目的UI进行了更改。我还将该项保存在名为currentDefaultItem的类变量中。

现在,当他们点击时,我可以更改列表,以便旧的突出显示的项目为false,点击的项目为true。然后我调用notifyDataSetChanged(); 但这似乎不起作用。

show getView

@Override
public View getView(final int position, View v, ViewGroup parent) {
    ViewHolder holder;
    Card card = getItem(position);
    if (v == null) {
        v = mInflater.inflate(R.layout.row_cards, parent, false);

    holder = new ViewHolder();
        holder.tvName = (TextView) v.findViewById(R.id.tvName);
        holder.tvBrand = (TextView) v.findViewById(R.id.tvBrand);
    holder.tvLastFour = (TextView) v.findViewById(R.id.tvLastFour);
    holder.tvCounter = (TextView) v.findViewById(R.id.tvCounter);
    holder.tvCard = (ImageView) v.findViewById(R.id.tvCard);
        holder.arrow = (ImageView) v.findViewById(R.id.arrow);
        holder.tick = (ImageView) v.findViewById(R.id.tick);

        if (card.getDefaultcard().intValue()==(1)){
            holder.tick.setVisibility(View.VISIBLE);
            positionOfDefault=position;
        }


        String brand = card.getBrand();
        switch (brand.toLowerCase()){
            case "visa":
                holder.tvCard.setImageResource(R.drawable.visa2);
                break;
            case "mastercard":
                holder.tvCard.setImageResource(R.drawable.mastercardx2);
                break;
            case "diners":
                holder.tvCard.setImageResource(R.drawable.dinersclub2);
                break;
            case "amex":
                holder.tvCard.setImageResource(R.drawable.americanexpress2);
                break;
            case "jcb":
                holder.tvCard.setImageResource(R.drawable.jcg2);
                break;
            case "discover":
                holder.tvCard.setImageResource(R.drawable.discover);
                break;
        }

    holder.b_delete_in_list = (Button) v.findViewById(R.id.b_delete_in_list);

    holder.b_delete_in_list.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            deleteCard(position);
        }
    });
        holder.b_set_default = (Button) v.findViewById(R.id.b_set_default);

        holder.b_set_default.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                updatePaymentMethod(position);
            }
        });
    //
    v.setTag(holder);

    //
} else {
    holder = (ViewHolder) v.getTag();
}
    holder.tvName.setText(cardList.get(position).getName().toUpperCase());
    holder.tvBrand.setText(cardList.get(position).getBrand().toUpperCase());
    holder.tvLastFour.setText(cardList.get(position).getLast_four_digits());


    return v;
} 

3 个答案:

答案 0 :(得分:1)

问题是你的else语句没有更新视图。使用适配器,您的视图将加载适合屏幕的项目的最大数量,这些项目将为null,因此它会命中第一个if语句,因为开始视图为空。然后,一旦你更新这些视图不再是null。所以你必须在else语句中更改View属性。

答案 1 :(得分:1)

您管理默认项目的代码:

    if (card.getDefaultcard().intValue()==(1)){
        holder.tick.setVisibility(View.VISIBLE);
        positionOfDefault=position;
    }

必须不在 if(view == null)中,因为 if(view == null)中的代码只运行1,所以当您更改默认值时代码永远不会再运行。

答案 2 :(得分:1)

试试这个

@Override
public View getView(final int position, View v, ViewGroup parent) {
    ViewHolder holder;
    Card card = getItem(position);
    if (v == null) 
    {
        v = mInflater.inflate(R.layout.row_cards, parent, false);
        holder = new ViewHolder();
        holder.tvName = (TextView) v.findViewById(R.id.tvName);
        holder.tvBrand = (TextView) v.findViewById(R.id.tvBrand);
        holder.tvLastFour = (TextView) v.findViewById(R.id.tvLastFour);
        holder.tvCounter = (TextView) v.findViewById(R.id.tvCounter);
        holder.tvCard = (ImageView) v.findViewById(R.id.tvCard);
        holder.arrow = (ImageView) v.findViewById(R.id.arrow);
        holder.tick = (ImageView) v.findViewById(R.id.tick);

        v.setTag(holder);
     } else {
         holder = (ViewHolder) v.getTag();
     }

     if (card.getDefaultcard().intValue()==(1))
     {
            holder.tick.setVisibility(View.VISIBLE);
            positionOfDefault=position;
     }
     String brand = card.getBrand();
     switch (brand.toLowerCase()){
            case "visa":
                holder.tvCard.setImageResource(R.drawable.visa2);
                break;
            case "mastercard":
                holder.tvCard.setImageResource(R.drawable.mastercardx2);
                break;
            case "diners":
                holder.tvCard.setImageResource(R.drawable.dinersclub2);
                break;
            case "amex":
                holder.tvCard.setImageResource(R.drawable.americanexpress2);
                break;
            case "jcb":
                holder.tvCard.setImageResource(R.drawable.jcg2);
                break;
            case "discover":
                holder.tvCard.setImageResource(R.drawable.discover);
                break;
        }

    holder.b_delete_in_list = (Button)v.findViewById(R.id.b_delete_in_list);

    holder.b_delete_in_list.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            deleteCard(position);
        }
    });
        holder.b_set_default = (Button) v.findViewById(R.id.b_set_default);

        holder.b_set_default.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                updatePaymentMethod(position);
            }
        });
    holder.tvName.setText(cardList.get(position).getName().toUpperCase());
    holder.tvBrand.setText(cardList.get(position).getBrand().toUpperCase());
    holder.tvLastFour.setText(cardList.get(position).getLast_four_digits());


    return v;
}