草庐IT

android - ExpandableRecyclerAdapter 如何在扩展项目时强制项目向上移动

coder 2023-12-05 原文

这是我的 ExpandableRecyclerAdapter 适配器

public class MyAdapter extends ExpandableRecyclerAdapter<MyAdapter.ProductParentViewHolder, MyAdapter.ProductChildViewHolder> {

    private LayoutInflater mInflater;
    private Context context;
    private List<? extends ParentListItem> mParentItemList;

    public MyAdapter(Context context, List<ParentListItem> itemList) {
        super(itemList);
        mInflater = LayoutInflater.from(context);
        this.context = context;
        this.mParentItemList = itemList;
    }

    @Override
    public ProductParentViewHolder onCreateParentViewHolder(ViewGroup viewGroup) {
        View view = mInflater.inflate(R.layout.list_item_crime_parent, viewGroup, false);
        return new ProductParentViewHolder(view);
    }

    @Override
    public ProductChildViewHolder onCreateChildViewHolder(ViewGroup viewGroup) {
        View view = mInflater.inflate(R.layout.list_item_crime_child, viewGroup, false);
        return new ProductChildViewHolder(view);
    }

    @Override
    public void onBindParentViewHolder(ProductParentViewHolder crimeParentViewHolder, int i, ParentListItem parentListItem) {
        Product product = (Product) parentListItem;
        crimeParentViewHolder.productName.setText(product.getBrandName() + " " + product.getProductName());
        Glide.with(context)
                .load(product.getProductImagePath())
                .placeholder(R.drawable.placeholder)
                .error(R.drawable.placeholder)
                .into(crimeParentViewHolder.thumbnail);
    }

    @Override
    public void onBindChildViewHolder(ProductChildViewHolder productChildViewHolder, int i, Object childListItem) {
        final ProductVariant productVariant = (ProductVariant) childListItem;
        productChildViewHolder.mCrimeDateText.setText(productVariant.getVariantName());

        productChildViewHolder.variantMrp.setText(context.getString(R.string.positive_amount, productVariant.getMRP()));
        productChildViewHolder.variantMrp.setPaintFlags(productChildViewHolder.variantMrp.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
        productChildViewHolder.variantSellPrice.setText(context.getString(R.string.positive_amount, productVariant.getSellPrice()));


        //productChildViewHolder.variantMrp.setText(productVariant.getMRP().toString());
        //productChildViewHolder.variantSellPrice.setText(productVariant.getSellPrice().toString());


        if (productVariant.getInCart() == 0) {
            productChildViewHolder.btnProductDetailAddToCart.setVisibility(View.VISIBLE);
            productChildViewHolder.btnProductDetailMinus.setVisibility(View.GONE);
            productChildViewHolder.btnProductDetailQty.setVisibility(View.GONE);
            productChildViewHolder.btnProductDetailPlus.setVisibility(View.GONE);

        } else {
            productChildViewHolder.btnProductDetailAddToCart.setVisibility(View.GONE);
            productChildViewHolder.btnProductDetailMinus.setVisibility(View.VISIBLE);
            productChildViewHolder.btnProductDetailQty.setVisibility(View.VISIBLE);
            productChildViewHolder.btnProductDetailPlus.setVisibility(View.VISIBLE);

        }
        int quantity = productVariant.getInCart();
        productChildViewHolder.btnProductDetailQty.setText(Integer.toString(quantity));

        productChildViewHolder.btnProductDetailAddToCart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                productVariant.setInCart(1);
                //Utility.loadShoppingCartItems();
                notifyDataSetChanged();
                invalidateOptionsMenu();
                //holder.db.addItem(new CartItem(1, productVariant.getProductID(), productVariant.getVariantID(), 1));

            }
        });

        productChildViewHolder.btnProductDetailPlus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                productVariant.setInCart(1 + productVariant.getInCart());
                notifyDataSetChanged();
                invalidateOptionsMenu();
                //if (productVariant.getInCart() > 0) {
                //int count = holder.db.updateSingleRow(productVariant.getProductID(), productVariant.getVariantID(), productVariant.getInCart());
                //}
            }
        });

        productChildViewHolder.btnProductDetailMinus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                productVariant.setInCart(productVariant.getInCart() - 1);
                notifyDataSetChanged();
                invalidateOptionsMenu();
                if (productVariant.getInCart() == 0) {
                    //int count = holder.db.deleteSingleRow(productVariant.getProductID(), productVariant.getVariantID());
                } else if (productVariant.getInCart() > 0) {
                    //int count = holder.db.updateSingleRow(productVariant.getProductID(), productVariant.getVariantID(), productVariant.getInCart());
                }
                //Utility.displayToast(holder.db.getItemsCount() + "");
            }

        });

        //crimeChildViewHolder.mCrimeSolvedCheckBox.setChecked(productVariant.isSolved());
    }

    public class ProductParentViewHolder extends ParentViewHolder {
        private static final float INITIAL_POSITION = 0.0f;
        private static final float ROTATED_POSITION = 180f;
        private final boolean HONEYCOMB_AND_ABOVE = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB;

        public TextView productName;
        public ImageView thumbnail;
        public ImageButton mParentDropDownArrow;

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

            productName = (TextView) itemView.findViewById(R.id.productName);
            thumbnail = (ImageView) itemView.findViewById(R.id.thumbnail);
            // mParentDropDownArrow = (ImageButton) itemView.findViewById(R.id.parent_list_item_expand_arrow);
        }

        @SuppressLint("NewApi")
        @Override
        public void setExpanded(boolean expanded) {
            super.setExpanded(expanded);
            if (!HONEYCOMB_AND_ABOVE) {
                return;
            }

            if (expanded) {
                // mParentDropDownArrow.setRotation(ROTATED_POSITION);
            } else {
                // mParentDropDownArrow.setRotation(INITIAL_POSITION);
            }
        }
    }

    public class ProductChildViewHolder extends ChildViewHolder {

        public TextView mCrimeDateText;
        public TextView variantMrp;
        public TextView variantSellPrice;
        public Button btnProductDetailAddToCart, btnProductDetailPlus, btnProductDetailMinus;
        public TextView btnProductDetailQty;


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

            mCrimeDateText = (TextView) itemView.findViewById(R.id.variantName);
            variantMrp = (TextView) itemView.findViewById(R.id.productVariantMrp);
            variantSellPrice = (TextView) itemView.findViewById(R.id.productVariantSellPrice);
            btnProductDetailAddToCart = (Button) itemView.findViewById(R.id.btnProductDetailAddToCart);
            btnProductDetailPlus = (Button) itemView.findViewById(R.id.btnProductDetailPlus);
            btnProductDetailMinus = (Button) itemView.findViewById(R.id.btnProductDetailMinus);
            btnProductDetailQty = (TextView) itemView.findViewById(R.id.btnProductDetailQty);

        }
    }
}

当我在页面底部并单击项目时它会展开,但展开的子项目不会向用户显示,因为它在屏幕底部。

我想将该项目在屏幕中向上移动并向用户显示展开的项目。

我该怎么做?

最佳答案

您可以简单地使用方法 setSelectedGroup()

expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
                expandableListView.setSelectedGroup(groupPosition);
                return true;
            }
        });

这会将选定的组移动到顶部

编辑 最后,我也为您的 ExpandableRecyclerAdapter 提出了一个解决方案。只需将此方法放入您的适配器实现中。此外,您还需要在适配器内部引用 recyclerView,您可以在初始化时将其传递给适配器。

int lastPos = -1;
@Override
public void onParentListItemExpanded(int position) {
    List<? extends ParentListItem> parentItemList = this.getParentItemList();
    collapseAllParents();
    int finalPos = position;
    if (lastPos != -1 && lastPos < position) {
        finalPos = position - parentItemList.get(lastPos).getChildItemList().size();
    }
    expandParent(finalPos);
    mRecyclerView.smoothScrollToPosition(finalPos);
    lastPos = position;
}

我在 https://github.com/bignerdranch/expandable-recycler-view/issues/156 发现了这个问题.尽管那里给出的解决方案没有用。稍作调整即可使其发挥作用。

关于android - ExpandableRecyclerAdapter 如何在扩展项目时强制项目向上移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37225435/

有关android - ExpandableRecyclerAdapter 如何在扩展项目时强制项目向上移动的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  5. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  6. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  7. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  8. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  9. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  10. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

随机推荐