【问题标题】:android adapter listview, changes to a rowandroid适配器listview,更改为一行
【发布时间】:2016-11-25 16:27:50
【问题描述】:

我有一个包含项目的 listView,其中一个项目被突出显示。

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

到目前为止我做了什么。

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

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

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

节目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;
} 

【问题讨论】:

  • 从适配器的 getView 方法中粘贴代码。
  • 好的编辑问题
  • currentDefaultItem 变量在哪里?
  • 为了简单起见,我在解释时更改了一些名称,defaultItem 是 defaultCard,它不是布尔值,而是等于 1 或 0 的 int
  • 点击时你的值有变化吗?你检查好了没有?

标签: android listview


【解决方案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;
} 

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      管理默认项目的代码:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-05
        • 1970-01-01
        • 2020-06-25
        • 1970-01-01
        • 1970-01-01
        • 2013-09-07
        相关资源
        最近更新 更多