使用 3rd 方 API 将适配器设置为微调器

Posted

技术标签:

【中文标题】使用 3rd 方 API 将适配器设置为微调器【英文标题】:Set the adapter to spinner using 3rd party API 【发布时间】:2018-04-21 16:15:34 【问题描述】:

我正在使用this 3rd 方库来搜索微调器。每件事都很好,但问题是当我将适配器设置为微调器时,所以在下拉列表中我得到的是对象引用而不是字符串。 Web 服务使用改造库填充的数组列表。

以下是我的活动:

countriesCustomAdapterInr = new CountriesCustomAdapterInr(getActivity(), R.layout.custom_spinner_items, arrayList,res);
spinner.setAdapter(countriesCustomAdapterInr); 

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
                            @Override
                            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) 
                                Toast.makeText(getActivity(), ""+arrayList.get(i).getFull_name()+i, Toast.LENGTH_LONG).show();
                            

                            @Override
                            public void onNothingSelected(AdapterView<?> adapterView) 

                            
                        );  

这是我的模型类:

public class CurrencyConverter 

    @SerializedName("short_name")
    private String short_name;

    @SerializedName("full_name")
    private String full_name;

    @SerializedName("flag")
    private String flag;

    public CurrencyConverter(String short_name, String full_name, String flag) 
        this.short_name = short_name;
        this.full_name = full_name;
        this.flag = flag;
    

    public CurrencyConverter() 

    public String getShort_name() 
        return short_name;
    

    public void setShort_name(String short_name) 
        this.short_name = short_name;
    

    public String getFull_name() 
        return full_name;
    

    public void setFull_name(String full_name) 
        this.full_name = full_name;
    

    public String getFlag() 
        return flag;
    

    public void setFlag(String flag) 
        this.flag = flag;
    


我的适配器:

public class CountriesCustomAdapterInr extends ArrayAdapter<String> 

    private ArrayList data;
    public Resources res;
    private LayoutInflater inflater;

    public CountriesCustomAdapterInr(
            FragmentActivity activitySpinner,
            int textViewResourceId,
            ArrayList objects,
            Resources resLocal)
    
        super(activitySpinner, textViewResourceId, objects);

        data     = objects;
        res      = resLocal;
        inflater = (LayoutInflater) activitySpinner.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    

    @Override
    public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) 
        return getCustomView(position, convertView, parent);
    

    @NonNull
    @Override
    public View getView(int position, View convertView, @NonNull ViewGroup parent) 
        return getCustomView(position, convertView, parent);
    

    private View getCustomView(int position, View convertView, ViewGroup parent) 

        View row = inflater.inflate(R.layout.custom_spinner_items, parent, false);

        CurrencyConverter tempValues = null;
        tempValues = (CurrencyConverter) data.get(position);

        TextView label        = (TextView)row.findViewById(R.id.textView_short_name);
        TextView sub          = (TextView)row.findViewById(R.id.textView_full_name);
        ImageView flag = (ImageView)row.findViewById(R.id.imageView_flag);
        TextView line = (TextView)row.findViewById(R.id.row);
        if(position==0)
            label.setText("INR");
            sub.setText("India");
            flag.setImageResource(R.drawable.ind);
            line.setVisibility(View.GONE);
        
        else
        
            // Set values for spinner each row
            label.setText(tempValues.getShort_name());
            sub.setText(tempValues.getFull_name());
            Picasso.with(getContext()).load("http://currencyconvertor.ccube9projects.com/uploads/country_flag/"+ tempValues.getFlag()).into(flag);
        


        return row;
    

我还附上了图片以进行更多说明。请问有人可以帮忙吗?我浪费了我的 2 天,但我没有得到任何答案。请帮忙。

【问题讨论】:

【参考方案1】:

简单的答案是您无法使用此库设置自己的自定义适配器。如果您查看他的 SearchableListDialog (https://github.com/miteshpithadiya/SearchableSpinner/blob/master/searchablespinnerlibrary/src/main/java/com/toptoche/searchablespinnerlibrary/SearchableListDialog.java#L160) 的第 160 行,它总是将适配器设置为仅用于字符串的简单数组适配器。

如果您想要一种方法来实际实现您想要的,您可以将他的库复制到您的代码中并修改您需要的内容。例如,将 SearchableListDialog 中的第 160 行更改为:

listAdapter = new CountriesCustomAdapterInr(getContext(), R.layout.custom_spinner_items, items, getResources());

您还需要将适配器的构造函数更改为:

public CountriesCustomAdapterInr(
    Context context,
    int textViewResourceId,
    List<CurrencyConverter> objects,
    Resources resLocal) 
    super(context, textViewResourceId, objects);

    data = objects;
    res = resLocal;
    inflater = (LayoutInflater) context.getSystemService(Context
        .LAYOUT_INFLATER_SERVICE);

最后,您需要在 CurrencyConverter 中覆盖 toString 才能使搜索正常工作:

@Override
public String toString()

    return short_name;

【讨论】:

实际上我在自定义项目列表中有 2 个文本和 1 个图像,所以我不能使用 toString()。如果我只有一个文本,那么我可以使用 toString() 但自定义设计我不能使用。还有其他解决方案吗? toString() 只是为了让搜索过滤器工作。更改库的 SearchableListDialog 将为您提供所需的自定义适配器。 我不知道你在问什么。上面的代码工作并生成你想要的。 你好@tim.paetz 我明白你的意思。我得到了我想要的结果,但仍然有一个问题,例如在搜索视图小部件中我搜索伦敦,我没有得到过滤为伦敦的结果,但是当单击列表视图时,结果显示项目为 London.It就像项目的位置发生了变化,但列表没有显示可搜索的结果。你能建议我有什么问题吗?请帮帮我。 您应该用您的代码发布另一个问题以及问题所在。

以上是关于使用 3rd 方 API 将适配器设置为微调器的主要内容,如果未能解决你的问题,请参考以下文章

你如何设置微调器文本颜色?

在项目选择的侦听器上初始化(自定义微调器适配器)

将微调器添加到 ActionBar(不是导航

如何为随机自定义 ListView 适配器设置按钮单击事件?

spinner android kotlin 的自定义适配器不可见,但在单击下拉值时可见

在 Android 中为 Spinner 的数组适配器添加枚举