Nano Hash - криптовалюты, майнинг, программирование

Удалить элемент из gridView, но в планшете показать, что удален последний элемент. Как это исправить?

Я добавляю элемент в gridView (использую ArrayList с 10 элементами), но когда я нажимаю кнопку, чтобы удалить элемент (например, индекс элемента 2), он удаляет правильный элемент из ArrayList, но в gridView удаляет последний.

Это адаптер getView() `

    public View getView(int arg0, View convertView, ViewGroup arg2) {

    View row = convertView; OrderItemHolder holder;
    OrderItem mItem = orderItemsList.get(arg0);

    if (row == null) {

        isNew = true;

        LayoutInflater inflater = (LayoutInflater) orderActivity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.order_item, arg2, false);

        holder = new OrderItemHolder();
        // initialize the elements
        holder.itemOrderRLay = (RelativeLayout) row.findViewById(R.id.itemOrderRLay);

        holder.orderItemImage = (CImageView) row.findViewById(R.id.orderItemImage);

        holder.itemCount = (TextView) row.findViewById(R.id.itemCount);
        holder.itemCount.setId(mItem.getCountId());

        holder.itemText = (TextView) row.findViewById(R.id.itemText);
        holder.itemCost = (TextView) row.findViewById(R.id.itemCost);

        holder.maxCount = (CButton) row.findViewById(R.id.maxCount);
        holder.maxCount.setCountViewId(holder.itemCount.getId());

        holder.minCount = (CButton) row.findViewById(R.id.minCount);
        holder.minCount.setCountViewId(holder.itemCount.getId());

        row.setTag(holder);
    } else {
        holder = (OrderItemHolder) row.getTag();
    }

    if (mItem != null) {
        if(isNew){

            isNew = false;

            holder.itemCount.setText("x" + mItem.getCount());
            //holder.itemCount.setId(mItem.getCountId());

            holder.itemText.setText(mItem.getMenuInsideItem().getName());
            holder.itemText.setBackgroundResource(R.drawable.small_title_bg);

            holder.itemCost.setText("(" + mItem.getMenuInsideItem().getTime() + " dəq | " + mItem.getMenuInsideItem().getCost() + " manat)");

            holder.itemCost.setTextColor(Color.rgb(93, 40, 40));

            Drawable d = mContext.getResources().getDrawable(mItem.getMenuInsideItem().getPicId());
            holder.orderItemImage.setImageBitmap(OrderUtil.roundCornerImage(OrderUtil.drawableToBitmap(d), 9));

            holder.maxCount.setIndex(arg0);         
            holder.maxCount.setOnClickListener(this);

            holder.minCount.setIndex(arg0);
            holder.minCount.setOnClickListener(this);


            holderList.add(holder);
        }
    }

    return row;
}`

XML-код элемента gridView

`

                        <emenu.custom.CImageView
                            android:id="@+id/orderItemImage"
                            android:layout_width="165dp"
                            android:layout_height="165dp"
                            android:layout_centerVertical="true"
                            android:background="@drawable/image_bg_thin"
                            android:clickable="false"
                            android:minWidth="50dip"
                            android:scaleType="fitXY"
                            android:src="@drawable/a10" />

                        <TextView
                            android:id="@+id/itemCost"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_alignBottom="@+id/orderItemImage"
                            android:layout_marginLeft="2dp"
                            android:layout_toRightOf="@+id/orderItemImage"
                            android:gravity="center"
                            android:text="deq|mnt"
                            android:textAppearance="?android:attr/textAppearanceSmall"
                            android:textColor="@android:color/black"
                            android:textSize="12sp" />

                        <emenu.custom.CButton
                            android:id="@+id/minCount"
                            android:layout_width="50dp"
                            android:layout_height="50dp"
                            android:layout_centerVertical="true"
                            android:layout_marginLeft="2dp"
                            android:layout_toRightOf="@+id/maxCount"
                            android:background="@drawable/image_bg_full"
                            android:text="-"
                            android:textColor="@android:color/white" />

                        <emenu.custom.CButton
                            android:id="@+id/maxCount"
                            android:layout_width="50dp"
                            android:layout_height="50dp"
                            android:layout_centerVertical="true"
                            android:layout_marginLeft="2dp"
                            android:layout_toRightOf="@+id/orderItemImage"
                            android:background="@drawable/image_bg_full"
                            android:text="+"
                            android:textColor="@android:color/white" />

                        <TextView
                            android:id="@+id/itemText"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_above="@+id/itemCount"
                            android:layout_alignBottom="@+id/orderItemImage"
                            android:layout_alignLeft="@+id/orderItemImage"
                            android:layout_alignRight="@+id/orderItemImage"
                            android:layout_marginBottom="4dp"
                            android:layout_marginLeft="5dp"
                            android:layout_marginRight="5dp"
                            android:gravity="center"
                            android:text="Pasta Florentine Casserole"
                            android:textAppearance="?android:attr/textAppearanceSmall"
                            android:textColor="@android:color/black"
                            android:textSize="13sp" />

                        <TextView
                            android:id="@+id/itemCount"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_above="@+id/itemCost"
                            android:layout_alignLeft="@+id/itemCost"
                            android:layout_marginLeft="2dp"
                            android:gravity="center"
                            android:text="x1"
                            android:textAppearance="?android:attr/textAppearanceSmall"
                            android:textColor="@android:color/black"
                            android:textSize="24sp" />

</RelativeLayout>`

И функция нажатия кнопки `

        case R.id.minCount: countText = (TextView) holder.itemOrderRLay.findViewById(holder.minCount.getCountViewId());

        count = OrderUtil.updateDBCount((int) mItem.getMenuInsideItem().getId(), deviceId, mItem.getCountId(), mContext, false);

        Log.w(TAG, "(line 179) button.getIndex() = " + button.getIndex());
        Log.w(TAG, "(line 180) holder.minCount.getCountViewId() = " + holder.minCount.getCountViewId());
        Log.w(TAG, "(line 181) count = " + count);
        Log.w(TAG, "(line 182) holder.getIndex() = " + holderList.indexOf(holder));

        if(count != 0){         
            countText.setText("x" + count);                             
        }

        if(count == 0){
            OrderUtil.updateDBCount((int) mItem.getMenuInsideItem().getId(), deviceId, mItem.getCountId(), mContext, false);
            Log.w(TAG, "(line 192) button.getIndex() = " + button.getIndex());


            orderItemsList.remove(button.getIndex());

            this.notifyDataSetChanged();


        }

        totalCost -= mItem.getMenuInsideItem().getCost();
        totalCostText.setText(totalCost + " manat");
        break;

    default:
        break;
    }`

Ответы:


1

Кажется, что после notifyDataSetChanged() представления, которые используются в gridview, не перерабатываются, поэтому в getView() новые представления не создаются и isNew равно false. Таким образом, ничего не изменится, пока эти взгляды не будут уничтожены. Последний элемент не показан, потому что getView() вызывалось столько раз, сколько элементов было уменьшено. Итак, вы должны удалить isNew проверку.

17.03.2014
  • Какова цель isNew? 18.03.2014
  • Кстати, после удаления выключите и включите экран, чтобы проверить, станет ли он правильным. 18.03.2014
  • isNew используется для предотвращения повторяющихся функций getView. Я не знаю почему, но getView вызывался больше раз и повторял существующие элементы. 18.03.2014
  • Я проверяю ArrayList по журналу. Нет проблем, список удаляет правильный элемент, но визуально удаляется последним в gridView. 18.03.2014
  • И когда я снова открываю активность, где существует gridView, я вижу настоящие элементы. 18.03.2014
  • Я обновил свой ответ, проблема, похоже, из-за isNew. "I dont know why,but getView called more times,and repeat existed items" - вы имеете в виду, что в gridView больше элементов, чем в адаптере в этом случае? Вы уверены, что возвращаете правильный номер в getCount()? 18.03.2014
  • Я имею в виду, что держатель получает существующий элемент, когда я хочу создать новый объект OrderItem . Да, я уверен, потому что я проверяю каждый стержень, когда я нажимаю кнопку, когда обновляю базу данных и т. Д. Абсолютно все правильно, но неправильно только то, что я вижу в планшете. 18.03.2014
  • GridView и ListView могут повторно использовать представления, которые ранее использовались в других ячейках или строках, поэтому это нормальное поведение. Вы должны просто удалить isNew, и, я полагаю, это сработает. 18.03.2014
  • Я тестирую, но без isNew не работает. Я не знаю, как объяснить (((( Обычно существует рабочий пример, который удаляет элемент из заданного индекса gridView. Вы можете мне помочь? 18.03.2014
  • Что странно, должно работать без isNew. Вы можете попробовать остроконечное решение: несмотря на this.notifyDataSetChanged(); set: List<OrderItem> tmp = orderItemsList; orderItemsList = new List<OrderItem>(); this.notifyDataSetChanged(); orderItemsList = tmp; this.notifyDataSetChanged(); 18.03.2014
  • У меня плохие новости, не сработало. Цойкер, который отличается между ListView и GridView. Потому что, когда я использую ListView , кнопка минус работает, но я хочу отображать элементы в виде 2 или более столбцов, потому что я меняю вид на GridView. но знаю его проблему, которую я не могу решить. 18.03.2014
  • Может быть, я могу попробовать помочь, если вы попытаетесь объяснить, в чем проблема без isNew. Кстати, для чего нужен список держателей? 18.03.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..