【问题标题】:RecycleView loaded from Spinner makes infinite loop从 Spinner 加载的 RecycleView 使无限循环
【发布时间】:2020-11-30 15:07:04
【问题描述】:

如果过滤后的搜索是由微调器制成的,我正在尝试建立一个商店。起初我尝试只使用其中的两个,并且效果很好。当我尝试拥有第三个时,问题就来了。微调器数据用于在 firebase 数据库中进行搜索。我不知道使用两个或三个微调器有什么不同。如果有人可以帮助我,我将非常感激

过滤的搜索片段*

public class FilterFragment extends Fragment
implements AdapterView.OnItemSelectedListener{


public FilterFragment() {
    // Required empty public constructor
}

String txtBrand,txtKind, subKing;
Spinner spinBrand,spinKind, spinSubkind;
RecyclerView rv;
List<String>Brands;
List<String>Kinds;
List<Producto> productslist;
AdapterAllProducts adapterAllProducts;
public DatabaseReference mReference;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v =inflater.inflate(R.layout.filter_fragment, container, false);
    spinBrand=v.findViewById(R.id.spinnerMarca);
    spinKind=v.findViewById(R.id.spinnerTipoPieza);
    spinSubKind=v.findViewById(R.id.spinnerSubtipo);
    rv=v.findViewById(R.id.rvAvanzado);
    Brands= Arrays.asList(getResources().getStringArray(R.array.marcas));
    Kinds= Arrays.asList(getResources().getStringArray(R.array.tiposPiezas));
    mReference= FirebaseDatabase.getInstance().getReference("Product");
    spinBrand.setOnItemSelectedListener(this);
    spinKind.setOnItemSelectedListener(this);
    spinSubKind.setOnItemSelectedListener(this);
    return v;
}


public void loadRecycler(final String Marca, String Tipo, final String SubTipo){
    rv.setLayoutManager(new LinearLayoutManager(getContext()));
    productoslist= new ArrayList<>();
    adapterAllProducts = new AdapterAllProducts(productoslist,getActivity());
    adapterAllProducts.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Producto prod = productoslist.get(rv.getChildAdapterPosition(v));
            String pid = prod.getPid();
            Preferencias.setPid(getActivity(),pid);
            Fragment fragmentuser = new ProductsFragment();
            FragmentManager ManagerUser = getFragmentManager();
            FragmentTransaction transactionUser = ManagerUser.beginTransaction();
            transactionUser.replace(R.id.contentfragment,fragmentuser);
            transactionUser.commit();

        }
    });
    rv.setAdapter(adapterAllProducts);

    if (Brand.equals("Brands")&&Tipo.equals("Tipos")&&SubTipo.equals("subtipos")){
        mReferencia.child("Product").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                productoslist.clear();
                for (DataSnapshot Snapshot : snapshot.getChildren()
                ) {
                    Producto producto = Snapshot.getValue(Producto.class);
                    productoslist.add(producto);

                }
                adapterAllProducts.notifyDataSetChanged();

            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }else{
        if(!Brand.equals("Brands")&&Tipo.equals("Tipos")&&SubTipo.equals("subtipos")){
            Query q = mReferencia.orderByChild("marca").equalTo(Marca);
            q.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {

                    productoslist.clear();
                    for (DataSnapshot Snapshot : snapshot.getChildren()
                    ) {
                        Producto producto = Snapshot.getValue(Producto.class);
                        productoslist.add(producto);
                    }
                    adapterAllProducts.notifyDataSetChanged();

                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            });
        }
        else if (Brand.equals("Brands") && !Tipo.equals("Tipos")&&SubTipo.equals("subtipos")){
            Query q = mReferencia.orderByChild("tipo").equalTo(Tipo);
            q.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {

                    productoslist.clear();
                    for (DataSnapshot Snapshot : snapshot.getChildren()
                    ) {
                        Producto producto = Snapshot.getValue(Producto.class);
                        productoslist.add(producto);
                    }
                    adapterAllProducts.notifyDataSetChanged();

                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            });
        }
        else if (Brand.equals("Brands") && !Tipo.equals("Tipos")&&!SubTipo.equals("subtipos")){
            Query q = mReferencia.orderByChild("tipo").equalTo(Tipo);
            q.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {

                    productoslist.clear();
                    for (DataSnapshot Snapshot : snapshot.getChildren()
                    ) {
                        Producto producto = Snapshot.getValue(Producto.class);
                        if (producto.getSubtipo().equals(SubTipo)) {
                            productoslist.add(producto);
                        }
                    }
                    adapterAllProducts.notifyDataSetChanged();

                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            });
        }
        else if (!Brand.equals("Brands") && !Tipo.equals("Tipos")&&!SubTipo.equals("subtipos")){
            Query q = mReferencia.orderByChild("tipo").equalTo(Tipo);
            q.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {

                    productoslist.clear();
                    for (DataSnapshot Snapshot : snapshot.getChildren()
                    ) {
                        Producto producto = Snapshot.getValue(Producto.class);
                        if (producto.getMarca().equals(Marca)){
                            if (producto.getSubtipo().equals(SubTipo)) {
                                productoslist.add(producto);
                            }
                        }
                    }
                    adapterAllProducts.notifyDataSetChanged();

                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            });
        }
    }

}


public String FillspinSubKind(String txtSubKind){
    switch (subTipo){
        case "boots":
            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),R.array.subkind_boots,R.layout.support_simple_spinner_dropdown_item);
            spinSubTipo.setAdapter(adapter);
            txtSubKind = spinSubTipo.getSelectedItem().toString();
            break;
        case "Sports":
            ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(getActivity(),R.array.subkind_sports,R.layout.support_simple_spinner_dropdown_item);
            spinSubTipo.setAdapter(adapter1);
            txtSubKind= spinSubTipo.getSelectedItem().toString();
            break;
        case "Formal":
            ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(getActivity(),R.array.subkind_formal,R.layout.support_simple_spinner_dropdown_item);
            spinSubTipo.setAdapter(adapter2);
            txtSubKind= spinSubTipo.getSelectedItem().toString();
            break;
        case "Merchandising":
            ArrayAdapter<CharSequence> adapter3 = ArrayAdapter.createFromResource(getActivity(),R.array.subkind_merch,R.layout.support_simple_spinner_dropdown_item);
            spinSubTipo.setAdapter(adapter3);
            txtSubKind= spinSubTipo.getSelectedItem().toString();
            break;
    }
    return txtSubTipo;
}
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
    txtMarca = spinMarca.getSelectedItem().toString();
    txtTipo = spinTipo.getSelectedItem().toString();
    FillspinSubKind(txtKind);
    loadRecycler(txtMarca,txtTipo,txtSubKind);
}

@Override
public void onNothingSelected(AdapterView<?> adapterView) {

}}

我会感谢任何提供帮助的人。 后数据:英语不是我的母语,所以我为我的英语水平道歉。我也尝试从代码中翻译名称。

【问题讨论】:

    标签: java android firebase-realtime-database android-recyclerview spinner


    【解决方案1】:

    spinSubTipo 是什么?你在哪里实例化?如果我猜对了,它一定是相同的spinSubKind。所以如果它是真的,你为spinSubKind设置一个OnItemSelectedListener,在onItemSelected中你调用FillspinSubKind方法,在FillspinSubKind你调用spinSubTipo.setAdapter,导致spinSubKindOnItemSelectedListener将触发并且会发生循环。

    【讨论】:

    • 你是对的 spinSubTipo 与 spinSubKind 相同。如果我不在 onItemSelectedListener 中这样做,我不知道谁来更改该微调器的内容
    • 只有当我使用 FillspinSubKind 的某些东西时才会发生循环
    • 如果您想在选择相同的微调器项目时更改微调器的适配器,请为您的微调器设置setOnItemClickListener。并从中删除onItemSelectListener
    • 我该怎么做?我删除了 onItemClickListener 方法?
    • 我按照你告诉我的方式尝试它,它给我带来了一个错误,说我不能在微调器中使用 setOnItemClickListener
    【解决方案2】:

    我解决了 感谢您尝试提供帮助,但最后我看到了无限循环的位置,这是 onItemClickListener 方法的问题,最后我将该方法中的数据更改为开关,并且它运行良好。我就是这样做的

       @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        switch (adapterView.getId()){
            case R.id.spinnerBrand:
                txtBrand = spinBrand.getSelectedItem().toString();
                txtKind = spinKind.getSelectedItem().toString();
                fillRecycler(txtBrand ,txtKind ,txtSubKind);
                break;
            case R.id.spinnerKind:
                txtBrand = spinBrand.getSelectedItem().toString();
                txtKind = spinKind.getSelectedItem().toString();
                FillspinSubKind(txtKind );
                fillRecycler(txtBrand ,txtKind ,txtSubKind);
                break;
    
            case R.id.spinnerSubkind:
                txtBrand = spinBrand.getSelectedItem().toString();
                txtKind = spinKind.getSelectedItem().toString();
                txtSubKind = spinSubKind.getSelectedItem().toString();
                fillRecycler(txtBrand ,txtKind ,txtSubKind);
                break;
        }
    
    
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多