【问题标题】:Android Listview OnClickListenerAndroid Listview OnClickListener
【发布时间】:2016-03-13 14:01:09
【问题描述】:

我有一个列表视图,其中包含图像列表行和两个按钮。该列表从 JSON 加载。我正在尝试隐藏我单击的一行中的按钮。

我通过在BaseAdapter的getView中调用onclicklistener按钮尝试了

问题

当我连续点击一个按钮时。其他一些行的按钮被隐藏。我没有看到当前行按钮隐藏。

Toast 消息显示了我单击的按钮的正确文本,如下面的代码所示

BaseAdapter/getView

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

final ViewHolder holder;
newsItem = listData.get(position);
if (convertView == null) {
        convertView = layoutInflater.inflate(R.layout.home_single_image, null);
    }
    holder.caption1View = (Button) convertView.findViewById(R.id.btnpos);

    holder.caption1View.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            HomeListItem newsItem1 = listData.get(position);
            Toast.makeText(c,newsItem1.getCaption1(),Toast.LENGTH_LONG).show();// shows the correct position button text
             holder.caption1View.setVisibility(View.GONE);
        }
    });

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

【问题讨论】:

  • 您没有在第一次使用时初始化holder
  • 我不明白?它被初始化了
  • 我认为您不太了解 ViewHolder 是什么或如何使用它。如果您使用 ViewHolder,它应该是一个单独的类,保存您正在实例化的每个列表项的视图。您将在该类中定义onClick(),以便从该类创建的每个对象都有自己的onClick 回调。

标签: android listview android-listview


【解决方案1】:

您应该将 isVisible 变量添加到 HomeListItem 类。然后添加这些方法

class HomeListItem {
...
private boolean isVisible;

private boolean isVisible() {return isVisible};
private void setIsVisible(boolean b) { isVisible = b;}

将此代码添加到getView() 方法

if(HomeListItem.isVisible()){
 holder.caption1View.setVisibility(View.VISIBLE);
} else {
 holder.caption1View.setVisibility(View.GONE);
}

在你的点击监听器中你应该这样做

HomeListItem newsItem1 = listData.get(position);
boolean prevVisibility = newsItem1.isVisible();
newsItem1.setIsVisible(!prevVisibility);
notifyDataSetChanged();

完整的代码

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

final ViewHolder holder;
newsItem = listData.get(position);
..
  if(newsItem.isVisible()){
     holder.caption1View.setVisibility(View.VISIBLE);
    } else {
     holder.caption1View.setVisibility(View.GONE);
    }
holder.caption1View.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
          boolean prevVisibility = newsItem.isVisible();
          newsItem.setIsVisible(!prevVisibility);
          notifyDataSetChanged();
    }
});

... }

问题是 ListView 重用了视图,所以当你这样做时 holder.caption1View.setVisibility(View.GONE); 如果你不更新它就会消失。

【讨论】:

    【解决方案2】:

    这是因为适配器重用了视图。这意味着当您在行上设置caption.setVisibility(View.GONE) 时,您不仅会影响这一行,还会影响将重用该视图的另一行。

    您需要保留隐藏按钮的索引,或任何其他可以让您决定按钮是否应该隐藏一行的方法。

    然后在 getView 方法的末尾添加这些行。

    if (buttonShouldBeVisibileForIndex(position)) {//<= this is the method you need to implement
         holder.caption.setVisible(View.GONE);
    } else {
         holder.caption.setVisible(View.VISIBLE);
    }
    

    【讨论】:

      【解决方案3】:

      试试这个

      public View getView(final int position, View convertView, ViewGroup parent) {
      
              final ViewHolder holder;
              if (convertView == null) {
                  convertView = layoutInflater.inflate(R.layout.home_single_image, null);
                  holder = new ViewHolder();
                  holder.caption1View = (Button) convertView.findViewById(R.id.btnpos);
                  convertView.setTag(holder);
              }else {
                  holder = (ViewHolder) convertView.getTag();
              }
      
              newsItem = listData.get(position);
      
      
              holder.caption1View.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      HomeListItem newsItem1 = listData.get(position);
                      Toast.makeText(c, newsItem1.getCaption1(), Toast.LENGTH_LONG).show();// shows the correct position button text
                      holder.caption1View.setVisibility(View.GONE);
                  }
              });
      
              return convertView;
          }
      

      【讨论】:

      • 同样的,当点击按钮时,其他一些行按钮被隐藏
      • 在 if 条件中添加holder = new ViewHolder();
      • 你能把你的整个适配器和viewholder类贴出来吗?
      猜你喜欢
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 2011-05-26
      • 2016-03-15
      相关资源
      最近更新 更多