2 ssummeraw ssummeraw 于 2013.05.22 10:12 提问

Arrayindexoutofboundsexception 异常

这个问题是关于android中customListview 的。我想使用onclick事件(tv.setOnClickListener)在list中动态的添加内容。我有自定义的country类使用geter and seter 方法来储存数据。当我动态的添加新的内容,然后滚动到list的底部时,获取 Arrayindexoutofboundexception 异常。

public class PosterList extends Activity 
   {
 MyCustomAdapter dataAdapter = null;
ArrayList<Country> countryList = new ArrayList<Country>();
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.posterlist);
            //Click on textview to add element in contrylist
    tv = (TextView) findViewById(R.id.myFilter);
    tv.setOnClickListener(new View.OnClickListener() 
    {
            public void onClick(View v) 
            {
                Country country = new Country("df","df","df","m");
                countryList.add(country);      
                dataAdapter.notifyDataSetChanged();
            }
    });
    displayListView();
}
private void displayListView() 
{
            //Parse my JSON and store it in to different arrays

    for(int k=0;k<len;k++)
    {
        Country country = new Country(subcategory[k],caseid[k],time[k],newpost[k]);
        countryList.add(country);
    }
    dataAdapter = new MyCustomAdapter(this,R.layout.country_info, countryList);
    ListView listView = (ListView) findViewById(R.id.listView1);
    listView.setAdapter(dataAdapter);
    listView.setOnItemClickListener(new OnItemClickListener()
    {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) 
        {
                Country country = (Country) parent.getItemAtPosition(position);
                Toast.makeText(getApplicationContext(),
                country.getContinent(), Toast.LENGTH_SHORT).show();
        }
    });
}
private class MyCustomAdapter extends ArrayAdapter<Country> 
{
    private ArrayList<Country> originalList;
    private ArrayList<Country> countryList;

    public MyCustomAdapter(Context context, int textViewResourceId, 
        ArrayList<Country> countryList) {
    super(context, textViewResourceId, countryList);
    this.countryList = new ArrayList<Country>();
    this.countryList.addAll(countryList);
    this.originalList = new ArrayList<Country>();
    this.originalList.addAll(countryList);
}
private class ViewHolder 
{
    TextView code;
    TextView name;
    TextView continent;
    TextView region;
 }
@Override
public View getView(int position, View convertView, ViewGroup parent) 
{
    ViewHolder holder = null;
    Log.v("ConvertView", String.valueOf(position));
    if (convertView == null) 
    {
        LayoutInflater vi = (LayoutInflater)getSystemService(
            Context.LAYOUT_INFLATER_SERVICE);
        convertView = vi.inflate(R.layout.country_info, null);
        holder = new ViewHolder();
        holder.code = (TextView) convertView.findViewById(R.id.code);
        holder.name = (TextView) convertView.findViewById(R.id.name);
        holder.continent = (TextView) convertView.findViewById(R.id.continent);
        holder.region = (TextView) convertView.findViewById(R.id.region);
        convertView.setTag(holder);
    } 
    else
     {
            holder = (ViewHolder) convertView.getTag();
     }
    Country country = countryList.get(position);
    holder.code.setText(country.getCode());
    holder.name.setText(country.getName());
    holder.continent.setText(country.getContinent());
    holder.region.setText(country.getRegion());
    return convertView;
  }
   }
}

3个回答

curie_87
curie_87   2013.05.22 17:19
已采纳

在你的 getView 方法中,你提到 countryList,有两个 countryList 变量:一个是在 PostList 类中,一个是在 MyCustomAdapter 类中。你提及到的那个是在 MyCustomerAdapter 类中,没有适配器支持数据。在 getView 方法获取 Country 对象:

Country country = (Country) getItem(position);
u010791568
u010791568   2013.05.22 10:53
            holder = (ViewHolder) convertView.getTag();
     }
    Country country = countryList.get(position);
    holder.code.setText(country.getCode());
    holder.name.setText(country.getName());
    holder.continent.setText(country.getContinent());
    holder.region.setText(country.getRegion());
    return convertView;
  }
   }
}

android

luhuajcdd
luhuajcdd   2013.05.22 12:59
if(position <=   countryList.size()){   
Country country = countryList.get(position);
        holder.code.setText(country.getCode());
        holder.name.setText(country.getName());
        holder.continent.setText(country.getContinent());
        holder.region.setText(country.getRegion());
        return convertView;
}
return null ;
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!