如何在自定义适配器中使用 String[]?

Posted

技术标签:

【中文标题】如何在自定义适配器中使用 String[]?【英文标题】:How to use String[] in custom adapter? 【发布时间】:2021-05-29 02:44:44 【问题描述】:

我制作了一个自定义适配器,它应该调用自定义的arraylist java 类,这样它将显示 3 个单独的字符串数组。但是,如果我将 String[] 放在自定义 arraylist java 类中,它将无法与自定义适配器一起使用,因为 getitem(position) 将需要 getArabic 的 int 类型。那我该怎么做呢?

这是我的自定义数组列表 java

public class Perrow 

    String[] Arabic;
    String[] transliteration;
    String[] translation;

    public Perrow(String[] arabic, String[] transliteration, String[] translation) 
        Arabic = arabic;
        this.transliteration = transliteration;
        this.translation = translation;
    

    public String[] getArabic() 
        return Arabic;
    

    public void setArabic(String[] arabic) 
        Arabic = arabic;
    

    public String[] getTransliteration() 
        return transliteration;
    

    public void setTransliteration(String[] transliteration) 
        this.transliteration = transliteration;
    

    public String[] getTranslation() 
        return translation;
    

    public void setTranslation(String[] translation) 
        this.translation = translation;
    


还有我的自定义适配器


public class PerrowAdapter extends ArrayAdapter<Perrow> 

    private Context mContext;
    private int mResource;



    public PerrowAdapter(@NonNull Context context, int resource, @NonNull ArrayList<Perrow> objects) 
        super(context, resource, objects);
        this.mContext = context;
        this.mResource = resource;

    

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) 
        LayoutInflater layoutInflater = LayoutInflater.from(mContext);
        convertView = layoutInflater.inflate(mResource, parent, false);

        TextView arabictext = convertView.findViewById(R.id.arabictext);
        TextView transliteration = convertView.findViewById(R.id.transliteration);
        TextView translation = convertView.findViewById(R.id.translation);

        String[] arabica = getContext().getResources().getStringArray(R.array.fontsize);

        arabictext.setText(getItem(position).getArabic(arabica));
        transliteration.setText(getItem(position).getTransliteration());
        translation.setText(getItem(position).getTranslation());












        return convertView;
    


非常感谢大家的帮助,谢谢大家

【问题讨论】:

你为什么使用 String [] ,你已经在传递对象的 ArrayList 我已经在我的 Github 项目中解决了一个类似的问题。你可以考虑看看这里 - github.com/masudias/dynamic-recyclerview 这是一个试图解决类似问题的 SO 线程 - ***.com/questions/34569217/… 【参考方案1】:

我认为您的问题是尝试将 array 设置为 TextView 的文本,如下面的代码。

arabictext.setText(getItem(position).getArabic(arabica));
transliteration.setText(getItem(position).getTransliteration());
translation.setText(getItem(position).getTranslation());

如果您想获取特定索引的字符串,您可以使用它的索引。例如:

arabictext.setText(getItem(position).getArabic()[0]);
transliteration.setText(getItem(position).getTransliteration()[0]);
translation.setText(getItem(position).getTranslation()[0]);

或者,如果您想从String[] 获取所有值作为一个String 并将其设置为您的TextView,您可以创建一个获取String[] 并返回String 的方法。

private String getString(String[] array)
    String text = "";
    for (String s : array) 
        text += s + ", ";
    
    return text;

所以在你的适配器内部定义一个类似上面的方法,当你需要来自String[]String 时,使用该方法。

public class PerrowAdapter extends ArrayAdapter<Perrow> 

    private Context mContext;
    private int mResource;
    private ArrayList<Perrow> objects;

    public PerrowAdapter(@NonNull Context context, int resource, @NonNull ArrayList<Perrow> objects) 
        super(context, resource, objects);
        this.mContext = context;
        this.mResource = resource;
        this.objects = objects;
    

    private String getString(String[] array)
        String text = "";
        for (String s : array) 
            text += s + ", ";
        
        return text;
    

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) 
        LayoutInflater layoutInflater = LayoutInflater.from(mContext);
        convertView = layoutInflater.inflate(mResource, parent, false);

        TextView tvArabic = convertView.findViewById(R.id.arabictext);
        TextView tvTransliteration = convertView.findViewById(R.id.transliteration);
        TextView tvTranslation = convertView.findViewById(R.id.translation);

        Perrow perrow = objects.get(position);
        String[] arabica = perrow.getArabic();
        String[] transliteration = perrow.getTransliteration();
        String[] translation = perrow.getTranslation();

        tvArabic.setText(getString(arabica));
        tvTransliteration.setText(getString(transliteration));
        tvTranslation.setText(getString(translation));

        return convertView;
    

编辑

我希望根据列表视图的每一行,显示字符串数组中的每个项目,> 相应地。如何实现?

您应该更改您的 Perrow 类,而不是 String[] 使用 String 并使用 String[] 的每个元素填充您的 ArrayList

Perrow.java(使用String 而不是String[]

public class Perrow 
    String Arabic;
    String transliteration;
    String translation;

    public Perrow(String arabic, String transliteration, String translation) 
        Arabic = arabic;
        this.transliteration = transliteration;
        this.translation = translation;
    

    public String getArabic() 
        return Arabic;
    

    public void setArabic(String arabic) 
        Arabic = arabic;
    

    public String getTransliteration() 
        return transliteration;
    

    public void setTransliteration(String transliteration) 
        this.transliteration = transliteration;
    

    public String getTranslation() 
        return translation;
    

    public void setTranslation(String translation) 
        this.translation = translation;
    

PerrowAdapter.java(Perrow 类中的get() 方法现在返回String,因此您可以直接将它们用于TextViews)

public class PerrowAdapter extends ArrayAdapter<Perrow> 

    private Context mContext;
    private int mResource;
    private ArrayList<Perrow> objects

    public PerrowAdapter(@NonNull Context context, int resource, @NonNull ArrayList<Perrow> objects) 
        super(context, resource, objects);
        this.mContext = context;
        this.mResource = resource;
        this.objects = objects;
    

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) 
        LayoutInflater layoutInflater = LayoutInflater.from(mContext);
        convertView = layoutInflater.inflate(mResource, parent, false);

        TextView tvArabic = convertView.findViewById(R.id.arabictext);
        TextView tvTransliteration = convertView.findViewById(R.id.transliteration);
        TextView tvTranslation = convertView.findViewById(R.id.translation);

        Perrow perrow = objects.get(position);

        tvArabic.setText(perrow.getArabic());
        tvTransliteration.setText(perrow.getTransliteration());
        tvTranslation.setText(perrow.getTranslation());

        return convertView;
    

我不知道您如何填写您的String[],但我假设所有三个String[] 具有相同的长度(数组包含相同的数字Strings),因此您可以将所有Strings 添加到ArrayList使用for 循环并将ArrayList 用于您的适配器。

你的活动(你在哪里打电话PerrowAdapter

String[] arabica = getContext().getResources().getStringArray(R.array.fontsize);
String[] trasliteration = ... //Get your trasliteration array
String[] translation = ... //Get your translation array

ArrayList<Perrow> list = new ArrayList<>();
for(int i = 0; i < arabica.length; i++)
    list.add(new Perrow(arabica[i], transliteration[i], translation[i]));


PerrowAdapter adapter = new PerrowAdapter(context, resource, list);

【讨论】:

谢谢,如果我想要一个特定的字符串索引,或者将整个字符串数组放在文本视图中,它确实有效。但是,我希望根据列表视图的每一行,相应地显示字符串数组中的每个项目。如何做到这一点? 非常感谢我被这个问题困扰了一周 :) 真的很感激

以上是关于如何在自定义适配器中使用 String[]?的主要内容,如果未能解决你的问题,请参考以下文章

在自定义适配器类中发送服务器请求后,如何更改 Listview 按钮名称?

如何在自定义 ListView 适配器中处理 RadioGroup 的 onCheckedChangeListener

如何在自定义适配器上实现 onClickListener?

在自定义适配器中隐藏软键盘

在自定义 Listview 适配器中使用多个视图

listview 项目未在自定义适配器的 getview 方法中显示分配的值