带有自定义适配器的 ListView

Posted

技术标签:

【中文标题】带有自定义适配器的 ListView【英文标题】:ListView with custom adapter 【发布时间】:2013-05-21 05:49:52 【问题描述】:

我遵循了几个教程,但我仍然无法填充我的列表视图。 我做错了什么?

这是布局 spaced_list.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mList"
    android:layout_
    android:layout_ >

</ListView>

这是 spaced_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="horizontal"
    android:padding="10dp" 
    android:background="#efefef">

<TextView
    android:id="@+id/leftItem"
    android:layout_
    android:layout_
    android:layout_alignParentLeft="true"
    android:gravity="left"
    android:text="Left Text View" />

<TextView
    android:id="@+id/rightItem"
    android:layout_
    android:layout_
    android:layout_alignParentRight="true"
    android:gravity="right"
    android:text="Right Text View" />

</RelativeLayout>

这就是类

public class AllCategoriesActivity extends BaseActivity 
@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.spaced_list);


    ListView lv = (ListView) findViewById(R.id.mList);
    TextView abHeader = (TextView) findViewById(R.id.header);
    abHeader.setText("Categories");

    CategoryDataSource cDataSource = new CategoryDataSource(this);
    ArrayList<Category> allCategories = cDataSource.getAllCategories();
    CategoriesAdapter cAdapter = new CategoriesAdapter(this, allCategories);
    lv.setAdapter(cAdapter);



public class CategoriesAdapter extends ArrayAdapter<Category>
    private Context context;
    private ArrayList<Category> categories;

    public CategoriesAdapter(Context context, ArrayList<Category> categories)
        super(context, 0);
        this.context = context;
        this.categories = categories;
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
        if (convertView == null) 
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.spaced_list_item, parent, false);
        

        Category c = categories.get(position);  

        TextView tvLeft = (TextView) convertView.findViewById(R.id.leftItem);
        tvLeft.setText(c.getTitle());

        return convertView;
    


我确保我从 cDataSource.getAllCategories(); 获取值

【问题讨论】:

你得到什么错误? 您可以查看我在下面给出的答案。此外,您的 spaced_list_item.xml 中有一些不必要的属性,因为它是 RelativeLayout,您可以删除属性 android:orientationandroid:gravity 【参考方案1】:

改变这个:

  public CategoriesAdapter(Context context, ArrayList<Category> categories)
        super(context, 0); // <- Wrong constructor
        this.context = context;
        this.categories = categories;
    

到这里:

  public CategoriesAdapter(Context context, ArrayList<Category> categories)
        super(context, 0, categories);
        this.context = context;
        this.categories = categories;
    

你目前正在调用超类的this构造函数:

  public ArrayAdapter(Context context, int textViewResourceId) 
        init(context, textViewResourceId, 0, new ArrayList<T>());
    

这最终会创建一个新的ArrayList 并忽略你传入的数据。

【讨论】:

像魅力一样工作!谢谢。【参考方案2】:

问题出在适配器的构造函数中。当您致电super() 时,您需要提供您的ArrayList&lt;Category&gt;。代码如下:

public CategoriesAdapter(Context context, ArrayList<Category> categories)
    super(context, 0, categories); //Providing objects to represent in the ListView
    this.context = context;
    this.categories = categories;

这是此ArrayAdapter constructor 的参考文档。

【讨论】:

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

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

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

带有复选框和自定义适配器的 ListView,片段无法正常工作

使用自定义适配器实现 Expandable ListView

具有自定义适配器的 ListView 中的 SearchView

自定义 ListView 适配器。 TextChangedListener 调用错误的 EditText