【问题标题】:how to assign counter value to expandable list view button如何将计数器值分配给可扩展列表视图按钮
【发布时间】:2018-10-05 06:25:32
【问题描述】:

我有可扩展的列表视图,每个视图都有按钮。我需要为每个按钮设置一个标签,例如 button1(count 0)、button1(count 1)、button1(count 2).......我每次都尝试递增 count,但它正在设置一些随机计数器值.

我怀疑我在错误的地方做 counter++ 请有人建议我在哪里可以增加计数器值。

通用分配计数器:

int counter = 0;

在 getChildView() 方法中

 @Override
public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) {
   if (view == null) {
        holder = new ViewHolder();
        LayoutInflater parentInflater = (LayoutInflater) mctx.getSystemService(mctx.LAYOUT_INFLATER_SERVICE);
        view = parentInflater.inflate(R.layout.itemname_child_layout, null);
        holder.button = view.findViewById(R.id.childrecordbtn);
 } else {
        holder = (ViewHolder) view.getTag();
 }

 holder.button.setTag(counter);

 holder.button..setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
          int tag = view.getTag();
          Log.i("Tag Value = ",tag);
        }
 }
 counter++;
 return view;
}

上面的代码在按钮点击后返回一些随机值。

输出:

Button1 : "Tag Value : 24"
Button2 : "Tag Value : 25"
Button3 : "Tag Value : 113"

【问题讨论】:

    标签: android expandablelistview


    【解决方案1】:

    看看getChildView()的定义:

    getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)
    

    这意味着在您的代码中,igroupPositioni1childPosition。您应该只依靠这些参数来确定每一行的内容,而不是使用外部计数器。

    可以通过以下计算得到一维数组索引:

    int sum = 0;
    for(int j = 0;j < i; j++)
    {
           sum += getChildrenCount(j);
    }
    final int arrayIndex = sum + i1;
    holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.i("Tag Value = ",arrayIndex);
            }
     }
    

    【讨论】:

    • 感谢瑞奇的回复。我同意你的观点,但我的情况略有不同,我需要将一些文本存储到具有该按钮确切位置的数组中。由于我使用的是可扩展列表视图,它只是二维数组,所以我不想存储文本总是取决于子位置。
    • 所以你想让你的按钮知道groupPositionchildPosition 对吗?实际上setTag() 是不必要的。您可以在onClick 中直接使用ii1
    • 标签在许多视图共享同一个事件监听器时很有用。在这种情况下,由于您为每个按钮都设置了一个新的侦听器,因此每个侦听器都可以不同,因此您可以直接在侦听器中使用 ii1
    • 此外,我认为您在if (view == null) 的正文中缺少view.setTag(holder);,以便您可以在视图不为空(重用)时取回持有人。没有这个,你最终会在某个时候得到NullPointerException
    • 是的,谢谢,但是我如何将文本字段值存储在没有计数器的确切按钮位置?我正在使用一维数组来存储文本字段值。如果我使用 i 和 i1 值,那么我需要使用二维数组吗?但我不想将它存储在二维数组中。
    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多