首页 > 解决方案 > ListView 在滚动时崩溃

问题描述

我创建了一个 ListView,它在滚动时会在滚动某些项目后崩溃,而它仍在滚动。调试或错误消息如下:

还包括 onCreate、loadItems 和 getView 函数。我试图确定问题可能是什么,但无济于事。我也在网上观察到类似的问题,但无法确定故障是什么。一定有人经历过这种困境。

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.egent.adagesapp, PID: 12677
              java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' on a null object reference
                  at android.widget.AbsListView.obtainView(AbsListView.java:2382)
                  at android.widget.ListView.makeAndAddView(ListView.java:2052)
                  at android.widget.ListView.fillDown(ListView.java:786)
                  at android.widget.ListView.fillGap(ListView.java:750)
                  at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5225)
                  at android.widget.ListView.trackMotionScroll(ListView.java:1971)
                  at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4769)
                  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
                  at android.view.Choreographer.doCallbacks(Choreographer.java:723)
                  at android.view.Choreographer.doFrame(Choreographer.java:655)
                  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
                  at android.os.Handler.handleCallback(Handler.java:790)
                  at android.os.Handler.dispatchMessage(Handler.java:99)
                  at android.os.Looper.loop(Looper.java:164)
                  at android.app.ActivityThread.main(ActivityThread.java:6494)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)


protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_idioms_list);

        lvAdages = (ListView) findViewById(R.id.lvProverbsAndIdioms);
        tvPageTitle = (TextView) findViewById(R.id.tvProverbsAndIdiomsCount);
        tvTotalAdageCount = (TextView) findViewById(R.id.tvTotalAdageCount);
        btnNext = (Button) findViewById(R.id.btnNext);
        btnPrev = (Button) findViewById(R.id.btnPrevious);

        btnPreviousClicked();
        btnNextClicked();
        onAdageListItemClicked();

        try {
            aAdapter = new AdageAdapter(getApplicationContext(),     R.layout.proverb_idiom_row);
            tvTotalAdageCount.setText("Total Adages = "+     String.valueOf(DbContract.DbEntry.tempAdageList.size()));

            if(DbContract.DbEntry.tempAdageList != null)
            {
                TOTAL_ITEMS = DbContract.DbEntry.tempAdageList.size();
            }
            else
                TOTAL_ITEMS = 0;

            int val = TOTAL_ITEMS % NUM_ITEMS_PER_PAGE;
            val = (val == 0? 0:1);
            pageCount = TOTAL_ITEMS / NUM_ITEMS_PER_PAGE + val;

            if (DbContract.DbEntry.tempAdageList != null && DbContract.DbEntry.tempAdageList.size() > 0) 
            {
                for (AdageDetails details : DbContract.DbEntry.tempAdageList) 
                {
                    aAdapter.add(details);
                }
            }

            if(DbContract.DbEntry.tempAdageList != null && DbContract.DbEntry.tempAdageList.size() > 0)
                loadItems(currentPage);
            checkEnable();

        }
        catch (Exception e)
        {
            String str = e.getMessage();
            int i = 5;
            while (i>0) 
            {
                Toast.makeText(getApplicationContext(), "Inialising List failed!     *emphasized text*" + str, Toast.LENGTH_LONG).show();
                i--;
            }
        }

    }

private void loadItems(int page)
{
try{
            int count = 0;
            List<AdageDetails> details = new ArrayList<AdageDetails>();

            if(DbContract.DbEntry.tempAdageList != null)
                count = DbContract.DbEntry.tempAdageList.size();

            if(pageCount > 0)
                tvPageTitle.setText("Page "+(page+1)+" of "+pageCount);
            else
                tvPageTitle.setText("Page "+(page)+" of "+pageCount);

            int start = page * NUM_ITEMS_PER_PAGE;
            for(int i=start;i<(start + NUM_ITEMS_PER_PAGE);i++)
            {
                if(i<count)
                {
                    details.add(DbContract.DbEntry.tempAdageList.get(i));
                }
                else
                {
                    break;
                }
            }
            aAdapter = new AdageAdapter(getApplicationContext(), R.layout.proverb_idiom_row);
            for(AdageDetails detail:details)
            {
                aAdapter.add(detail);
            }
            lvAdages.setAdapter(aAdapter);

        }
        catch (Exception e)
        {
            String str = e.getMessage();

            if(DbContract.DbEntry.allAdageList.size() > 0)
                DbContract.DbEntry.tempAdageList = DbContract.DbEntry.allAdageList;

            int i = 5;
            while (i>0) 
            {
                Toast.makeText(getApplicationContext(), "Paging failed! " + str, Toast.LENGTH_LONG).show();
                i--;
            }
        }
    }

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

        View row = convertView;
        ViewHolder holder = new ViewHolder();

        if(row == null)
        {

            LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.proverb_idiom_row, parent, false);

            holder.adageTitle = row.findViewById(R.id.tvAdageRowTitle);
            holder.adageMain = row.findViewById(R.id.tvAdageRowMain);
            holder.adageImage = row.findViewById(R.id.ivAdageRowPicture);
            holder.adageID = row.findViewById(R.id.tvAdageIDRow);
            holder.adageType = row.findViewById(R.id.tvAdageTypeRow);
            holder.adageCountry = row.findViewById(R.id.tvAdageCountryRow);
            holder.rowLayout = row.findViewById(R.id.llIdRow);

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

        try 
        {
            AdageDetails aDetails = (AdageDetails) getItem(position);

            holder.adageTitle.setText(aDetails.getStrAdageIgbo().substring(0,20)+"...");
            holder.adageMain.setText(aDetails.getStrAdageMeaningLiteral());
            holder.adageID.setText(String.valueOf(aDetails.getiNum()));
            holder.adageType.setText((aDetails.getStrAdageType().contains("Idiom")? "This is an "+ aDetails.getStrAdageType(): "This is a "+ aDetails.getStrAdageType()) );

            if(aDetails.getStrPhotoPath() == null)
                holder.adageImage.setImageResource(getPhotoOrVoiceID("R.drawable.na"));
            else
                holder.adageImage.setImageResource(getPhotoOrVoiceID(aDetails.getStrPhotoPath()));

            holder.adageCountry.setText("This " + aDetails.getStrAdageType()+" is from "+ aDetails.getStrTribe()+ " in " + aDetails.getStrCountry());

            if(position % 2 == 0)
                holder.rowLayout.setBackgroundResource(R.drawable.rounded_corners_btn);
            else
                holder.rowLayout.setBackgroundResource(R.drawable.rounded_corners_btn2);
        }
        catch (Exception ee)
        {
            String str = ee.getMessage();
            Toast.makeText(cContext, "Adage Adapter error, "+ str, Toast.LENGTH_LONG).show();
            ee.printStackTrace();
            return null;
        }

        return row;
    }

标签: javaandroid-studioandroid-listview

解决方案


推荐阅读