如何将视图添加到ListView?

时间:2015-02-02 14:05:41

标签: android listview android-listview

我遇到的每个示例/教程只是将字符串添加到ListViews,但我想添加膨胀的视图。我已经测试了膨胀的视图,如果我使用addView()将它添加到某个ViewGroup(如RelativeLayout),它看起来很好。但是将膨胀的视图添加到ListView只是以文本形式显示它:

enter image description here

ArrayList<View> friend_request_items = new ArrayList<View>();  //a list containing the items we want to add 

ListView friend_request_list = (ListView) findViewById( R.id.friend_request_list );

ArrayAdapter<View> friend_request_adapter = new ArrayAdapter<View>( this, android.R.layout.simple_list_item_1, friend_request_items);

friend_request_list.setAdapter( friend_request_adapter );

//friend_template is just my own xml file containing the view I'm inflating
View friend_request_item = LayoutInflater.from(this).inflate(R.layout.friend_template, null);

friend_request_items.add( friend_request_item ); 
friend_request_adapter.notifyDataSetChanged();

我认为问题在于我已经进入适配器的布局,但我不知道要将其更改为什么(或者如果这甚至是解决方案)。

2 个答案:

答案 0 :(得分:2)

这是一个使用自定义ArrayAdapter和自定义xml布局Using lists in Android的精彩教程。 你应该继承ArrayAdapter并在getView方法中扩展一行,这是一种常见而有效的解决方案,而不是将视图作为列表的泛型参数传递,你应该传递一个数据类,例如ArrayAdapter<FriendRequest>或类似的东西

public class FriendRequestsAdapter extends ArrayAdapter<FriendRequest> {
private LayoutInflater inflater;

public FriendRequestsAdapter(Context context, List<FriendRequest> requests) {
    super(context, R.layout.friend_request_row, requests);
    this.inflater = ((Activity)context).getLayoutInflater();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null) {
        convertView = inflater.inflate(R.layout.friend_request_row, parent, false);
    }

    FriendRequest item = getItem(position);
    TextView textView = (TextView) convertView.findViewById(R.id.textView);

    return convertView;
}

}

答案 1 :(得分:1)

  

我遇到的每个示例/教程都只是将字符串添加到ListViews

还有其他一些例子,但你不太可能找到你提议的例子。

  

我想添加膨胀的观点

ListAdaptergetView()方法返回“膨胀的视图”。您可以自行确定它是如何做到的。

此外,ListView背后的要点是能够回收列表行Views,因为列表可能很大,而且堆空间方面的行也很昂贵。您的代码似乎预先创建了所有行视图,这仅适用于小型数据集。

  

但是将膨胀的视图添加到ListView只是以文本的形式显示它

ListViewgetView()上调用ArrayAdapter时,ArrayAdapter获取所需行的模型,在其上调用toString(),然后将其注入{ {1}}由您的其他构造函数参数标识(在这种情况下,TextView格式为TextView中定义的格式。)

  

我认为问题是我正在传递给适配器的布局,但我不知道要将其更改为什么(或者如果这甚至是解决方案)。

首先,我强烈建议您重新考虑原始思维方式(“我想添加膨胀的观点”)。请记住,您必须处理配置更改(例如,屏幕旋转,区域设置更改)和进程终止,并且您的“膨胀视图”在任何一种情况下都会消失。 android.R.id.simple_list_item_1ListView旨在将模型数据转换为适当的可视化表示形式,并以符合内存的方式进行。

话虽如此,如果您完全相信整体方法,则需要创建自定义ListAdapterBaseAdapter子类,其中ArrayAdapter您返回所需的“膨胀”查看“给定getView()