我如何选择convertview重用?

时间:2014-11-24 07:01:38

标签: android listview adapter android-adapter

上下文
我希望列表中有3个明显不同的列表项布局,因此我根据要显示的项目类型创建适配器以创建适当的视图。
例如我想列出一些图像,文字和数字,每个都有一些标题。 我知道在 public View getView(int position, View convertView, ViewGroup parent)
convertView代表重用不再可见的listItems视图。

问题
如何选择convertView或如何控制我在那里得到的东西?

问题来自不同的listItems视图,假设我的列表以图像listItem开头,然后出现了很多文本listItems和number listItems以及100个listItems后来出现第二个图像。 我假设在向下滚动列表时(在getView(...)调用中),非空的第一个convertView是带图像的那个,因为我需要一个视图来显示文本listItem或数字listItem我不能用它。然后我想在每次下一次getView(...)来电时,convertView都是与先前通话中相同的图片listItem,因为我之前没有使用它。

未使用的文本listItems和number listItems卡住了,滚动列表时我需要继续创建新视图,这是我想要阻止的。

2 个答案:

答案 0 :(得分:5)

试试这个,

@Override
public View getView(final int position, View convertview, ViewGroup parent) {
    // TODO Auto-generated method stub
    final ViewHolder mHolder;
    if (convertview == null) {
        convertview = mInflater.inflate(R.layout.list_item, null);
        mHolder = new ViewHolder();
        mHolder.username_Txt = (TextView) convertview
                .findViewById(R.id.username_Txt);

        convertview.setTag(mHolder);
    } else {
        mHolder = (ViewHolder) convertview.getTag();
    }

    try {
        mHolder.username_Txt.setText("your value");


    } catch (Exception e) {
        // TODO: handle exception
    }

    return convertview;
}
private class ViewHolder {

    private TextView username_Txt;

}

答案 1 :(得分:3)

您需要让适配器的视图回收器知道有多个布局以及如何区分每行的两个布局。只需覆盖这些方法:

这里我说了两种不同的布局。如果你有更多使用枚举来区分它们。

@Override
public int getItemViewType(int position) {
    // Define a way to determine which layout to use, here it's just evens and odds.
    return position % 2;
}

@Override
public int getViewTypeCount() {
    return 2; // Count of different layouts (Change according to your requirment)
}

将getItemViewType()合并到getView()中,如下所示:

if (convertView == null) {
    // You can move this line into your constructor, the inflater service won't change.
    mInflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
    if(getItemViewType(position) == 0)
        convertView = mInflater.inflate(R.layout.listview_item_product_1, parent,false);
    else
        convertView = mInflater.inflate(R.layout.listview_item_product_2,parent,false);
    // etc, etc...

观看Android的Romain Guy在Google会谈中讨论view recycler