为什么我在下面的代码中出现堆栈溢出?

时间:2014-02-11 16:37:58

标签: android listview android-listview

我下面有这个课程。

package com.example.metermanager;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import meter.manager.helper.DatabaseHelperClass;
import meters.model.MeterReading;
import meters.model.VMeterReadings;
import meters.model.VReadings;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class EditReadingsAdapter extends BaseAdapter {
    @SuppressWarnings("unused")
    private Context context;
    DatabaseHelperClass db;
    private static String DB_NAME="meterapp.sqlite";    
    private List<VReadings> readings =new ArrayList<VReadings>();
    DecimalFormat df = new DecimalFormat("#,###,###,###");
    SimpleDateFormat fm =new SimpleDateFormat("dd-MM-yyyy",Locale.UK);

    public EditReadingsAdapter( Context context1, String myDate) {
        this.context=context1;
        DatabaseHelperClass db= new  DatabaseHelperClass( context1,DB_NAME);
        readings=db.GetMeterReadings(myDate);
        db.close();

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return readings.size();
    }

    @Override
    public Object getItem(int index) {
        // TODO Auto-generated method stub
        return getItem(index);
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return arg0;
    }

    @Override
    public View getView(int arg0, View view, ViewGroup parent) {
        try{        
            if (view ==null){
                LayoutInflater inflater=
                        LayoutInflater.from(parent.getContext());
                      view =inflater.inflate(R.layout.edit_reading_details,parent,false);

            }
            VReadings reading =readings.get(arg0);              

            TextView idTextView =(TextView)
                    view.findViewById(R.id.textView6);

            idTextView.setText( Integer.toString(reading.get_id()));

            TextView readingdateTextView =(TextView)
                    view.findViewById(R.id.textView7);      
            readingdateTextView.setText(fm.format(((reading.getReadingDate()))));

            TextView readingTextView =(TextView)
                    view.findViewById(R.id.textView8);      
             readingTextView.setText(df.format((reading.getReading())));

             TextView Rate =(TextView)
                        view.findViewById(R.id.textView9);      
            Rate.setText(df.format(reading.getRate()));

             TextView meterTextView =(TextView)
                        view.findViewById(R.id.textView10);     
                 meterTextView.setText(reading.getMeter_number().toString());



            }catch(Exception e)
            {
                Log.e("Error loading data in listbox",e.toString());
            }
            return view;
        }



}

我使用该类将数据加载到listview小部件中。

public void Search(View v)
{
    try{

        Date search=fm.parse(txtviewreadingDate.getText().toString());
        String searchDate=fm.format(search);
        adapter = new EditReadingsAdapter(this ,searchDate);
        ListView listview =(ListView)findViewById(R.id.lstSearchReadings);  
        listview.setAdapter(adapter);
        listview.setOnItemClickListener(this);
        } catch(Exception e)
        {
            Log.e("Search Error", e.toString());
        }   

}

On我在listview上设置了onclickListener事件。

我希望能够在列表视图中获取当前选定的对象,并在自定义对话框中使用它。

public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
    Context context = this.getApplicationContext();         
    // custom dialog
    try{
                final Dialog dialog = new Dialog(context);
                dialog.setContentView(R.layout.edit_reading_dialog);
                dialog.setTitle("Edit Meter Readings"); 

                VReadings r= (VReadings)adapter.getItem(position);

当我点击列表视图时,我收到强制关闭错误。

这是错误的Logcat。

02-10 19:15:28.906: I/dalvikvm(5060): threadid=1: stack overflow on call to Lcom/example/metermanager/EditReadingsAdapter;.getItem:LI
02-10 19:15:28.906: I/dalvikvm(5060):   method requires 12+20+8=40 bytes, fp is 0x4428a320 (32 left)
02-10 19:15:28.916: I/dalvikvm(5060):   expanding stack end (0x4428a300 to 0x4428a000)
02-10 19:15:28.916: I/dalvikvm(5060): Shrank stack (to 0x4428a300, curFrame is 0x4428cebc)
02-10 19:15:28.916: D/AndroidRuntime(5060): Shutting down VM
02-10 19:15:28.916: W/dalvikvm(5060): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-10 19:15:29.227: E/AndroidRuntime(5060): FATAL EXCEPTION: main
02-10 19:15:29.227: E/AndroidRuntime(5060): java.lang.StackOverflowError
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.getItem(EditReadingsAdapter.java:47)
02-10 19:15:29.227: E/AndroidRuntime(5060):     at com.example.metermanager.EditReadingsAdapter.get
02-10 19:15:29.657: D/dalvikvm(5060): GC_CONCURRENT freed 1491K, 58% free 3062K/7175K, external 4957K/5214K, paused 8ms+8ms
02-10 19:15:35.306: I/Process(5060): Sending signal. PID: 5060 SIG: 9

看起来下面的一行是麻烦的问题。

VReadings r= (VReadings)adapter.getItem(position);

为什么?

罗纳德

2 个答案:

答案 0 :(得分:2)

因为函数getItem会调用自身。你最终会有无限的呼叫循环。

public Object getItem(int index) {
       // TODO Auto-generated method stub
       return getItem(index);
}

当引擎盖下的函数的参数通过堆栈时,最终会出现堆栈溢出。

答案 1 :(得分:0)

  @Override
  public Object getItem(int index) {
    // TODO Auto-generated method stub
    return readings.get(index);
  }
相关问题