2015-02-06 3 views
0

У меня есть небольшое приложение, которое показывает текущие Золотые и серебряные цены. Я приложил небольшой снимок экрана приложения. Он обновляет два элемента панели действий и настройки. Когда я нажимаю кнопку обновления, мне нужно получить текущие цены на золото. Я получаю обновленные цены в течение некоторого времени, но через некоторое время он выходит из строя с превышением ошибки.Ошибка ArrayList: java.lang.IndexOutOfBoundsException: Недействительный индекс 26, размер 26

Я использую библиотеку JSOUP для извлечения данных из банка UOB.

http://s23.postimg.org/580ofx68b/UOBGoldand_Silver.jpg

Журнал ошибок:

2779-2779/com.example.coherendz.uobgoldandsilver E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.IndexOutOfBoundsException: Invalid index 26, size is 26 
      at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
      at java.util.ArrayList.get(ArrayList.java:308) 
      at com.example.coherendz.uobgoldandsilver.ListViewAdapter.getView(ListViewAdapter.java:68) 
      at android.widget.AbsListView.obtainView(AbsListView.java:2161) 
      at android.widget.ListView.makeAndAddView(ListView.java:1840) 
      at android.widget.ListView.fillDown(ListView.java:675) 
      at android.widget.ListView.fillGap(ListView.java:639) 
      at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4970) 
      at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4127) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
      at android.view.Choreographer.doFrame(Choreographer.java:531) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
      at android.os.Handler.handleCallback(Handler.java:730) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:5103) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:525) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
      at dalvik.system.NativeStart.main(Native Method) 

Я отправляю мой код ниже:

MainActivity.java

package com.example.coherendz.uobgoldandsilver; 

import android.content.Intent; 
import android.os.AsyncTask; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 

import java.io.IOException; 
import java.util.ArrayList; 


public class MainActivity extends ActionBarActivity { 

    ListView listview; 
    ListViewAdapter adapter; 
    String cadena; 

    private final String siteUrl = "https://uniservices1.uobgroup.com/secure/online_rates/gold_and_silver_prices.jsp"; 

    private static String TAG = MainActivity.class.getSimpleName(); 

    private TextView txtResponse; 
    private Document doc; 
    ArrayList<String> arr_linkText= new ArrayList<String>(); 
    private ArrayList names,currency,weight,Buy,Sell; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     txtResponse = (TextView) findViewById(R.id.txtResponse); 

     (new ParseURL()).execute(new String[]{siteUrl}); 

    } 

    private class ParseURL extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 

      try 

      { 
       doc = Jsoup.connect(siteUrl).get(); 
       String title = doc.title(); 
       Log.i(TAG, title); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 


      names = Values(0); 
      currency = Values(1); 
      weight = Values(2); 
      Buy = Values(3); 
      Sell = Values(4); 

      for (Element table : doc.select("table")) { 
       for (Element row : table.select("tr.roll2,tr.roll1")) { 
        Elements column = row.select("td"); 
        cadena = column.text(); 
        cadena += "\n"; 
        arr_linkText.add(cadena); 
        Log.i(TAG, cadena); 
       } 
      } 

      return arr_linkText.toString(); 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      listview = (ListView) findViewById(R.id.listView); 
      // Pass the results into ListViewAdapter.java 
      adapter = new ListViewAdapter(arr_linkText,names,currency,weight,Buy,Sell,MainActivity.this); 
      // Set the adapter to the ListView 
      listview.setAdapter(adapter); 
     } 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu_settings; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) 
     { 
      Toast.makeText(MainActivity.this, "Settings Selected", Toast.LENGTH_LONG).show(); 
      Intent i = new Intent(this,Settings.class); 
      startActivity(i); 
     } 

     else if(id == R.id.action_refresh){ 

      Toast.makeText(MainActivity.this,"Refresh Selected",Toast.LENGTH_LONG).show(); 
      (new ParseURL()).execute(new String[]{siteUrl}); 
     } 


     return super.onOptionsItemSelected(item); 
    } 


    private ArrayList Values(int i) { 

     ArrayList Temparray = new ArrayList(); 

     for (Element table : doc.select("table")) { 
      for (Element row : table.select("tr.roll2,tr.roll1")) { 
       Elements column = row.select("td"); 
       cadena = column.get(i).text(); 
       cadena += "\n"; 
       Temparray.add(cadena); 
       //Log.i(TAG, cadena); 
      } 
     } 

     return Temparray; 
    } 
} 

ListViewAdapter.java

package com.example.coherendz.uobgoldandsilver; 

import android.content.Context; 
import android.content.SharedPreferences; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 
import java.util.ArrayList; 



public class ListViewAdapter extends BaseAdapter { 

    ArrayList myList = new ArrayList(); 
    LayoutInflater inflater; 
    Context context; 
    private ArrayList currency,weight,Buy,Sell; 
    ArrayList<String> names= new ArrayList<String>(); 


    public ListViewAdapter(ArrayList myList,ArrayList names,ArrayList currency,ArrayList weight,ArrayList Buy,ArrayList Sell, Context context) { 
     this.myList = myList; 
     this.names = names; 
     this.currency = currency; 
     this.weight = weight; 
     this.Buy = Buy; 
     this.Sell = Sell; 
     this.context = context; 
     inflater = LayoutInflater.from(this.context); 
    } 

    @Override 
    public int getCount() { 
     return myList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return myList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     MyViewHolder mViewHolder=null; 


     if(convertView == null) { 
      convertView = inflater.inflate(R.layout.custom_row, null); 
      mViewHolder = new MyViewHolder(convertView); 
      convertView.setTag(mViewHolder); 
     } else { 
      mViewHolder = (MyViewHolder) convertView.getTag(); 
     } 

     String name="",weig="",buy="",sell=""; 

     name = names.get(position).toString(); 
     weig = weight.get(position).toString(); 
     buy = Buy.get(position).toString(); 
     sell = Sell.get(position).toString(); 


     mViewHolder.tvTitle.setText(name); 
     mViewHolder.tvQty.setText(weig); 
     mViewHolder.tvBuy.setText(buy); 
     mViewHolder.tvSell.setText(sell); 

     loadSavedPreferences(); 

     return convertView; 
    } 

    private void loadSavedPreferences() { 

     SharedPreferences prefs; 
     prefs = context.getSharedPreferences("Checked Values", Context.MODE_PRIVATE); 
     String Arbor = prefs.getString("Arbor", null); 
     String Cast = prefs.getString("Cast", null); 

     if(Arbor!=null&&Cast!=null){ 

      Log.i("SRI",Arbor); 
      Log.i("Kanth",Cast); 

     } 
    } 

    private class MyViewHolder { 
     TextView tvTitle,tvQty,tvBuy,tvSell; 

     MyViewHolder(View v){ 

      tvTitle = (TextView) v.findViewById(R.id.tvName); 
      tvQty = (TextView) v.findViewById(R.id.tvQty); 
      tvBuy = (TextView) v.findViewById(R.id.tvBuy); 
      tvSell = (TextView) v.findViewById(R.id.tvSell); 

     } 

    } 
} 

Любые предложения были бы полезными.

+0

Казалось бы, что ArrayLists вы Переход к адаптеру не имеет одинакового размера. Вы должны проверить это при создании экземпляра адаптера. –

+0

Buy.get (position) .toString(); могу ли я увидеть реализацию функции get (int i)? –

+0

@ MikeM.Yes, они имеют одинаковый размер. – Srikanth86in

ответ

0

список даст вам myList.size() количество записей, но вы используете .get(position) на names и weight, а в адаптерах getView().

Решение 1: Проверьте длину вашего входа в конструкторе и бросить исключение, если входной аргумент names и weight имеют меньшую длину, чем myList.

Решение 2: Пусть getCount() вернуть наименьшую длину массивов, которые вы используете в getView()

Мораль рассказа Никогда не доверяйте свои входы

+0

Решение 2: Работало для меня. Спасибо за предложения. – Srikanth86in

+0

@ Srikanth86in Просто примечание: вы никогда не очищаете ArrayList 'arr_linkText' при обновлении, поэтому он просто продолжает расти. –

+1

@Mike M: Вы правы. Мне пришлось очистить этот массив, и ваше предложение тоже сработало. – Srikanth86in

Смежные вопросы