为什么我的自定义微调器填充了我的包名?

问题描述 投票:6回答:3

我发现this workaround为一个下拉式微调器添加了一个提示。它看起来很有前景,但是我没有得到我想要的字符串来显示在微调器中,我得到的东西看起来像我的包名(看不到全名)。

@IsaacCisneros创建了新的SpinnerItem和MySpinnerAdapter类。我完全实现了他的新课程。我的实现看起来像这样:

ArrayList<SpinnerItem> credValues = new ArrayList<SpinnerItem>();
         credValues.add(new SpinnerItem("3.0",false));
         credValues.add(new SpinnerItem("Credit", true));

         MySpinnerAdapter adapter_cred = new MySpinnerAdapter(this.getActivity(),
                 android.R.layout.simple_spinner_item, credValues);
         adapter_cred.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

         Spinner spinCred = (Spinner)rootView.findViewById(R.id.cred_spinner);
         spinCred.setAdapter(adapter_cred);
         spinCred.setSelection(credValues.size() - 1);

他看起来像这样:

ArrayList<SpinnerItem> items = new ArrayList<SpinnerItem>();
    items.add(new SpinnerItem("Item 1", false));
    items.add(new SpinnerItem("Item 2", false));
    items.add(new SpinnerItem("HINT", true)); // Last item 

    MySpinnerAdapter adapter = new MySpinnerAdapter(this, android.R.layout.simple_spinner_item, items);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);
    spinner.setSelection(items.size() - 1);

那为什么我的表演很怪异?我的代码的上下文是我的活动中的AddItemFragment的onCreateView。我引用的错误是什么?谢谢!


编辑:请求适配器类代码...

class SpinnerItem {
    private final String text;
    private final boolean isHint;

    public SpinnerItem(String strItem, boolean flag) {
        this.isHint = flag;
        this.text = strItem;
    }

    public String getItemString() {
        return text;
    }

    public boolean isHint() {
        return isHint;
    }
}

class MySpinnerAdapter extends ArrayAdapter<SpinnerItem> {
    public MySpinnerAdapter(Context context, int resource, List<SpinnerItem> objects) {
        super(context, resource, objects);
    }

    @Override
    public int getCount() {
        return super.getCount() - 1; // This makes the trick: do not show last item
    }

    @Override
    public SpinnerItem getItem(int position) {
        return super.getItem(position);
    }

    @Override
    public long getItemId(int position) {
        return super.getItemId(position);
    }
}
android spinner
3个回答
7
投票

原因是你没有覆盖适配器的getView()方法。因此,它使用默认实现,如下所示:

T item = getItem(position);

if (item instanceof CharSequence) {
    text.setText((CharSequence)item);
} 
else {
    text.setText(item.toString());
}

在你的SpinnerItem中你没有toString()方法,所以它使用默认值(你看到的是包名)

解决这个问题的一种方法是在你的toString()上添加一个SpinnerItem方法:

class SpinnerItem {
    private final String text;
    private final boolean isHint;

    public SpinnerItem(String strItem, boolean flag) {
        this.isHint = flag;
        this.text = strItem;
    }

    public String getItemString() {
        return text;
    }

    public boolean isHint() {
        return isHint;
    }

    @Override
    public String toString() {
        return text;
    }
}

如果你想要更多的控制,比如提示文本等的不同颜色,我建议你自己实现getView()方法。


4
投票

可能你的适配器扩展了android.widget.ArrayAdapter。默认情况下在ArrayAdapter的实现中 - 在android源代码中 - 正如Amulya Khare所说,getView方法通过以下方式获取文本视图的值

T item = getItem(position);
if (item instanceof CharSequence) {
   text.setText((CharSequence)item);
} 
else {
   text.setText(item.toString());
}

默认情况下,每个继承自Object类的类(如SpinneItem类)都会通过toString方法返回包名。所以你可以覆盖SpinnerItem的toString或覆盖MySpinnerAdapter的getView。


4
投票

在您的适配器中添加这些在构造函数中

private Context mContext;
private int layoutId;
private List<SpinnerItem> dataList;
public MySpinnerAdapter(Context context, int resource, List<SpinnerItem> objects) {
        super(context, resource, objects);
        this.mContext = context;
        this.layoutId = resource;
        this.dataList = objects;
    }

你需要使用SpinnergetDropDownView()getView()中设置数据,不需要实现getCount()getItem()getItemId(),因为在ArrayAdapter行是由super调用constructor创建的。

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder viewHolder;
        if(convertView == null) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(layoutId, null);
            viewHolder = new ViewHolder();
            viewHolder.itemNameTxtView = (TextView) convertView.findViewById(R.id.ur_txtview_id);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        String itemName = "";
        SpinnerItem spinnerItem = (SpinnerItem) dataList.get(position);
            itemName = spinnerItem.getItemString();

        viewHolder.itemNameTxtView.setText(itemName);
        return convertView;
    }

@Override
public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder viewHolder;
        if(convertView == null) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(layoutId, null);
            viewHolder = new ViewHolder();
            viewHolder.itemNameTxtView = (TextView) convertView.findViewById(R.id.ur_txtview_id);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        String itemName = "";
        SpinnerItem spinnerItem = (SpinnerItem) dataList.get(position);
            itemName = spinnerItem.getItemString();

        viewHolder.itemNameTxtView.setText(itemName);
        return convertView;
    }


    private class ViewHolder {
        TextView itemNameTxtView;
    }
© www.soinside.com 2019 - 2024. All rights reserved.