【问题标题】:Data does not display properly in Adapter when Removing/Adding删除/添加时数据无法在适配器中正确显示
【发布时间】:2015-06-19 16:12:41
【问题描述】:

我遇到了一个问题,我使用 2 个单独的适配器和 2 个单独的 GridView(1 个适配器,用于 1 个 GridView),并且基本上从任一适配器中删除项目,如果按下项目,则将其添加到另一个,反之亦然。

当我在一个 GridView 中按下和项目时,该项目将从其各自的适配器中删除并放入另一个 GridView 及其各自的适配器中。问题似乎与数据的存储方式(可能)有关,因为当我将项目添加到适配器时,图标与它们应有的完全不同。

注意:我还注意到,这只发生在按下第一个项目后按下的项目。因此,将正确添加/删除第一项数据。但是,我发现当占据关联适配器第一个位置的项目时,现在将具有先前删除项目的图标。

我该怎么做才能确保数据与按下的项目保持一致?

适配器类

public class MiscChargeOptionsAdapter extends ArrayAdapter<CarClassSettingDetails> {

private LayoutInflater inflater;

public MiscChargeOptionsAdapter(Context context, List<CarClassSettingDetails> settingList) {
    super(context, R.layout.misc_charge_option_layout, R.id.option_grid_option_text, settingList);
    inflater = LayoutInflater.from(context);
}

@SuppressLint("InflateParams")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    CarClassSettingDetails settingsDetails = this.getItem(position);
    ViewHolder vh;
    if (convertView == null) {
        vh = new ViewHolder();
        convertView = inflater.inflate(R.layout.misc_charge_option_layout, null);
        vh.optionText = (TextView) convertView.findViewById(R.id.option_grid_option_text);
        vh.settingView = (SettingView) convertView.findViewById(R.id.option_grid_option_icon);
        convertView.setTag(vh);
    } else {
        vh = (ViewHolder) convertView.getTag();
    }

    vh.optionText.setText(settingsDetails.getName());

    vh.settingView.setIcon(settingsDetails.getIcon());
    vh.settingView.setIconSelected(settingsDetails.getIconSelected());
    vh.settingView.setViewBackgroundColor(settingsDetails.getViewBackgroundColor());
    vh.settingView.setBackgroundColorSelected(settingsDetails.getBackgroundColorSelected());
    vh.settingView.setAmountBackgroundColor(settingsDetails.getAmountBackgroundColor());
    vh.settingView.setAmountTextColor(settingsDetails.getAmountTextColor());
    vh.settingView.setValue(settingsDetails.getValue());
    vh.settingView.setIgnoreSetState(true);
    vh.settingView.setTag(position);
    return convertView;
}

class ViewHolder {
    private TextView optionText;
    private SettingView settingView;

    /*      public ViewHolder(TextView optionText, SettingView settingView) {
                this.optionText = optionText;
                this.settingView = settingView;
            }*/

    public TextView getOptionText() {
        return optionText;
    }

    public SettingView getSettingView() {
        return settingView;
    }
}

}

如何设置适配器

selectedAdapter = new CarClassOptionsAdapter(getActivity(), selectedSettingsList); 

unselectedAdapter = new CarClassOptionsAdapter(getActivity(), unselectedSettingsList);


    gridSelected.setAdapter(selectedAdapter); 
    gridSelected.setOnItemClickListener(this);
    gridUnselected.setAdapter(unselectedAdapter); 
    gridUnselected.setOnItemClickListener(this);

我如何在适配器中添加/删除项目

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    if (parent.getAdapter() == selectedAdapter) {
        //TODO: ADD DIALOGS
        unselectedAdapter.add(selectedAdapter.getItem(position));
        unselectedAdapter.notifyDataSetChanged();
        selectedAdapter.remove(selectedAdapter.getItem(position));
        selectedAdapter.notifyDataSetChanged();

    } else if (parent.getAdapter() == unselectedAdapter) {
        //TODO: ADD DIALOGS
        selectedAdapter.add(unselectedAdapter.getItem(position));
        selectedAdapter.notifyDataSetChanged();
        unselectedAdapter.remove(unselectedAdapter.getItem(position));
        unselectedAdapter.notifyDataSetChanged();
    }
}

这就是 CarClassSettingDetails 类的填充方式

private void addMiscChargeSelected(Ws_MiscChargeSelected miscChargeSelected, boolean isSelected) {

    try {
        CarClassSettingDetails settingDetails = new CarClassSettingDetails(getActivity());

        if (miscChargeSelected.getCode() != null && !miscChargeSelected.getCode().equals("")) {
            settingDetails.setCode(miscChargeSelected.getCode());
        }

        if (miscChargeSelected.getName() != null && !miscChargeSelected.getName().equals("")) {
            settingDetails.setName(miscChargeSelected.getName());
        }

        if (miscChargeSelected.getIcon() != null && !miscChargeSelected.getIcon().equals("")) {
            Bitmap settingIcon = IconUtils.loadIcon(getActivity(), miscChargeSelected.getIcon());
            Bitmap settingIconSelected = IconUtils.loadIcon(getActivity(), miscChargeSelected.getIcon());
            settingDetails.setIcon(settingIcon);
            settingDetails.setIconSelected(settingIconSelected);
        }
        if (miscChargeSelected.getValue() != null && !miscChargeSelected.getValue().equals("")) {
            settingDetails.setValue(Ws_Value.fromInt(Integer.parseInt(miscChargeSelected.getValue())));
            settingDetails.setAmountBackgroundColor(Color.parseColor("#00ffffff"));
            settingDetails.setAmountTextColor(Color.parseColor("#ff00428e"));
        } else {
            settingDetails.setValue(null);
        }
        settingDetails.setViewBackgroundColor(Color.parseColor("#ffd4d4d4"));
        settingDetails.setBackgroundColorSelected(Color.parseColor("#ff616161"));

        if (isSelected) {
            //TODO: ADD TO TOP ADAPTER
            selectedSettingsList.add(settingDetails);
        } else {
            //TODO: ADD TO BOTTOM ADAPTER       
            unselectedSettingsList.add(settingDetails);
        }
    } catch (Exception e) {
        Log.e(TAG, e.getMessage());
    }
}

杂项费用详情

public class MiscChargeSettingDetails {
    private Context context;
    private String code;
    private String name;
    private String description;
    private Bitmap icon = null;
    private Bitmap iconSelected = null;
    private Ws_Value value = null;
    private int amountBackgroundColor, amountTextColor, viewBackgroundColor, backgroundColorSelected;

    public MiscChargeSettingDetails(Context context) {
        this.context = context;
    }

    protected Context getContext() {
        return context;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Bitmap getIcon() {
        return icon;
    }

    public void setIcon(Bitmap icon) {
        this.icon = icon;
    }

    public Bitmap getIconSelected() {
        return iconSelected;
    }

    public void setIconSelected(Bitmap iconSelected) {
        this.iconSelected = iconSelected;
    }

    public Ws_Value getValue() {
        return value;
    }

    public void setValue(Ws_Value value) {
        this.value = value;
    }

    public int getAmountBackgroundColor() {
        return amountBackgroundColor;
    }

    public void setAmountBackgroundColor(int amountBackgroundColor) {
        this.amountBackgroundColor = amountBackgroundColor;
    }

    public int getAmountTextColor() {
        return amountTextColor;
    }

    public void setAmountTextColor(int amountTextColor) {
        this.amountTextColor = amountTextColor;
    }

    public int getViewBackgroundColor() {
        return viewBackgroundColor;
    }

    public void setViewBackgroundColor(int viewBackgroundColor) {
        this.viewBackgroundColor = viewBackgroundColor;
    }

    public int getBackgroundColorSelected() {
        return backgroundColorSelected;
    }

    public void setBackgroundColorSelected(int backgroundColorSelected) {
        this.backgroundColorSelected = backgroundColorSelected;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

【问题讨论】:

  • 您有 2 个适配器和 1 个网格吗?第二个代码块中的 if 语句对我来说没有意义,因为在这两种情况下,您都会检查 parent 是否设置为选中或未选中的适配器。也许在第二个代码块中添加更多代码,以便我们更好地理解上下文
  • 有 2 个适配器和 2 个 GridView。每个 GridView 1 个适配器。
  • 哦,我明白了。您对两者都使用相同的 OnItemClickListener,脑放屁...
  • 我刚刚也更新了一些信息。
  • 您能发布您的 CarClassSettingDetails 代码吗?我写了一个模拟应用程序,它基本上可以在网格之间切换项目,但我的没有这个问题。

标签: android listview gridview android-arrayadapter android-view


【解决方案1】:

您能否显示您填充 SettingView 列表的位置?您的数据模型(SettingView)是否扩展了 View?将视图对象用作模型并不是最好的主意。

【讨论】:

  • 我将更新整个问题,因为我只是改变了我做这件事的方式。我不再使用 SettingView 作为传递给适配器的 List 参数。我现在正在传递一个类,该类包含要从 Adapter 中设置到 SettingView 的值。
  • 那么,除了图标之外,其他数据详细信息(名称等)都可以吗?还是一切都搞砸了?
  • 似乎只有正在混合的图标。
  • 你能显示 IconUtils.loadIcon 方法和 SettingView setIcon 吗?也尝试不存储位图,而是存储路径(或名称,或您正在使用的任何内容)并在 getView 加载它们。
  • 似乎所有数据都没有通过 SettingView 正确存储。唯一保持一致的是名称,这是布局中完全独立的文本字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 2016-12-22
  • 2019-04-04
  • 1970-01-01
相关资源
最近更新 更多