【问题标题】:HeaderListView Incorret item access标题 ListView 不正确的项目访问
【发布时间】:2015-12-20 20:28:22
【问题描述】:

我正在使用HeaderListView,当您尝试访问任何数组的-1 位置时,我得到了ArrayIndexOutOfBoundsException。但这是我的意思,我在框架代码中遇到了这个错误,更准确地说是这一行:

boolean prevHasRows = mAdapter.numberOfRows(actualSection - 1) > 0;

文件内HeaderListView

我试图破解它并输入如下内容:

boolean prevHasRows = mAdapter.numberOfRows(actualSection - 1) > 0;

这里我没有更多的ArrayIndexOutOfBoundsException,但是当我有一个足够大的列表可以滚动时,最少的项目被弄乱了,我从第一部分到最后一个部分。

这是我的代码:

我设置适配器的片段:

import android.content.Context;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

import br.com.soutsapp.souts.R;
import br.com.soutsapp.souts.model.Menu;
import br.com.soutsapp.souts.model.Product;
import br.com.soutsapp.souts.model.modelview.OrderItem;
import br.com.soutsapp.souts.userInterface.adapter.SectionAdapter;
import br.com.soutsapp.souts.userInterface.controls.HeaderListView;


public class MenuFragment extends Fragment {
private Context mContext;
private List<OrderItem> itens;

private Menu menu;
public MenuFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.fragment_menu, container, false);
    mContext = getContext();

    itens = new ArrayList<>();
    menu = new Menu();

    setUpCardListView(v);
    return v;
}

private void setUpCardListView(View v){
    HeaderListView list = (HeaderListView) v.findViewById(R.id.hlv_card_items);

    list.setAdapter(new SectionAdapter() {

        @Override
        public int numberOfSections() {
            return menu.getMenuSessions().size();
        }

        @Override
        public int numberOfRows(int section) {
            return menu.getMenuSessions().get(section).size();
        }

        @Override
        public Object getRowItem(int section, int row) {
            return menu.getMenuSessions().get(section).get(row);
        }

        @Override
        public boolean hasSectionHeaderView(int section) {
            return true;
        }

        @Override
        public View getRowView(final int section, final int row, View convertView, ViewGroup parent) {
            if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(getResources().getLayout(R.layout.menu_item_row), null);

                TextView tvMenuItemName = (TextView) convertView.findViewById(R.id.tv_menu_item_name);
                TextView tvMenuItemPrice = (TextView) convertView.findViewById(R.id.tv_price);

                String itemName = menu.getMenuSessions().get(section).get(row).getName();
                tvMenuItemName.setText(itemName);

                String itemPrice = String.valueOf(menu.getMenuSessions().get(section).get(row).getPrice());
                tvMenuItemPrice.setText(itemPrice);

                TextView tvQuantity = (TextView) convertView.findViewById(R.id.tv_quantity);

                tvQuantity.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        TextView tvQuantity = (TextView) v;
                        Product product = (Product) getRowItem(section, row);

                        if (tvQuantity.getText().equals("1") && !tvQuantity.getText().equals("")){
                            tvQuantity.setText("");

                            OrderItem itenToRemove = null;
                            for(OrderItem item: itens){
                                if(item.getProductId() == product.getId()){
                                    itenToRemove = item;
                                    break;
                                }
                            }
                            itens.remove(itenToRemove);
                        }
                        else{

                            for(OrderItem item: itens){
                                if(item.getProductId() == product.getId()){
                                    int quantity = item.getQuantity();
                                    item.setQuantity(--quantity);
                                    tvQuantity.setText(String.valueOf(item.getQuantity()));
                                    break;
                                }
                            }
                        }
                    }
                });
            }

            return convertView;
        }

        @Override
        public int getSectionHeaderViewTypeCount() {
            return 1;
        }

        @Override
        public View getSectionHeaderView(int section, View convertView, ViewGroup parent) {

            if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(getResources().getLayout(android.R.layout.simple_list_item_1), null);
            }

            switch (section) {
                case 0:
                    ((TextView) convertView).setText("Bebidas");
                    convertView.setBackgroundColor(getResources().getColor(R.color.Blue_Jay));
                    break;
                case 1:
                    ((TextView) convertView).setText("Comidas");
                    convertView.setBackgroundColor(getResources().getColor(R.color.Red_Wine));
                    break;
                case 2:
                    ((TextView) convertView).setText("Diversos");
                    convertView.setBackgroundColor(getResources().getColor(R.color.Camel_brown));
                    break;
            }
            return convertView;
        }

        @Override
        public void onRowItemClick(AdapterView<?> parent, View view, int section, int row, long id) {
            super.onRowItemClick(parent, view, section, row, id);

            TextView tvQuantity = (TextView) view.findViewById(R.id.tv_quantity);
            Product p = (Product) getRowItem(section, row);

            boolean exist = false;
            for(OrderItem item : itens){
                if(item.getProductId() == p.getId()){
                    int actualQuantity = item.getQuantity();
                    item.setQuantity(++actualQuantity);
                    tvQuantity.setText(String.valueOf(item.getQuantity()));
                    exist = true;
                }
            }
            if(!exist){
                itens.add(new OrderItem(p.getId(), 1));
                tvQuantity.setText("1");
            }
        }
    });
}
}

提前谢谢各位!

【问题讨论】:

    标签: java android listview android-listview header


    【解决方案1】:

    我也有同样的问题,我通过修改SectionAdapter.java解决了

    如下:

    public abstract int numberOfRows(int section);
    
    public int numberOfRow(int section) {
        if(section < 0) {
            return 0;
        }
        return this.numberOfRows(section);
    }
    

    然后,在你提到的 HeaderListView 中,修改为调用

    boolean currIsLast = mAdapter.getRowInSection(realFirstVisibleItem) == mAdapter.numberOfRow(actualSection) - 1; 
    
    boolean prevHasRows = mAdapter.numberOfRow(actualSection - 1) > 0;
    

    现在我们解决了这个错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      相关资源
      最近更新 更多