带有自定义适配器的Android ListView存在视觉故障

带有自定义适配器的Android ListView存在视觉故障,android,listview,optimization,android-listview,android-cardview,Android,Listview,Optimization,Android Listview,Android Cardview,我是Android编程新手,正在尝试找出如何优化我的ListView适配器。我编写了一个自定义适配器,将CardView添加到我的ListView: public class CardAdapter extends BaseAdapter { private final ArrayList<CardView> cards = new ArrayList<CardView>(); private Context context; public C

我是Android编程新手,正在尝试找出如何优化我的ListView适配器。我编写了一个自定义适配器,将CardView添加到我的ListView:

public class CardAdapter extends BaseAdapter {

    private final ArrayList<CardView> cards = new ArrayList<CardView>();
    private Context context;

    public CardAdapter( Context context ) {
        this.context = context;
    }

    public void add( CardView view ) {
        cards.add( view );
    }

    @Override
    public int getCount() {
        return cards.size();
    }

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

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public Object getItem(int i) {
        if( i >= cards.size() || i < 0 )
            return null;
        return cards.get( i );
    }

    @Override
    public long getItemId(int i) {
        return cards.get(i).getId();
    }

    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
        if( view == null ) {
            view = (CardView) getItem( position );
        }

        return view;
    }
}
现在,Android似乎正在尝试回收视图,但做得很糟糕。起初页面看起来很好,但当我开始滚动时,卡片开始在屏幕上移动,间距改变,卡片开始重叠,等等

注意,我只滚动了几秒钟,这不是一个渐进的变化,卡片在屏幕上“跳跃”。到目前为止,我提出的唯一解决方案是将我的
getView
更改为:

    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
        return (CardView) getItem(position);
    }
这是可行的,但即使加载10个项目也非常慢,滚动也会滞后。

好的,这太简单了

首先请记住,您必须在适配器中传递您想要使用的内容,但现在您只需向该适配器传递一个(this)。 为您的构造函数使用下面的代码

有良好的编码能力

private final ArrayList<CardView> cards = new ArrayList<CardView>();
private Context context;

public CardAdapter( Context context , ArrayList<CardView> cards) {
    this.context = context;
    this.cards =cards
}
private final ArrayList cards=new ArrayList();
私人语境;
公共卡适配器(上下文、ArrayList卡){
this.context=上下文;
这张牌
}
好吧,太简单了

首先请记住,您必须在适配器中传递您想要使用的内容,但现在您只需向该适配器传递一个(this)。 为您的构造函数使用下面的代码

有良好的编码能力

private final ArrayList<CardView> cards = new ArrayList<CardView>();
private Context context;

public CardAdapter( Context context , ArrayList<CardView> cards) {
    this.context = context;
    this.cards =cards
}
private final ArrayList cards=new ArrayList();
私人语境;
公共卡适配器(上下文、ArrayList卡){
this.context=上下文;
这张牌
}

请使用RecyclerView它使用视图持有者模式解决所有这些滞后问题

请使用RecyclerView它使用视图持有者模式解决所有这些滞后问题

将您的实现从ListView更改为RecyclerView。

RecyclerView是作为继承者添加到android studio的视图组 GridView和ListView的。这对他们两个都是一个进步,对他们来说也是一个进步 可以在最新的v-7支持包中找到。它已经被创建了 将XML布局作为一项来构建任何列表 可以进行大量定制,同时提高 ListView和GridView。这一改进是通过回收废物实现的 用户看不见的视图。例如,如果 用户向下滚动到项目4和5可见的位置; 项目1、2和3将从内存中清除,以减少内存 消费

从。 Ps:该链接有很多解释、教程和代码


RecyclerView是专门为解决您遇到的问题而创建的。与ListView相比,它有很多改进,比如更少的内存消耗、更少的滞后、更好的搜索……

将您的实现从ListView更改为RecyclerView。

RecyclerView是作为继承者添加到android studio的视图组 GridView和ListView的。这对他们两个都是一个进步,对他们来说也是一个进步 可以在最新的v-7支持包中找到。它已经被创建了 将XML布局作为一项来构建任何列表 可以进行大量定制,同时提高 ListView和GridView。这一改进是通过回收废物实现的 用户看不见的视图。例如,如果 用户向下滚动到项目4和5可见的位置; 项目1、2和3将从内存中清除,以减少内存 消费

从。 Ps:该链接有很多解释、教程和代码


RecyclerView是专门为解决您遇到的问题而创建的。它比ListView有很多改进,比如更少的内存消耗,更少的滞后,更好的搜索…

请发布适配器xml文件。@Chintan我不知道你在问什么,你是说activity_main.xml吗?你的activity_main.xml和卡xml可能有助于发现问题,但我会先尝试一下RecyclerView。@RicardoA。是的,我稍后会去看看回收站。卡片是通过代码创建的,没有相应的XML,这会导致任何问题吗?Activity_main只是一个包含listview的线性布局。不,这些代码可能没问题,问题应该是适配器或listview本身的实现。正如ghazanfar ali试图解释的那样,RecyclerView是专门为解决这种情况而创建的。而且ListView已经过时,所以您应该真正改为RecylerView,即使它不能解决问题,但在使用最新技术时更容易找到帮助,因为大多数人都在使用它。请发布适配器xml文件。@Chintan我不确定您在问什么,你是说activity_main.xml吗?你的activity_main.xml和你的卡片xml可能有助于发现问题,但我会先尝试一下回收视图。@RicardoA。是的,我稍后会去看看回收站。卡片是通过代码创建的,没有相应的XML,这会导致任何问题吗?Activity_main只是一个包含listview的线性布局。不,这些代码可能没问题,问题应该是适配器或listview本身的实现。正如ghazanfar ali试图解释的那样,RecyclerView是专门为解决这种情况而创建的。ListView已经过时了,所以你应该改用RecylerView,即使它不能解决问题,但在使用最新技术时更容易找到帮助,因为大多数人都在使用它。他稍后添加卡,用空列表启动适配器绝对没有问题。他稍后添加卡,使用空列表启动适配器绝对没有问题。