代码之家  ›  专栏  ›  技术社区  ›  portfoliobuilder

滚动将导致listView、RecyclerView中折叠的项目取消折叠。适配器设置问题

  •  -1
  • portfoliobuilder  · 技术社区  · 10 年前

    我有一个扩展RecycleView的适配器。Adapter和我遇到了一个问题,滚动将导致视图更改其可见性。我使用视图的可见性来模拟折叠或取消折叠状态,而滚动以某种方式仅从15个项目的列表中重置最后和第一个项目的可见性。

    项目以文本视图显示的标题开头。单击该项将取消折叠该项,以显示也使用TextView显示的描述文本(我只是将具有描述文本的视图的可见性设置为VISIBLE)。单击描述文本将折叠该项(可见性设置为GONE),以仅显示初始标题文本。

    为什么当我滚动到最后一个项目时,即使没有按下,它也会崩溃。此外,如果我将第一个项目取消折叠,滚动到底部将折叠第一个项目。这是我的设置。

    public class TextAdapter extends RecyclerView.Adapter<TextAdapter.ViewHolder> {
        private static final String TAG = TextAdapter.class.getSimpleName();
         private Context mContext;
        private ArrayList<TextDescription> alTextDesc;
    
        public TextAdapter(Context context, ArrayList<TextDescription> textDesc) {
            mContext = context;
            alTextDesc = textDesc;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(mContext).inflate(R.layout.ui_item_text_desc, parent, false);
            return new ViewHolder(v);
        }
    
        @Override
        public void onBindViewHolder(final ViewHolder holder, final int position) {
            final TextDescription textDesc = alTextDesc.get(position);
    
            holder.llParent.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View view) {
                    textDesc.isExpanded = !textDesc.isExpanded;
                    setExpanded(holder, textDesc);
                }
            });
            setExpanded(holder, textDesc);
    
        }
    
        @Override
        public int getItemCount() {
            return alTextDesc.size();
        }
    
        @Override
        public void onAttachedToRecyclerView(RecyclerView recyclerView) {
            super.onAttachedToRecyclerView(recyclerView);
        }
    
        private static void setExpanded(ViewHolder holder, TextDescription textDesc) {
            if (textDesc != null) {
                if (textDesc.isExpanded) {
                    // display full description
                    llContent.setVisibility(View.VISIBLE);
                } else {
                    // display title
                    llContent.setVisibility(View.GONE);
                }
            }
        }
    
        public static class ViewHolder extends RecyclerView.ViewHolder {
            LinearLayout llParent;
            LinearLayout llContent;
    
            public ViewHolder(View v) {
                super(v);
    
                llParent = (LinearLayout) v.findViewById(R.id.ll_parent);
                llContent = (LinearLayout) v.findViewById(R.id.ll_content);
            }
    }
    

    My TextDescription模型类只不过是一个布尔值

    public boolean isExpanded;
    

    对我做得不正确的地方有什么建议吗?提前谢谢你!

    编辑 我还尝试在更改属性扩展值后更新ArrayList,结果仍然相同

           holder.llParent.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View view) {
                    textDesc.isExpanded = !textDesc.isExpanded;
                    alTextDesc.set(position, textDesc); //tried to update the list with updated value
                    setExpanded(holder, textDesc);
                }
            });
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   Shadab Ansari    10 年前

    这个问题是由于循环使用视图造成的。 你需要更新你的列表 alTextDesc 更改展开标志后,当视图被回收时,您的标志状态将保存在列表中 所有文本描述 它将根据保存的标志状态再次折叠/展开。

        holder.llParent.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View view) {
                textDesc.isExpanded = !textDesc.isExpanded;//Update the list with the updated object now 
                setExpanded(holder, textDesc);
            }
        });