Пользовательский вид сетки после нескольких позиций показывает неверные данные - PullRequest
0 голосов
/ 05 апреля 2020

Я обнаружил некоторую проблему с моим пользовательским адаптером gridview, я добавил позиции от 1 до 10. Все верно до номера 6, после этого вместо того, чтобы показывать число 7/8, показывает номера 2 и 1. Я понятия не имею, что не так.

Я новичок ie, и я был бы признателен за любую помощь. Спасибо

Вот изображение проблемы.

Вот код из адаптера gridview

public class GvOrdersAdapter extends BaseAdapter
{
    private Context context;
    private final String[] nameValues;
    private final String[] danieValues;
    private final String[] danie2Values;
    private final String[] zupaValues;
    private final String[] statusValues;




    GvOrdersAdapter(Context context, String[] nameValues, String[] danieValues, String[] danie2Values,
 String[] zupaValues, String[] statusValues)
    {
        this.context = context;
        this.nameValues = nameValues;
        this.danieValues = danieValues;
        this.danie2Values = danie2Values;
        this.zupaValues = zupaValues;
        this.statusValues = statusValues;

    }

    @SuppressLint({"ResourceAsColor", "SetTextI18n", "InflateParams"})
    public View getView(int position, View convertView, ViewGroup parent)
    {


        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View gridView;

        if (convertView == null)
        {

            // get layout from mobile.xml
            assert inflater != null;
            gridView = inflater.inflate(R.layout.gv_ordered_list, null);



            // set value into textview
            TextView tvName = gridView.findViewById(R.id.tvName);
            TextView tvDanie = gridView.findViewById(R.id.tvDanieGlowne);
            TextView tvDanie2 = gridView.findViewById(R.id.tvDodatki);
            TextView tvZupa = gridView.findViewById(R.id.tvZupa);
            TextView tvStatus = gridView.findViewById(R.id.tvStatus);

            tvName.setText(nameValues[position]);
            tvDanie.setText((danieValues[position]));
            tvDanie2.setText((danie2Values[position]));
            tvZupa.setText((zupaValues[position]));


            if (statusValues[position].contains("Poczekaj na akceptacje zamówienia"))
            {
                tvStatus.setText((statusValues[position]) + "\n");
            }

            else if (statusValues[position].contains("Przyjęto, w trakcie realizacji"))
            {
                tvStatus.setText((statusValues[position])+"\n");
                tvStatus.setTextColor(context.getResources().getColor(R.color.ordered_wait_for_accept));
            }

            else if (statusValues[position].contains("W transporcie"))
            {
                tvStatus.setText((statusValues[position])+"\n");
                tvStatus.setTextColor(context.getResources().getColor(R.color.ordered_accepted));
            }

            else if (statusValues[position].contains("Dostarczone"))
            {
                tvStatus.setText((statusValues[position])+"\n");
                tvStatus.setTextColor(context.getResources().getColor(R.color.colorPrimary));
            }



        } else
        {
            gridView = convertView;
        }


        return gridView;
    }


    @Override
    public int getCount()
    {
        return nameValues.length;
    }

    @Override
    public Object getItem(int position)
    {
        return null;
    }

    public boolean isEnabled(int position)
    {
        return true;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

}

, собирающий данные из базы данных о пожарной деятельности из действия

private void ZlozoneZamowieniaList() {

        DatabaseReference ordered = FirebaseDatabase.getInstance().getReference().child("Złożone zamówienia");
        ordered.child(thisYear)
                .child(thisMonth)
                .child(thisDay)
                .child(Firma)
                .orderByChild("name")
                .equalTo(id)
                .addValueEventListener(new ValueEventListener() {


                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot)    
                    {
                        ClearLists(); //WYCZYŚĆ LISTY
                        for (DataSnapshot snapshot : dataSnapshot.getChildren())  
                        {
                            String imie = snapshot.child("imie").getValue(String.class); 
                            String danie = snapshot.child("danie").getValue(String.class);//ITD
                            String dodatek = snapshot.child("dodatek").getValue(String.class);//ITD
                            String zupa = snapshot.child("zupa").getValue(String.class);//ITD
                            String id = snapshot.child("informacjeDlaObslugi").getValue(String.class);//ITD
                            String gotKey = snapshot.child("key").getValue(String.class);//ITD
                            String status = snapshot.child("status").getValue(String.class);//ITD
                            if (status != null && !status.contains("Zamówienie anulowane przez klienta"))           
                            {
                                mListName.add(imie);        
                                if (danie != null)
                                {
                                    mListDish.add(danie);       
                                }else
                                {
                                    mListDish.add(" ");
                                }

                                if (dodatek != null)                
                                {
                                    mListDish2.add(dodatek);       
                                } else {
                                    mListDish2.add(" ");            
                                }
                                if (zupa != null)                   
                                {
                                    mListSoup.add(zupa);
                                } else {
                                    mListSoup.add(" ");
                                }
                                if (id != null)                   
                                {
                                    mListInfo.add(id);
                                } else {
                                    mListInfo.add(" ");
                                }
                                mListStatus.add(status);
                                keyList.add(gotKey);
                            }
                            String[] sListName = mListName.toArray(new String[0]);          
                            String[] sListDish = mListDish.toArray(new String[0]);         
                            String[] sListDish2 = mListDish2.toArray(new String[0]);       
                            String[] sListSoup = mListSoup.toArray(new String[0]);         
                            String[] sListStatus = mListStatus.toArray(new String[0]);      
                            GvOrdersAdapter GvAdapter = new GvOrdersAdapter(getContext(), sListName, sListDish,
 sListDish2, sListSoup, sListStatus);        
                            gvOrderedMeals.setAdapter(GvAdapter);
                            GvClear();                                  
                        }
                    }

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

                    }
                });
    }

данные собраны правильно, потому что когда я создаю alerttdaliog после нажатия на gridview, он показывает мне правильные данные.

1 Ответ

0 голосов
/ 05 апреля 2020

Ваша проблема заключалась в том, что , если convertView НЕ было пустым, вы никогда не обновляли его текстовые представления , но в следующем коде он всегда будет обновлять

, изменять getView() следующим образом:

public View getView(int position, View convertView, ViewGroup parent){


   LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

//<----------------------- add following line
   View gridView = convertView == null ? inflater.inflate(R.layout.gv_ordered_list, null) : convertView 


//<----------------------- "if else" is removed from your code

            // get layout from mobile.xml
            assert inflater != null;
            gridView = inflater.inflate(R.layout.gv_ordered_list, null);



            // set value into textview
            TextView tvName = gridView.findViewById(R.id.tvName);
            TextView tvDanie = gridView.findViewById(R.id.tvDanieGlowne);
            TextView tvDanie2 = gridView.findViewById(R.id.tvDodatki);
            TextView tvZupa = gridView.findViewById(R.id.tvZupa);
            TextView tvStatus = gridView.findViewById(R.id.tvStatus);

            tvName.setText(nameValues[position]);
            tvDanie.setText((danieValues[position]));
            tvDanie2.setText((danie2Values[position]));
            tvZupa.setText((zupaValues[position]));


            if (statusValues[position].contains("Poczekaj na akceptacje zamówienia"))
            {
                tvStatus.setText((statusValues[position]) + "\n");
            }

            else if (statusValues[position].contains("Przyjęto, w trakcie realizacji"))
            {
                tvStatus.setText((statusValues[position])+"\n");
                tvStatus.setTextColor(context.getResources().getColor(R.color.ordered_wait_for_accept));
            }

            else if (statusValues[position].contains("W transporcie"))
            {
                tvStatus.setText((statusValues[position])+"\n");
                tvStatus.setTextColor(context.getResources().getColor(R.color.ordered_accepted));
            }

            else if (statusValues[position].contains("Dostarczone"))
            {
                tvStatus.setText((statusValues[position])+"\n");
                tvStatus.setTextColor(context.getResources().getColor(R.color.colorPrimary));
            }


        return gridView;
    }
...