Почему я получаю ArrayIndexOutOfBoundsException, несмотря на инициализацию массива с размером - PullRequest
0 голосов
/ 12 марта 2012

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

public class MsgAdapter extends BaseAdapter {
public String msgs[]=new String[150];
public Activity context;  
public LayoutInflater inflater;
int count=16;
public MsgAdapter(Activity context,String[] msgs) {  
    super();  

    this.context = context;  
    this.msgs = msgs;  


    this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
} 
public static class ViewHolder  
{  

    TextView msgView;  

ImageView b;
}  
@Override
public int getCount() {
    // TODO Auto-generated method stub
    Log.v("count", ""+msgs.length);
    return msgs.length+16;
}

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

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
      final ViewHolder holder; 

        View v;  

         LayoutInflater inflater =  context.getLayoutInflater(); 
         if(convertView==null){
             convertView = inflater.inflate(R.layout.msg_list, null);
              holder = new ViewHolder();
              holder.msgView=(TextView)convertView.findViewById(R.id.msgtext);
             holder.b=(ImageView)convertView.findViewById(R.id.sms); 
                convertView.setTag(holder);  
         }
         else  
            {
                holder=(ViewHolder)convertView.getTag();  

             }  
         holder.b.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent sendIntent = new Intent(Intent.ACTION_VIEW);
                sendIntent.putExtra("sms_body",     holder.msgView.getText().toString());
                sendIntent.setType("vnd.android-dir/mms-sms");
            v.getContext().startActivity(sendIntent);       
            }
        });

        holder.msgView.setText(msgs[position]);//the exception occurs here
return convertView; 
}
}

Ответы [ 3 ]

0 голосов
/ 12 марта 2012

В getCount() методе вы возвращаете размер списка msgs.length+16. Поэтому getView() метод адаптера будет вызываться больше, чем значение msgs.length и эта строка

holder.msgView.setText(msgs[position]);

сгенерирует исключение, когда значение позиции больше или равно msgs.length.

0 голосов
/ 12 марта 2012

исключение, скорее всего, в строке:

holder.msgView.setText (msgs [position]);

и его возвращаемое значение getCount равно msg.length + 18но массив msg по-прежнему имеет длину msg.length, надеюсь, его значение nw

0 голосов
/ 12 марта 2012

Я предлагаю вам использовать ArrayList<String> msg вместо String []msg, потому что размер ArrayList может динамически увеличиваться и уменьшаться.

Есть еще одна ошибка (может быть.)

Вы инициализируете свой массив в MsgAdapter следующим образом.

public String msgs[]=new String[150];

, и теперь вы устанавливаете другой массив String на msgs снова здесь.

public MsgAdapter(Activity context,String[] msgs) {  
    ... 
    this.msgs = msgs;
    ...
} 
...