ListView 的自定义适配器忽略设置值

Posted

技术标签:

【中文标题】ListView 的自定义适配器忽略设置值【英文标题】:Custom adapter for ListView ignores set values 【发布时间】:2020-04-24 00:27:56 【问题描述】:

我要创建一个ListView 标签和图标。

这是我所做的: 我创建了一个名为 cardList 的空白 ListView。 我创建了一个扩展 ArrayAdapter<String> 的自定义视图 我已将 cardList 设置为该自定义视图:

cardList = findViewById(R.id.cards_list);
CustomView customView = new CustomView(this, names, images);
cardList.setAdapter(customView);

在哪里

ListView cardList;
String[] names = "Name1", "Name2", "Name3";
Integer[] images = R.drawable.image1, R.drawable.image2, R.drawable.image3;

CustomView 类:

package ...

import ...

public class CustomView extends ArrayAdapter<String> 

    private String[] names;
    private Integer[] images;
    private Activity context;

    CustomView(Activity context, String[] names, Integer[] images) 
        super(context, R.layout.card_row, R.id.cardName, names);
        this.context = context;
        this.names = names;
        this.images = images;
    

    @SuppressLint("InflateParams")
    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) 
        View r = convertView;
        ViewHolder viewHolder;
        if (r == null) 
            LayoutInflater layoutInflater = context.getLayoutInflater();
            r = layoutInflater.inflate(R.layout.card_row, null, true);
            viewHolder = new ViewHolder(r);
            r.setTag(viewHolder);
         else 
            viewHolder = (ViewHolder) r.getTag();
        
        viewHolder.name.setText(/*skipping: names[position]*/"Some text");
        viewHolder.name.setTypeface(Typeface.createFromAsset(AppName.assetManager, "fonts/prototype.ttf"));
        viewHolder.image.setImageResource(images[position]);
        return super.getView(position, convertView, parent);
    

    class ViewHolder 
        TextView name;
        ImageView image;
        ViewHolder(View v) 
            name = v.findViewById(R.id.cardName);
            image = v.findViewById(R.id.symbolImg);
        
    

现在,我故意这样写viewHolder.name.setText(/*skipping: names[position]*/"Some text");。结果是我的ListView 显示了数组中的名称,尽管setText("Some text") 方法应该改变它,并且没有图标和自定义字体。所以,这个部分的问题是:

viewHolder.name.setText(/*skipping: names[position]*/"Some text");
viewHolder.name.setTypeface(Typeface.createFromAsset(AppName.assetManager, "fonts/prototype.ttf"));
viewHolder.image.setImageResource(images[position]);

调试表明应用程序通过了这一部分,但是所有应该在其中设置的东西都被忽略了。我错过了什么吗?

【问题讨论】:

使用 recyclerview 代替 listview。 【参考方案1】:

当您从 getView 返回父视图而不是您的视图时,您的自定义视图将被忽略

使用

return r;

代替

return super.getView(position, convertView, parent);

【讨论】:

我犯了多么愚蠢的错误……我太不专心了。无论如何,谢谢! @Xander402,欢迎你。

以上是关于ListView 的自定义适配器忽略设置值的主要内容,如果未能解决你的问题,请参考以下文章

片段中 ListView 的自定义适配器不起作用

Android ListView 和带有 ViewHolder 的自定义适配器

ArrayIndexOutOfBoundsException 与 ListView 中的多个视图的自定义 Android 适配器

带有过滤器 Android 的自定义 Listview 适配器

片段中的自定义列表适配器

在 ListView 的自定义适配器中从 URL 加载图像(Android Studio)