导航抽屉中的动态布局会破坏视图

时间:2014-03-29 10:24:12

标签: android xml adapter navigation-drawer

我在使用导航抽屉适配器时遇到了一些麻烦。 它应该按以下方式显示项目:Favorito,Categorias和分类下的小子类别。

我将导航抽屉适配器编程为默认使用big_layout.xml文件,但如果其位置大于某个值,则它使用small_layout.xml文件。

它适用于前几个项目,但问题是当我向下滚动以查看其余项目时,它们使用big_layout.xml,然后当我向上滚动时,原始大项目会更改其视图并使用小布局!

下面是代码,这是错误结果的屏幕截图:http://i.stack.imgur.com/QWwts.jpg

    @Override
public View getView(int position, View view, ViewGroup parent) {
    if (view == null) {
        LayoutInflater laoutInflater = (LayoutInflater)
                context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (getItemId(position)>3)
            view = laoutInflater.inflate(R.layout.drawer_list_item_small, null);
        if (getItemId(position)<=3)
            view = laoutInflater.inflate(R.layout.drawer_list_item, null);
    }

    ImageView icon = (ImageView) view.findViewById(R.id.icon);
    icon.setImageResource(drawerItems.get(position).getIcon());        
    TextView title = (TextView) view.findViewById(R.id.title);
    title.setText(drawerItems.get(position).getTitle());
    return view;}

我做错了吗? ,是否有一些缺失可能导致视图稳定?

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您的问题在于回收利用。向下滚动并向后滚动时,不再需要使用小布局的视图,因此有资格进行回收 - 现在,视图不为空,因此布局不会根据其位置重新初始化,而只是更新为新内容。

您可以使用列表适配器类中的ViewTypes来修复此问题,从而覆盖以下方法。

@Override
public int getItemViewType(int position) {
    return (position > 3) ? 0 : 1;
}

@Override
public int getViewTypeCount() {
    return 2;
}

然后,在getView()中,如果视图类型错误,则不会给出视图(用于回收)。

@Override
public View getView(int position, View view, ViewGroup parent) {
    if (view == null) {
        int layout = getLayoutForViewType(position);
        view = LayoutInflater.from(parent.getContext()).inflate(layout, null);
    }
    ...
    return view;
}

private int getLayoutForViewType(int position) {
    if (getItemViewType(position) == 0) {
        return R.layout.blahblahblah;
    }
    return R.layout.bloobloobloo;
}