RecyclerView Viewholder重用 [英] RecyclerView Viewholder reusing

查看:188
本文介绍了RecyclerView Viewholder重用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建一个recyclerview当用户触摸它,当用户再次接触它会自行关闭,这将扩大本身。下面是我的codeS:

I am creating a recyclerview which will expand itself when the user touches it and closes itself when the user touches it again. Below are my codes:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecViewHolder> {
    ArrayList<String> values;
    ArrayList<Integer> expandedPosition;
    public static class RecViewHolder extends RecyclerView.ViewHolder {
        ...
        private boolean resultsOpened = false;
        ...
        RelativeLayout favHeaderLayout;
        RelativeLayout favResultsLayout;

        public RecViewHolder (View itemView) {
            super(itemView);
            favHeaderLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (!resultsOpened) {
                        expandLayout();
                    } else {
                        favResultsLayout.setVisibility(View.GONE);
                        resultsOpened = false;
                    }
                }
            });

        }

        public void expandLayout() {
            favResultsLayout.setVisibility(View.VISIBLE);
            resultsOpened = true;
            //I populate my expanded layout here
        }
    }

    public RecyclerViewAdapter (Context context, ArrayList<String> values) {
        this.context = context;
        this.values= values;
    }

    @Override
    public RecViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_file, parent, false);
        RecViewHolder recViewHolder= new RecViewHolder(v);
        return recViewHolder;
    }

    @Override
    public void onBindViewHolder(RecViewHolder recViewHolder , int position) {
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    @Override
    public int getItemCount() {
        return values.size();
    }

}

在我接触的第一个观点,就应该扩大本身。然而,当适配器有更多的数据和我接触的第一个视图,该视图扩展,并在recyclerview(例如第8视图)的底部,另一种观点过于膨胀。我如何确保只有已触及视图中展开其他住宿关闭?

When I touch the first view, it should expand itself. However, when the adapter has more data and I touch the first view, the view expands and another view at the bottom of the recyclerview (E.g. the 8th view) expands too. How do I ensure that only the view that have been touched expand the the other stays close?

修改

我试过存储一个ArrayList和onBindViewHolder扩展视图位置,检查哪些意见被扩展和扩大这些只

I've tried storing the expanded Views position in an arraylist and in onBindViewHolder, check which views are expanded and expand them only

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecViewHolder> {
    ArrayList<String> values;
    ArrayList<Integer> expandedPosition;
    public static class RecViewHolder extends RecyclerView.ViewHolder {
        ...
        private boolean resultsOpened = false;
        ...
        RelativeLayout favHeaderLayout;
        RelativeLayout favResultsLayout;

        public RecViewHolder (View itemView) {
            super(itemView);


        }

    }

    public RecyclerViewAdapter (Context context, ArrayList<String> values) {
        this.context = context;
        this.values= values;
    }

    @Override
    public RecViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_file, parent, false);
        RecViewHolder recViewHolder= new RecViewHolder(v);
        return recViewHolder;
    }

    @Override
    public void onBindViewHolder(RecViewHolder recViewHolder , int position) {
        recViewHolder.favResultsLayout.setVisibility(View.GONE);
        for(int i= 0; i < expandedPosition.size(); i ++){
            recViewHolder.favResultsLayout.setVisibility(View.VISIBLE);
        }
        recViewHolder.favHeaderLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                     if (!expandedPosition.contains(position)) {
                        expandLayout(recViewHolder);
                        expandedPosition.add(position);
                    } else {
                        recViewHolder.favResultsLayout.setVisibility(View.GONE);
                        for(int i = 0; i < expandedPosition.size(); i ++){
                            if (expandedPosition.get(i) == position){
                                    expandedPosition.remove(i);
                            }
                        }
                    }
                }
            });
    }
    public void expandLayout() {
            favResultsLayout.setVisibility(View.VISIBLE);
            //I populate my expanded layout here
        }
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    @Override
    public int getItemCount() {
        return values.size();
    }

}

仍然没有运气:(

Still no luck :(

推荐答案

作为类名说,这是所有关于回收...

As the class name says it is all about recycling ...

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecViewHolder> {
    ArrayList<String> values;
    SparseBooleanArray expanded = new SparseBooleanArray();
    public static class RecViewHolder extends RecyclerView.ViewHolder {
        //EDIT!!!!!
        public RecViewHolder (View itemView, final RecyclerViewAdapter adapter) {
        //rest of the code ...
        favHeaderLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) { 
                final int currentPosition = getAdapterPosition();
                //is a view at current position expanded?
                if(adapter.expanded.get(currentPosition ))
                    //if so it shouldn't be
                    adapter.expanded.delete(getAdapterPosition(currentPosition));
                else
                    //if not, expand
                    adapter.expanded.put(currentPosition, true);
                //wheeee inform the adapter to rebind
                adapter.notifyItemChanged(currentPosition);
                //setupExpanded(expanded.get(currentPosition)); 
            }
        });
        }
        protected void setupExpanded(boolean state) {
        //ONLY hide show layouts based on state
        }
    }
    @Override
    public RecViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_file, parent, false);
        RecViewHolder recViewHolder= new RecViewHolder(v, this);
        return recViewHolder;
    }

    @Override
    public void onBindViewHolder(RecViewHolder recViewHolder , int position)    {
        //this line should be self explanatory
        recViewHolder.setupExpanded(expanded.get(position));
    }

    //rest of the code
}

这篇关于RecyclerView Viewholder重用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆