Arrayindexoutofboundsexception ArrayList customListView

问题描述:

我有一个关于我在android中的customListview的问题。我正在尝试使用onclick事件(tv.setOnClickListener)在列表中动态地添加内容,我使用geter和seter方法存储我的数据,我有我的custome国家班。 问题:当我动态新的内容和下滚添加到列表的末尾,我得到ArrayindexoutofboundexceptionArrayindexoutofboundsexception ArrayList customListView

plz帮助

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; 

    } 
    } 
} 

我看到的问题。在您的getView方法中,您可以参考countryList。您有两个countryList变量:PostList类中的一个,以及MyCustomAdapter类中的一个。您参考的是MyCustomerAdapter类中的一个,它不是由适配器支持的数据,而是。让您的Country对象这样的getView方法中:

Country country = (Country) getItem(position); 
+0

非常棒的男人....谢谢你是天才.... :-) – Nik 2013-02-24 03:42:44

这是你的for循环。在动态添加信息之前,您必须先初始化它。然后,初始化它,然后在for循环内部使用类方法添加该信息。应该解决你的问题。