2015-08-21 1 views
0

Я много искал через SO, несколько потоков говорят о проблеме. Но никто на самом деле не помог, я заполнил адаптер данными, и теперь я хотел бы удалить строку с выделенной кнопкой в ​​каждой строке, в одном из потоков было предложено: написать onClickListener в методе getView() адаптера , Когда я попробовал это, возникло исключение IndexOutOfBound. Точнее, когда я нажал кнопку удаления в первой строке, ничего не произошло, но во второй и последней строке нажатие кнопки удаления дало исключениеудаление строки в ListView, IndexOutOfBound Exception

вот что я пытался сделать, студия Android предложила, чтобы переменная положения должно быть окончательным:

public class TimeTrackerAdapter extends BaseAdapter { 
    public ArrayList<TimeRecord> times=new ArrayList<TimeRecord>(); 
    @Override 
    public int getCount() { 
     return times.size(); 
    } 

    public TimeTrackerAdapter() 
    { 
     times.add(new TimeRecord("12:30","this is the best")); 
     times.add(new TimeRecord("2:30","I need this")); 
    } 
    @Override 
    public Object getItem(int position) { 
     return times.get(position); 
    } 

    public void addTimeRecord(TimeRecord timeRecord) 
    { 
     times.add(timeRecord); 
    } 
    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(final int position, View view, ViewGroup parent) { 
     if(view==null) { 
      LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
      view = inflater.inflate(R.layout.menu_layout, parent, false); 
     } 
     Button button=(Button) view.findViewById(R.id.delete_entry); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       times.remove(position); 
      } 
     }); 
     TextView timeView=(TextView) view.findViewById(R.id.time_textView); 
     TextView noteView=(TextView) view.findViewById(R.id.note_TextView); 
     TimeRecord time=times.get(position); 
     timeView.setText(time.getTime()); 
     noteView.setText(time.getNote()); 
     return view; 
    } 
} 

и вот стек ошибка:

08-21 10:47:20.330 20400-20400/com.example.sam.myapplication E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.example.sam.myapplication, PID: 20400 
java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
     at java.util.ArrayList.remove(ArrayList.java:403) 
     at com.example.sam.myapplication.TimeTrackerAdapter$1.onClick(TimeTrackerAdapter.java:55) 
     at android.view.View.performClick(View.java:4508) 
     at android.view.View$PerformClick.run(View.java:18675) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5584) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
     at dalvik.system.NativeStart.main(Native Method) 
+1

просто удалить элементы из вашего ArrayList и обновить ListView – Dev

+0

@Codebender, если я не ошибаюсь, вы метод notifyDataSetChange(), но как я могу вызвать метод? Я не могу создать экземпляр другого объекта в методе onClick? –

+0

Попробуйте вызвать 'TimeTrackerAdapter.this.notifyDataSetChanged();' – Codebender

ответ

2

Вам нужно добавить notifyDataSetChanged() в вашей кнопки OnClick метод

 Button button=(Button) view.findViewById(R.id.delete_entry); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       times.remove(position); 
       notifyDataSetChanged(); 
      } 
     }); 
1

вы должны позвонить notifyDataSetChanged всякий раз, когда вы добавляете/удаляете элемент. Вот фрагмент кода

public class TimeTrackerAdapter extends BaseAdapter { 
    public ArrayList<TimeRecord> times=new ArrayList<TimeRecord>(); 
    @Override 
    public int getCount() { 
     return times.size(); 
    } 

    public TimeTrackerAdapter() 
    { 
     times.add(new TimeRecord("12:30","this is the best")); 
     times.add(new TimeRecord("2:30","I need this")); 
    } 
    @Override 
    public Object getItem(int position) { 
     return times.get(position); 
    } 

    public void addTimeRecord(TimeRecord timeRecord) 
    { 
     times.add(timeRecord); 
     notifyDataSetChanged(); 
    } 
    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(final int position, View view, ViewGroup parent) { 
     if(view==null) { 
      LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
      view = inflater.inflate(R.layout.menu_layout, parent, false); 
     } 
     Button button=(Button) view.findViewById(R.id.delete_entry); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       times.remove(position); 
       notifyDataSetChanged(); 
      } 
     }); 
     TextView timeView=(TextView) view.findViewById(R.id.time_textView); 
     TextView noteView=(TextView) view.findViewById(R.id.note_TextView); 
     TimeRecord time=times.get(position); 
     timeView.setText(time.getTime()); 
     noteView.setText(time.getNote()); 
     return view; 
    } 
} 
Смежные вопросы