IndexOutOfBoundsException通过适配器访问listview时

时间:2011-11-25 16:25:21

标签: android listview adapter indexoutofboundsexception

我已经实现了我的ListView,我使用自定义适配器填充列表,该适配器扩展BaseAdapter并使用基于.NET的服务,拉动并填充列表中的值。这工作正常,但当我试图连续在列表上做一些操作(如删除条目,刷新,编辑..),我收到以下错误。此错误并非始终存在。但在15/20尝试中有1次。

尝试解决,漫游网络,找出原因不会发生..仍在搜索...

11-25 21:38:39.257: ERROR/AndroidRuntime(2169): Uncaught handler: thread main
                    exiting due to uncaught exception

11-25 21:38:39.325: ERROR/AndroidRuntime(2169): java.lang.IndexOutOfBoundsException:
                    Invalid location 0, size is 0

11-25 21:38:39.325: ERROR/AndroidRuntime(2169):at 
                     java.util.ArrayList.get(ArrayList.java:341)

ListActivity类:STSBankDetailsListingScreenActivity.java

 public class STSBankDetailsListingScreenActivity extends ListActivity implements Runnable {

// All my Declarations are here....

   .....….....................
…....................
        …..................

private STSAddClientBankDetailsListingScreenAdapter mBankDetailsAdapter = null;


@Override
public void onCreate(Bundle savedInstanceState) {
    Log.i(TAG, "onCreate");
    super.onCreate(savedInstanceState);
    …......................
    ….....................
    // Set the activity content from the XML resource
    setContentView(R.layout.XXX);

    …....................
    …....................

    // Set the typeface with the specified font
    ….......................................................
    …........................................................
    // Initializing the progress dialog to show the loading status
    mProgressDialog = ProgressDialog.show(this,"Loading....","Please wait");


    // Capture the widgets that are defined in the XML resource
    mBack = (Button) findViewById(R.id.backButton);

    …................................
    …...............................
    // Setting the custom fonts & Text
    …...............................
    …..............................

    // Create a Thread for long running operations
    mThread = new Thread(STSBankDetailsListingScreenActivity.this);
    mThread.start();

    // Instantiate the listview adapter class
    mBankDetailsAdapter = new  STSAddClientBankDetailsListingScreenAdapter(this);

    // Adding the listners for the items in the listview
    getListView().setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    mDetailsHolder = new ArrayList<String>();
    mDetailsHolder.add(STSURLConstants.AUTH_KEY);
    mDetailsHolder.add(mBankICode.get(position).toString());
    mDetailsHolder.add(mUserTypeHolder.get(position).toString());
    mDetailsHolder.add(mAccountNameHolder.get(position).toString());
    mDetailsHolder.add(mBankCodeHolder.get(position).toString());
    mDetailsHolder.add(mBankNameHolder.get(position).toString());
    mDetailsHolder.add(mBankAddressHolder.get(position).toString());
    mDetailsHolder.add(mOpeningBalanceHolder.get(position).toString());
    mDetailsHolder.add(mAmtInHolder.get(position).toString());

    }

    });
}

@Override
protected void onStart() {
    Log.i(TAG, "onStart");
    super.onStart();
}

@Override
protected void onRestart() {
    Log.i(TAG, "onRestart");
// Show the Progress Dialog 
mProgressDialog = ProgressDialog.show(STSBankDetailsListingScreenActivity.this,     "Loading...", "Please wait");
// Create a Thread for long running operations
    mThread = new Thread(STSBankDetailsListingScreenActivity.this);
    mThread.start();
    super.onRestart();
}

@Override
protected void onPause() {
    Log.i(TAG, "onPause");
    super.onPause();
}

@Override
protected void onResume() {
    Log.i(TAG, "onResume");
    //updateUI();
    super.onResume();
}

@Override
protected void onStop() {
    Log.i(TAG, "onStop");
    super.onStop();
}

@Override
protected void onDestroy() {
    Log.i(TAG, "onDestroy");
    if(mThread != null) {
        Thread dummyThread = mThread;
        mThread = null;
           // Post an interrupt request to this thread
        dummyThread.interrupt(); 
    }
    super.onDestroy();
}

@Override
public void run() {
    // TODO Auto-generated method stub
    try {
        // Clear the arraylist before adding up the entries
        mBankNameHolder.clear(); 
        ….............................

        // Instantiate the class 
        mWSConsumer = new STSWebServiceConsumer();
        // Call to fetch the bank details from the service
        mSTSSelectBankAccountList = mWSConsumer.SelectBankAccountDetails();

// Do the necessary actions to pull the values from the list
for(STSSelectBankAccountDetails s : mSTSSelectBankAccountList) {
// Populate the list....
mBankNameHolder.add(String.valueOf(s.getmBaBankName().toString()));
…..............................
…..............................
}
} else { Log.i(TAG, "Something went wrong !"); }
        } catch(Exception err) {
        err.printStackTrace();
    } 
    handler.sendEmptyMessage(0);  }

private void updateUI() {
Log.i(TAG, "updateUI");
runOnUiThread(new Runnable() {
    @Override
    public void run() {
    try {
    // Set the data behind the list view
 mBankDetailsAdapter = new  STSAddClientBankDetailsListingScreenAdapter(STSBankDetailsListingScreenActivity.this,           mBankNameHolder, mAccountNameHolder, mIsCheckedHolder);
    getListView().setAdapter(mBankDetailsAdapter);
    // Notifies the attached view that the underlying data has been changed
    mBankDetailsAdapter.notifyDataSetChanged();
    } catch(Exception err) {
        err.printStackTrace();      }
        }
        });
    }

public Handler handler = new Handler() {

    @Override
    public void handleMessage(Message msg) {

        switch (msg.what) {
        case 0:
            // Do Nothing...
            break;
        case 1:
            // Calls the run method of the runnable object
            mThread.run();
            break;
        default:
            break;
        }
        // Update the UI
        updateUI();

        // Dismiss the progress dialog once done
        if(mProgressDialog.isShowing()) {
            mProgressDialog.dismiss();
            //mQuickAction.dismiss();
        }
    }
};

}

适配器类:STSAddClientBankDetailsListingScreenAdapter.java

public class STSAddClientBankDetailsListingScreenAdapter extends
    BaseAdapter {
// Declare all the needed
private Activity mActivity = null;
private List<String> mBankNameHolder = new ArrayList<String>();
private List<String> mAccountNameHolder = new ArrayList<String>();
private List<String> mIsChecked = new ArrayList<String>();

private static final String TAG = STSAddClientBankDetailsListingScreenAdapter.class.getSimpleName();
private static LayoutInflater mLayoutInflater = null; // This class is responsible for instantiating the layout XML file in to its corresponding view objects

public STSAddClientBankDetailsListingScreenAdapter(Context context) {
    // Obtains the layout interface from the given context
    mLayoutInflater = LayoutInflater.from(context);
}

public STSAddClientBankDetailsListingScreenAdapter(Activity activity, List<String> bankName, List<String> accountName, List<String> isChecked) {
    mActivity = activity;
    mBankNameHolder = bankName;
    mAccountNameHolder = accountName;
    mIsChecked = isChecked;
}
/* (non-Javadoc)
 * @see android.widget.Adapter#getCount()
 */
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return mBankNameHolder.size();
}

/* (non-Javadoc)
 * @see android.widget.Adapter#getItem(int)
 */
@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return position;
}

/* (non-Javadoc)
 * @see android.widget.Adapter#getItemId(int)
 */
@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

/* (non-Javadoc)
 * @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup)
 */
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ViewHolder viewHolder;
    if(convertView == null) {
        convertView = mLayoutInflater.inflate(R.layout.profile_client_bank_details_listing_item, null);
        viewHolder = new ViewHolder();
        // Capture the widgets defined in the XML resource
        viewHolder.mBankName = (TextView) convertView.findViewById(R.id.message01);
        viewHolder.mAccountName = (TextView) convertView.findViewById(R.id.message02);
        viewHolder.mChecked = (ImageView) convertView.findViewById(R.id.image01);
        convertView.setTag(viewHolder); // Set the tag associated with this view
     } else {
         viewHolder = (ViewHolder) convertView.getTag(); // Returns the view tag
         }
    // Bind the controls with the resource
    viewHolder.mBankName.setText(mBankNameHolder.get(position).toString());
    viewHolder.mAccountName.setText(mAccountNameHolder.get(position).toString());
    // Set the tick mark according to the values
    boolean checked = Boolean.parseBoolean(mIsChecked.get(position).toString());
    if(checked) {
        viewHolder.mChecked.setVisibility(View.VISIBLE);
    } else {
        viewHolder.mChecked.setVisibility(View.INVISIBLE);
    }
    return convertView;
}

static class ViewHolder {
    TextView mBankName, mAccountName;
    ImageView mChecked;
}

}

请高度赞赏任何形式的帮助。

再次感谢你......

1 个答案:

答案 0 :(得分:0)

我强烈感受到的是你的适配器方法 -     getCount() 在特定情况下给出错误的输出。我建议不要从mBankNameHolder取一些其他参数的大小,或者在每种情况下用log / debug检查这个值。

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