如何在ListView中更新某些不可见项的视图?[安卓]

萨夫罗夫

社区!我需要帮助来更新ListView中的不可见项。它与项目内容无关,而与项目的视图表示有关。好的,让我向您展示我的例子。我有一个字符串数组:

<string-array name="reminder_notifications">
    <item>15 minutes before</item>
    <item>30 minutes before</item>
    <item>1 hour before</item>
    <item>1.5 hour before</item>
    <item>5 hours before</item>
    <item>8 hours before</item>
    <item>1 day before</item>
</string-array>

在活动中,我创建了适配器:

adapterNotifications = ArrayAdapter.createFromResource(this, R.array.reminder_notifications, R.layout.dialog_list_multiple_choise);

之后,使用某些方法,我可以从字符串数组中计算出抽动项,以用于当前提醒。例如,如果用户在16:00将提醒设置为16:45,那么他只能选择项目15 minutes before30 minutes before其他项目应禁用。因此,在Google之后,我发现了如何在特定位置访问不可见的ListView子级:

public View getViewByPosition(int position, ListView listView) {
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
    if (position < firstListItemPosition || position > lastListItemPosition ) {
        return listView.getAdapter().getView(position, listView.getChildAt(position), listView);
    } else {
        final int childIndex = position - firstListItemPosition;
        return listView.getChildAt(childIndex);
    }
}

现在,我面临着最后一个问题(我希望)-如何更新我从上述方法中获得的项目视图?我试图用这个:

View v = getViewByPosition(position, lvNotifications);
v.setEnabled(true);

但是它仅在第一次打开对话框后才更新View,换句话说,我必须使用ListView打开对话框窗口,将其关闭并重新打开。只有在这种情况下,我才能获得更新的视图。我知道我的英语太糟糕了,所以下面有屏幕截图:

主对话框。在使用ListView打开对话框之前主对话框。 在使用ListView打开对话框之前

列表视图对话框。第一次开放。没有项目被禁用。错误的列表视图对话框。 第一次开放。 没有项目被禁用。 错误的

列表视图对话框。第二次开放。5个项目被禁用。正确的列表视图对话框。 第二次开放。 5个项目被禁用。 正确的

谢谢你。

哭泣

您从错误的角度解决了这个问题。您不应该在适配器外部编辑视图,这就是适配器的用途。而是编写您自己的适配器。像这样做:

import android.content.Context;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;

/**
 * A {@link ArrayAdapter} to let the user select multiple notification times.
 */
public class ReminderNotificationsAdapter extends BaseAdapter implements CompoundButton.OnCheckedChangeListener {

    /**
     * A array with all currently selected entries
     */
    private boolean[] mSelected;

    /**
     * A array with all enabled entries
     */
    private boolean[] mEnabled;

    /**
     * The items to be shown
     */
    private String[] mItems;

    /**
     * A {@link Context}
     */
    private Context mContext;

    /**
     * Creates a new instance
     *
     * @param context a {@link Context}
     * @param items all selectable items
     * @param checkedItems all selected items. This array will be updated with the users selectiion
     * @param enabledItems all enabled items
     */
    public ReminderNotificationsAdapter(Context context, String[] items, boolean[] checkedItems, boolean[] enabledItems) {
        // Check array sizes
        if(items.length != checkedItems.length || checkedItems.length != enabledItems.length) {
            throw new RuntimeException("All arrays must be the same size");
        }

        // Add all and store params
        this.mContext = context;
        this.mItems = items;
        this.mSelected = checkedItems;
        this.mEnabled = enabledItems;

    }

    @Override
    public int getCount() {
        return this.mItems.length;

    }

    @Override
    public String getItem(int i) {
        return this.mItems[i];

    }

    @Override
    public long getItemId(int i) {
        return this.getItem(i).hashCode();

    }

    @NonNull
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;

        // Create view if not provided to convert
        if(v == null) {
            v = LayoutInflater.from(this.mContext).inflate(R.layout.dialog_list_multiple_choise, parent, false);
        }

        // Prepare text view
        TextView tv = (TextView) v.findViewById(android.R.id.text1);
        tv.setText(this.getItem(position));
        tv.setEnabled(this.isEnabled(position));

        // Prepare checkbox
        CheckBox cb = (CheckBox) v.findViewById(android.R.id.checkbox);
        cb.setTag(position);
        cb.setChecked(this.mSelected[position]);
        cb.setEnabled(this.isEnabled(position));
        cb.setOnCheckedChangeListener(this);

        // Return view
        return v;

    }

    @Override
    public boolean isEnabled(int position) {
        return this.mEnabled[position];

    }

    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
        this.mSelected[(Integer) compoundButton.getTag()] = b;

    }
}

并像这样使用它:

@Override
public void onClick(View view) {
    // Tell what string should be shown
    String[] entries = this.getResources().getStringArray(R.array.reminder_notifications);

    // Tell what entries should be already selected
    final boolean[] selectedEntries = new boolean[entries.length];
    selectedEntries[2] = true;

    // Tell what entries should be enabled
    boolean[] enabledEntries = new boolean[entries.length];
    enabledEntries[0] = true;
    enabledEntries[1] = true;
    enabledEntries[2] = true;
    enabledEntries[3] = true;

    // Create the adapter
    ReminderNotificationsAdapter a = new ReminderNotificationsAdapter(this, entries, selectedEntries, enabledEntries);

    // Create and show the dialog
    new AlertDialog.Builder(this)
            .setTitle("Add notification")
            .setAdapter(a, null)
            .setPositiveButton("Set", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    // Do what you want to do with the selected entries
                    Toast.makeText(MainActivity.this, Arrays.toString(selectedEntries), Toast.LENGTH_SHORT).show();

                }
            })
            .setNegativeButton("Dismiss", null)
            .show();

}

我只是使用一个布尔数组来告诉应该启用和选择哪些条目,如果需要,您可以在此处做些更优雅的事情。用户的选择在提供给适配器的构造函数的数组中更新。AlertDialog看起来像这样:

截屏

此处查看完整的示例应用程序

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在ListView中更新某些不可见项的视图?[安卓]

来自分类Dev

如何在Android中的ListView中更改不可见项的背景颜色

来自分类Dev

使视图一一可见;安卓

来自分类Dev

如何在设计器中显示不可见的视图?

来自分类Dev

如何更改同一可见项的gridview的列数。安卓

来自分类Dev

如何在ScrollView中检测包含不止一种视图类型的不可见视图

来自分类Dev

如何更新不可见/屏幕外的视图?

来自分类Dev

如何在TextInputLayout Android中更改setEndIconDrawable的可见性(可见,不可见或不可见)?

来自分类Dev

如何使一组视图在android中不可见

来自分类Dev

如何使一组视图在android中不可见

来自分类Dev

相对布局中不可见的视图

来自分类Dev

LinearLayout 中的 ListView 不可见

来自分类Dev

如何在listview的getview方法中引用listview中的第一个可见视图?

来自分类Dev

如何在VirtualStringTree中添加不可见的节点?

来自分类Dev

如何在方括号中显示不可见?

来自分类Dev

如何在Xcode 5中制作不可见的按钮?

来自分类Dev

如何在Skype中修复不可见的工具提示?

来自分类Dev

如何在构造函数中设置不可见的GUI?

来自分类Dev

如何使按钮在某些情况下在Odoo视图上不可见?

来自分类Dev

找出 ListView 中的哪些项是可见的

来自分类Dev

自定义ListView项几乎不可见

来自分类Dev

恢复到ListView中以前不可见的视图后,应用程序崩溃

来自分类Dev

如何在某些 Fragment 开始时使键盘不可见?

来自分类Dev

如何在listView中检查是否使用了微调框。安卓

来自分类Dev

ItemsControl项,不可见

来自分类Dev

如何设置不可见项而不具有不可见属性?

来自分类Dev

卡视图不可见

来自分类Dev

卡视图不可见

来自分类Dev

卡视图不可见

Related 相关文章

  1. 1

    如何在ListView中更新某些不可见项的视图?[安卓]

  2. 2

    如何在Android中的ListView中更改不可见项的背景颜色

  3. 3

    使视图一一可见;安卓

  4. 4

    如何在设计器中显示不可见的视图?

  5. 5

    如何更改同一可见项的gridview的列数。安卓

  6. 6

    如何在ScrollView中检测包含不止一种视图类型的不可见视图

  7. 7

    如何更新不可见/屏幕外的视图?

  8. 8

    如何在TextInputLayout Android中更改setEndIconDrawable的可见性(可见,不可见或不可见)?

  9. 9

    如何使一组视图在android中不可见

  10. 10

    如何使一组视图在android中不可见

  11. 11

    相对布局中不可见的视图

  12. 12

    LinearLayout 中的 ListView 不可见

  13. 13

    如何在listview的getview方法中引用listview中的第一个可见视图?

  14. 14

    如何在VirtualStringTree中添加不可见的节点?

  15. 15

    如何在方括号中显示不可见?

  16. 16

    如何在Xcode 5中制作不可见的按钮?

  17. 17

    如何在Skype中修复不可见的工具提示?

  18. 18

    如何在构造函数中设置不可见的GUI?

  19. 19

    如何使按钮在某些情况下在Odoo视图上不可见?

  20. 20

    找出 ListView 中的哪些项是可见的

  21. 21

    自定义ListView项几乎不可见

  22. 22

    恢复到ListView中以前不可见的视图后,应用程序崩溃

  23. 23

    如何在某些 Fragment 开始时使键盘不可见?

  24. 24

    如何在listView中检查是否使用了微调框。安卓

  25. 25

    ItemsControl项,不可见

  26. 26

    如何设置不可见项而不具有不可见属性?

  27. 27

    卡视图不可见

  28. 28

    卡视图不可见

  29. 29

    卡视图不可见

热门标签

归档