2

Я работаю над приложением, которое содержит пользовательский ListView с кнопкой удаления, которую я обновляю из основного действия.Неверная строка удалена из пользовательского списка с помощью spinner

У меня проблема с удалением строки из ListView, хотя я удаляю правильный индекс из представления пользовательского списка и вызываю метод notifyDataChanged(), графический интерфейс не обновляется корректно.

Здесь я написал пример проекта, как мой реальный в идее как раз больше образца:

  • activity_main.xml (основной макет) содержит ListView только под названием ListView.
  • listview_row.xml содержит два спиннера (название и класс ученика), установку и удаление кнопки и текстового вида.
  • класс Student содержит две переменные: имя (String) и класс (Int)

MainActivity.java:

public class MainActivity extends Activity { 
    ListView listView; 
    listviewAdapter adapter; 
    ArrayList<Student> students = new ArrayList<>(); 

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

     String[] names = new String[]{"Tom", "Ben", "Gil", "Adam", "Moshe", "Adi", "Michael", "Yasmin", "Jessica", "Caroline", "Avi", "Yael"}; 

     students.add(new Student()); 
     students.add(new Student()); 
     students.add(new Student()); 

     adapter = new listviewAdapter(this, students, names); 
     listView = (ListView) findViewById(R.id.listView); 
     listView.setAdapter(adapter); 

    } 

    public void updateStatus(int position) 
    { 
     View convertView = listView.getChildAt(position - listView.getFirstVisiblePosition()); 
     TextView tvValue = (TextView) convertView.findViewById(R.id.tv_Value); 
     Spinner spName = (Spinner) convertView.findViewById(R.id.spNames); 
     Spinner spGrade = (Spinner) convertView.findViewById(R.id.spGrades); 

     tvValue.setText(spName.getSelectedItem().toString() + " got " + spGrade.getSelectedItem().toString()); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == R.id.action_Add) 
     { 
      students.add(new Student()); 
      adapter.notifyDataSetChanged(); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

listviewAdapter.java

public class listviewAdapter extends BaseAdapter 
{ 
    public Activity context; 
    public LayoutInflater inflater; 

    private ArrayList<Student> studentID; 
    private String[] studentsNames; 

    public listviewAdapter(Activity context, ArrayList<Student> students, String[] names) 
    { 
     super(); 
     studentID = students; 
     studentsNames = names; 

     this.context = context; 
     this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

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

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


    @Override 
    public int getViewTypeCount() { 
     return studentID.size() + 1; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return position; 
    } 

    public class ViewHolder { 
     Spinner spNames, spGrades; 
     TextView tvValue; 
     Button btnSet, btnRemove; 
    } 

    @Override 
    public View getView(int i, View view, final ViewGroup viewGroup) 
    { 
     final ViewHolder holder; 
     if (view == null) { 
      holder = new ViewHolder(); 
      view = inflater.inflate(R.layout.listview_row, null); 

      holder.spNames = (Spinner) view.findViewById(R.id.spNames); 
      holder.spGrades = (Spinner) view.findViewById(R.id.spGrades); 
      holder.tvValue = (TextView) view.findViewById(R.id.tv_Value); 
      holder.btnSet = (Button) view.findViewById(R.id.btn_setValue); 
      holder.btnRemove = (Button) view.findViewById(R.id.btn_Remove); 
      view.setTag(holder); 
      holder.spNames.setTag(0); 
      holder.spGrades.setTag(0); 
     } 
     else{ 
      holder = (ViewHolder) view.getTag(); 
     } 

     // pop spinner names 
     ArrayAdapter<String> studentsNamesAdapater = new ArrayAdapter<> 
       (view.getContext(), android.R.layout.simple_spinner_dropdown_item, studentsNames); 
     studentsNamesAdapater.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     holder.spNames.setAdapter(studentsNamesAdapater); 

     // pop spinner grades 
     String[] grades = new String[101]; 
     for (int grade = 0; grade < 101; grade++) 
      grades[grade] = String.valueOf(grade); 

     final ArrayAdapter<String> studentsGradesAdapter = new ArrayAdapter<> 
       (view.getContext(), android.R.layout.simple_spinner_dropdown_item, grades); 
     studentsGradesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     holder.spGrades.setAdapter(studentsGradesAdapter); 


     // select the right spNames index 
     holder.spNames.setSelection((Integer) holder.spNames.getTag()); 
     // saving spinner index 
     holder.spNames.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       holder.spNames.setTag(position); 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 

      } 
     }); 

     // select the right spGrades index 
     holder.spGrades.setSelection((Integer) holder.spGrades.getTag()); 
     // saving spinner index 
     holder.spGrades.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       holder.spGrades.setTag(position); 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 

      } 
     }); 

     // set (variable and textview) 
     holder.btnSet.setTag(i); 
     holder.btnSet.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // update studentID 
       int position = (Integer) v.getTag(); 
       Student tmp = new Student(holder.spNames.getSelectedItem().toString(), Integer.valueOf(holder.spGrades.getSelectedItem().toString())); 
       studentID.set(position, tmp); 
       ((MainActivity) context).updateStatus(position); 
      } 
     }); 


     // remove row 
     holder.btnRemove.setTag(i); 
     holder.btnRemove.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int position = (Integer) v.getTag(); 
       studentID.remove(position); 
       //notifyDataSetChanged(); 
       ((MainActivity) context).adapter.notifyDataSetChanged(); 

       // for debug 
       String dStatus = "Vector size: " + studentID.size() + "\n"; 
       for (int index = 0; index < studentID.size(); index++) 
        dStatus += studentID.get(index).name + " " + studentID.get(index).grade + "\n"; 
       Toast.makeText(v.getContext(), dStatus, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     return view; 
    } 
} 

Мои проблема заключается в том, что графический интерфейс не обновляется корректно, удаленный элемент на графическом интерфейсе

enter image description here

Может кто-то наставит меня, пожалуйста, о том, как удалить правый ряд и с графическим интерфейсом: плохо на экране, как вы можете увидеть ниже появится?

EDIT

  1. Я обновить ListView адаптер и использовать теги, как вы ответите мне, не работает.
  2. Я также нашел странную проблему, когда я пытаюсь добавить к Студенту после удаления. По какой-то причине он «помнит» последнего ученика и возвращает ему полные данные, как вы можете видеть на картинке обновления.

EDIT2

В случае, если кто-то хочет попробовать, я добавляю Student класса и XML-источники:

Student.java

public class Student 
{ 
    public String name; 
    public int grade; 

    public Student() 
    { 
     name = ""; 
     grade = 0; 
    } 

    public Student(String _name, int _grade) 
    { 
     name = _name; 
     grade = _grade; 
    } 
} 

activity_main .xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity"> 

    <ListView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/listView" 
     android:layout_gravity="center_horizontal" 
     android:dividerHeight="2dp" /> 
</LinearLayout> 

listview_row.XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#c4e0ff"> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <Spinner 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/spNames" /> 

     <Spinner 
      android:layout_width="100dp" 
      android:layout_height="wrap_content" 
      android:id="@+id/spGrades" 
      android:layout_marginLeft="10dp" /> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Set Value" 
      android:id="@+id/btn_setValue" /> 
    </LinearLayout> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:text="Medium Text" 
      android:id="@+id/tv_Value" /> 

     <Button 
      style="?android:attr/buttonStyleSmall" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Remove" 
      android:id="@+id/btn_Remove" 
      android:layout_marginLeft="30dp" /> 

    </LinearLayout> 

</LinearLayout> 
+0

http://stackoverflow.com/questions/31666797/ как-кан-я-зор-бу tton-clicklistener-in-to-list-view-to-work-like-onitemclickliste/31667622 # 31667622 – kId

ответ

3

Проблема с

holder.spNames.setTag(position); 

и

holder.spNames.setSelection((Integer) holder.spNames.getTag()); 

Как вы настраиваете тег для имени в "onItemSelected()". Когда вы удаляете элемент, вы удаляете элемент из списка учеников, , но как насчет тега.

Допустим, вы удалили этот пункт на 0.

Теперь, когда «notifyDataSetChanged()», называется она будет заселить ListView на основе данных доступна. Теперь здесь

else{ 
     holder = (ViewHolder) view.getTag(); 
    } 

получает вызов. Когда i = 0 в getView() вы получите представление индекса «0-го» предыдущего заполненного списка. Следовательно, «(Integer) holder.spNames.getTag()» указывает на предыдущий тег (т. Е. 0 предыдущего списка). Это может быть причиной проблемы.

Я отправляю обновленный код

listviewAdapter

public class ListviewAdapter extends BaseAdapter 
{ 
public Activity context; 
public LayoutInflater inflater; 
private ArrayList<Student> studentID; 
private String[] studentsNames; 
private boolean isDeleted; 
public ListviewAdapter(Activity context, ArrayList<Student> students, String[] names) 
{ 
    super(); 
    studentID = students; 
    studentsNames = names; 

    this.context = context; 
    this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

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

@Override 
public Student getItem(int position) { 
    return studentID.get(position); 
} 

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




public class ViewHolder { 
    Spinner spNames, spGrades; 
    TextView tvValue; 
    Button btnSet, btnRemove; 
    int index; 
} 

@Override 
public View getView(int i, View view, final ViewGroup viewGroup) 
{ 
    final ViewHolder holder; 
    if (view == null) { 
     holder = new ViewHolder(); 
     view = inflater.inflate(R.layout.listview_row, null); 

     holder.spNames = (Spinner) view.findViewById(R.id.spNames); 
     holder.spGrades = (Spinner) view.findViewById(R.id.spGrades); 
     holder.tvValue = (TextView) view.findViewById(R.id.tv_Value); 
     holder.btnSet = (Button) view.findViewById(R.id.btn_setValue); 
     holder.btnRemove = (Button) view.findViewById(R.id.btn_Remove); 
     Log.e("IAM", "CALLED"); 
     view.setTag(holder); 
     //holder.spNames.setTag(0); 
     //holder.spGrades.setTag(0); 
    } 
    else{ 
     holder = (ViewHolder) view.getTag(); 
    } 
    holder.index=i; 
    if(isDeleted){ 
     holder.tvValue.setText(getItem(holder.index).getName()+ " got " + getItem(holder.index).getGrade()); 
      } 
    // pop spinner names 
    ArrayAdapter<String> studentsNamesAdapater = new ArrayAdapter<String> 
      (view.getContext(), android.R.layout.simple_spinner_dropdown_item, studentsNames); 
    studentsNamesAdapater.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    holder.spNames.setAdapter(studentsNamesAdapater); 

    // pop spinner grades 
    String[] grades = new String[101]; 
    for (int grade = 0; grade < 101; grade++) 
     grades[grade] = String.valueOf(grade); 

    final ArrayAdapter<String> studentsGradesAdapter = new ArrayAdapter<String> 
      (view.getContext(), android.R.layout.simple_spinner_dropdown_item, grades); 
    studentsGradesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    holder.spGrades.setAdapter(studentsGradesAdapter); 


    // select the right spNames index 
    //holder.spNames.setSelection((Integer) holder.spNames.getTag()); 
    holder.spNames.setSelection(getItem(holder.index).getNameIndex()); 
    // saving spinner index 
    holder.spNames.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      //holder.spNames.setTag(position); 
      getItem(holder.index).setNameIndex(position); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 

     } 
    }); 

    // select the right spGrades index 
    // holder.spGrades.setSelection((Integer) holder.spGrades.getTag()); 

    holder.spGrades.setSelection(getItem(holder.index).getGrageIndex()); 
    // saving spinner index 
    holder.spGrades.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      // holder.spGrades.setTag(position); 
      getItem(holder.index).setGrageIndex(position); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 

     } 
    }); 

    // set (variable and textview) 
    holder.btnSet.setTag(i); 
    holder.btnSet.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // update studentID 
      //final int position = getRowPosition(v); 
      int position = (Integer) v.getTag(); 
      // Student tmp = new Student(holder.spNames.getSelectedItem().toString(), Integer.valueOf(holder.spGrades.getSelectedItem().toString())); 
      // studentID.set(position, tmp); 
      getItem(position).setName(holder.spNames.getSelectedItem().toString()); 
      getItem(position).setGrade(Integer.valueOf(holder.spGrades.getSelectedItem().toString())); 
      holder.tvValue.setText(getItem(position).getName()+ " got " + getItem(position).getGrade()); 
      //((MainActivity) context).updateStatus(position); 
     } 
    }); 


    // remove row 
    holder.btnRemove.setTag(i); 
    holder.btnRemove.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //final int position = getRowPosition(v); 
      int position = (Integer) v.getTag(); 
      studentID.remove(position); 
      notifyDataSetChanged(); 
      //((MainActivity) context).adapter.notifyDataSetChanged(); 
      isDeleted=true; 
      // for debug 
      String dStatus = "Vector size: " + studentID.size() + "\n"; 
      for (int index = 0; index < studentID.size(); index++) 
       dStatus += studentID.get(index).name + " " + studentID.get(index).grade + "\n"; 
      Toast.makeText(v.getContext(), dStatus, Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    return view; 
} 

public void printS() { 
    for (int i = 0; i <studentID.size(); i++) { 
     Log.e("NAME", ""+studentID.get(i).getName()); 
     Log.e("GRADE", ""+studentID.get(i).getGrade()); 
    } 
} 
} 

и

Student

public class Student { 
public String name; 
public int grade; 
private int nameIndex; 
private int grageIndex; 

public Student() 
{ 
    name = ""; 
    grade = 0; 
} 

public Student(String _name, int _grade) 
{ 
    name = _name; 
    grade = _grade; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public int getGrade() { 
    return grade; 
} 

public void setGrade(int grade) { 
    this.grade = grade; 
} 

public int getNameIndex() { 
    return nameIndex; 
} 

public void setNameIndex(int nameIndex) { 
    this.nameIndex = nameIndex; 
} 

public int getGrageIndex() { 
    return grageIndex; 
} 

public void setGrageIndex(int grageIndex) { 
    this.grageIndex = grageIndex; 
} 
} 
+0

Действительно очень спасибо вам очень очень !!!! Я должен ждать 3 часа, пока я не смогу присудить награду, это придет! Еще раз спасибо!! – AsfK

+0

Кстати, я обнаружил проблему, приложение аварии после добавления 4 студентов, Решение: не переопределять 'getViewTypeCount' и' getItemViewType' – AsfK

+0

@AsfK: удалит из решения. Спасибо за внимание. – avinash

0

вам необходимо установить тег как положение для кнопки каждый раз, когда вы создаете, то внутри OnClick, получить тег, то он вернет вам правильную позицию

внутри GetView

holder.btnRemove = (Button) view.findViewById(R.id.btn_Remove); 
holder.btnRemove.setTag(position); 

, а затем OnClick (View вид)

int position = (Integer) ((Button) view).getTag(); 
//remove item from position, and do the stuff here 

затем попытайтесь удалить предмет с позиции.

alternate solution:

+0

Спасибо. Но я не занимаюсь этой позицией, это правильно, и я удаляю нужного ученика из ArrayList. Просто GUI не обновляется правильно. вы можете видеть это на изображении. – AsfK

0

Изменение:

@Override 
     public View getView(int final position, View view, final ViewGroup viewGroup) 
     { 
      final ViewHolder holder; 
      if (view == null) { 
       holder = new ViewHolder(); 
       view = inflater.inflate(R.layout.listview_row, null); 

       holder.spNames = (Spinner) view.findViewById(R.id.spNames); 
       holder.spGrades = (Spinner) view.findViewById(R.id.spGrades); 
       holder.tvValue = (TextView) view.findViewById(R.id.tv_Value); 
       holder.btnSet = (Button) view.findViewById(R.id.btn_setValue); 
       holder.btnRemove = (Button) view.findViewById(R.id.btn_Remove); 
       view.setTag(viewHolder); 

      } 
      else{ 
       holder = (ViewHolder) view.getTag(); 
      } 

    // pop spinner names 
       ArrayAdapter<String> studentsNamesAdapater = new ArrayAdapter<> 
         (view.getContext(), android.R.layout.simple_spinner_dropdown_item, studentsNames); 
       studentsNamesAdapater.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
       holder.spNames.setAdapter(studentsNamesAdapater); 

       // pop spinner grades 
       String[] grades = new String [101]; 
       for (int grade = 0; grade < 101; grade++) 
        grades[grade] = String.valueOf(grade); 

       final ArrayAdapter<String> studentsGradesAdapater = new ArrayAdapter<> 
         (view.getContext(), android.R.layout.simple_spinner_dropdown_item, grades); 
       studentsGradesAdapater.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
       holder.spGrades.setAdapter(studentsGradesAdapater); 

       // set (variable and textview) 
       holder.btnSet.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         // update studentID 
         Student tmp = new Student(holder.spNames.getSelectedItem().toString(), Integer.valueOf(holder.spGrades.getSelectedItem().toString())); 
         studentID.set(position, tmp); 
         ((MainActivity) context).updateStatus(position); 
        } 
       }); 

       // remove row 
       holder.btnRemove.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) 
        { 
         studentID.remove(position); 
         notifyDataSetChanged(); 

         // for debug 
         String dStatus = "Vector size: " + studentID.size() + "\n"; 
         for (int index = 0; index < studentID.size(); index++) 
          dStatus += studentID.get(index).name + " " + studentID.get(index).grade + "\n"; 
         Toast.makeText(v.getContext(), dStatus, Toast.LENGTH_SHORT).show(); 
        } 
       }); 

      return view; 
     } 
+0

Большое спасибо. Я просто хочу добавить для других пользователей, после того, как вы это сделаете, значения спиннерс будут сброшены. вы должны сохранить их вручную, см. это: http://stackoverflow.com/questions/14258866/spinner-reset-value-when-scrolling-in-a-custom-listview-with-arrayadapter – AsfK

+0

Извините, но это был мой неисправность. это не работает. все еще неправильный студент удаляет из списка в GUI. – AsfK

0

просто получить позицию элемента для удаления по щелчку, а затем удалить его из ArrayList с помощью arraylist.remove (позиция), а затем вызвать notifyDataSetChanged.

1

В основном эта проблема возникает из-за просмотра утилизации. Добавьте эти два метода в свой адаптерный класс

@Override 
public int getViewTypeCount() { 
    return studentID.size() + 1; 
} 

@Override 
public int getItemViewType(int position) { 
    return position; 
} 

Вот ссылка, которая объясняет, почему вы должны добавить эти два метода. Getting an issue while checking the dynamically generated checkbox through list view

Надеюсь, это поможет!

2

Предлагаю вам использовать метод setOnItemClickListener в вашем списке. Есть некоторые преимущества:

  • Вам не нужно будет создать новый OnClickListener каждый раз, когда ваш деталь визуализируется
  • У вас есть прямой доступ к позиции зрения и самого представления: onItemClick(AdapterView<?> parent, View view, int position, long id)

Затем вы можете использовать это положение, чтобы удалить элемент из адаптера.

0

Вы делаете это размахивая, смотрите ниже коды.

@Override 
public View getView(int i, View view, final ViewGroup viewGroup) 
{ 
    if (view == null){ 
     view == LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.xxx, null); 
     ViewHolder holder = new ViewHolder(); 
     holder.spNames = (Spinner) view.findViewById(R.id.spNames); 
     holder.spGrades = (Spinner) view.findViewById(R.id.spGrades); 
     holder.tvValue = (TextView) view.findViewById(R.id.tv_Value); 
     holder.btnSet = (Button) view.findViewById(R.id.btn_setValue); 
     holder.btnRemove = (Button) view.findViewById(R.id.btn_Remove); 
     view.setTag(holder); 

    }else{ 
     holde = view.getTag(); 
    } 

    /** You have to redefine each view every time because it can be recycled by the listview **/ 
    ArrayAdapter<String> studentsNamesAdapater = new ArrayAdapter<> 
       (view.getContext(), android.R.layout.simple_spinner_dropdown_item, studentsNames); 
     studentsNamesAdapater.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     holder.spNames.setAdapter(studentsNamesAdapater); 
    /** so no **// 


    /** you can set the position to the button as a tag **/ 
    holder.btnRemove.setTag(i); 

    /** you MUST set the button OnClickListener after the view holder is created. you MUST NOT set the listener inside the if (view==null) pattern. **/ 
    holder.btnRemove.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) 
      { 
       int position = (Integer)v.getTag(); //Get the position which you would like you remove from the button. 
       studentID.remove(position); 
       notifyDataSetChanged(); 


      } 
     }); 
} 

Вы можете знать, почему вы должны иметь дело ListViews как это, я не могу вам сказать, почему в данный момент, но вы должны иметь полное представление о том, как AdapterViews (например, ListView, GridView, RecyclerView) работают, если вы хотите быть отличным мобильным (Android, iOS и другим мобильным устройством - тем же самым) разработчиком.

Посмотрите на это так: http://developer.android.com/guide/topics/ui/layout/listview.html

Добро пожаловать в мир кодирования, вы все еще предстоит пройти долгий путь для запуска. Удачи.