2016-07-24 1 views
-1

私はアンドロイドの開発が初めてです。私はボタンのクリックで更新されるarrayadapterを持っています。 adModelsList、adModelsList_SJ、adModelsList_SD、adModelsList_MJの4つの配列リストがあります。アレイリストに7つ以上の項目がある場合は、ビューが更新されます。リストに7個未満のアイテムがある場合、クラッシュします。私は何を間違えているのですか?ここでリスト<array>が7個未満のアイテムを持つ場合、ArrayAdapterはnotifyDataSetChangedでエラーをスローします

はarrayadapterです:

public class AdAdapter extends ArrayAdapter{ 

    private List<AdModels> adModelsList; 
    private int resource; 
    private LayoutInflater inflater; 

    public AdAdapter(Context context, int resource, List<AdModels> objects) { 
     super(context, resource, objects); 
     this.resource = resource; 
     adModelsList = objects; 
     inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
    } 

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

     ViewHolder holder = null; 
     sjBtn = (Button) findViewById(R.id.sjBtn); 
     sdBtn = (Button) findViewById(R.id.sdBtn); 
     mjBtn = (Button) findViewById(R.id.mjBtn); 

      if (convertView == null) { 
       holder = new ViewHolder(); 
       convertView = inflater.inflate(resource, null); 
       holder.overskrift = (TextView) convertView.findViewById(R.id.adoverskrift); 
       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      holder.overskrift.setText(adModelsList.get(position).getOverskrift()); 

       sjBtn.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         adModelsList = adModelsList_SJ; 
         ((AdAdapter) lvAds.getAdapter()).notifyDataSetChanged(); 
        } 
       }); 

       sdBtn.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         adModelsList = adModelsList_SD; 
         ((AdAdapter) lvAds.getAdapter()).notifyDataSetChanged(); 
        } 
       }); 

       mjBtn.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
          adModelsList = adModelsList_MJ; 
         ((AdAdapter) lvAds.getAdapter()).notifyDataSetChanged(); 
        } 
       }); 

       lvAds.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
        @Override 
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
         AdModels admodel = adModelsList.get(position); 
         Intent intent = new Intent(MainActivity.this, MapsActivity.class); 
         intent.putExtra("adInfo", new Gson().toJson(admodel)); 
         startActivity(intent); 
        } 
       }); 


      return convertView; 
    } 
    class ViewHolder{ 
     private TextView overskrift; 
    } 
} 

エラーログ:

Process: dk.forsoegsperson.fp, PID: 12603 
    java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2 
    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
    at java.util.ArrayList.get(ArrayList.java:308) 
    at dk.forsoegsperson.fp.MainActivity$AdAdapter.getView(MainActivity.java:261) 
    at android.widget.AbsListView.obtainView(AbsListView.java:2346) 
    at android.widget.ListView.makeAndAddView(ListView.java:1875) 
    at android.widget.ListView.fillDown(ListView.java:702) 
    at android.widget.ListView.fillSpecific(ListView.java:1366) 
    at android.widget.ListView.layoutChildren(ListView.java:1662) 
    at android.widget.AbsListView.onLayout(AbsListView.java:2148) 
    at android.view.View.layout(View.java:16630) 
    at android.view.ViewGroup.layout(ViewGroup.java:5437) 
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743) 
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586) 
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1495) 
    at android.view.View.layout(View.java:16630) 
    at android.view.ViewGroup.layout(ViewGroup.java:5437) 
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
    at android.view.View.layout(View.java:16630) 
    at android.view.ViewGroup.layout(ViewGroup.java:5437) 
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743) 
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586) 
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1495) 
    at android.view.View.layout(View.java:16630) 
    at android.view.ViewGroup.layout(ViewGroup.java:5437) 
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
    at android.view.View.layout(View.java:16630) 
    at android.view.ViewGroup.layout(ViewGroup.java:5437) 
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743) 
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586) 
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1495) 
    at android.view.View.layout(View.java:16630) 
    at android.view.ViewGroup.layout(ViewGroup.java:5437) 
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
    at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678) 
    at android.view.View.layout(View.java:16630) 
    at android.view.ViewGroup.layout(ViewGroup.java:5437) 
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2171) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1931) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
    at android.view.Choreographer.doFrame(Choreographer.java:606) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

編集コード

答えて

0

したがって、アレイをクリアするたびに新しいアレイを導入していたので、新しいリストを追加してadapterarrayとアダプタを設定します。これはトリックでした。返信用

xxBtn.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        adModelsList = adModelsList_SD; 
        ((AdAdapter) lvAds.getAdapter()).clear(); 
        ((AdAdapter) lvAds.getAdapter()).addAll(adModelsList); 
        ((AdAdapter) lvAds.getAdapter()).notifyDataSetChanged(); 
        lvAds.setAdapter(AdAdapter.this); 
       } 
      }); 
0

あなたは、このための間違った振る舞いを持っている簡体字:

if (cor_count > 0) { 
    convertView = null; 
} 
else { 
    cor_count = adModelsList.size(); 
} 

アダプタのadModelsListを更新した後、cor_count変数が新しいサイズに正しく更新されない

+0

ありがとう:ここ

はコードです。私はリサイクラーを空にしようとしました。 if文がない場合、adModelslist.sizeがonClick(getviewでビューに表示される行の量)で7未満になると、アプリケーションがクラッシュします。また、cor_countは更新時に正しい量の変数を取得します。 – user1378824

関連する問題