2016-03-17 5 views
0

У меня есть следующий BaseAdapter класс:ListView удалить элемент из пользовательского BaseAdapter

public class ListViewAdapter extends BaseAdapter{ 
String [] result, players; 
Context context; 
View rowView; 
int [] imageId; 
Holder holder; 
private static LayoutInflater inflater=null; 
public ListViewAdapter(MainActivity.PageFragment mainActivity, String[] prgmNameList, String[] players, int[] prgmImages) { 
    result=prgmNameList; 
    this.players=players; 
    context=mainActivity.getContext(); 
    imageId=prgmImages; 
    inflater = (LayoutInflater)context. 
      getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 
@Override 
public int getCount() { 
    return result.length; 
} 

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

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

public class Holder 
{ 
    TextView title, players; 
    ImageView img; 
} 
@Override 
public View getView(final int position, View convertView, final ViewGroup parent) { 
    // TODO Auto-generated method stub 
    holder=new Holder(); 
    rowView = inflater.inflate(R.layout.server_layout, null); 
    holder.title=(TextView) rowView.findViewById(R.id.textView1); 
    holder.players=(TextView) rowView.findViewById(R.id.textView5); 
    holder.img=(ImageView) rowView.findViewById(R.id.imageView7); 
    holder.title.setText(result[position]); 
    holder.players.setText(players[position]); 
    holder.img.setImageResource(imageId[position]); 
    rowView.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(final View v) { 
      new AlertDialog.Builder(context) 
        .setIcon(android.R.drawable.ic_dialog_alert) 
        .setTitle("Remove") 
        .setMessage("Are you sure you want to remove this server?") 
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          Toast.makeText(context, "You LongClicked " + result[position], Toast.LENGTH_LONG).show(); 
          //REMOVE ITEM 
          notifyDataSetChanged(); 
         } 
        }) 
        .setNegativeButton("No", null) 
        .show(); 
      return false; 
     } 
    }); 
    return rowView; 
} 
} 

А следующий onCreate():

  ListView servers =(ListView) view.findViewById(R.id.list_view); 
      BaseAdapter e = new ListViewAdapter(this,prgmNameList,players,prgmImages); 
      servers.setAdapter(e); 

Мой вопрос, как я могу удалить Clicked элемент в методе OnClick , Я попытался удалить его с ListView, а также rowView=null;, но это не сработало. Заранее спасибо

+0

как вы попробовали удалить его из списка? – Slavik

+0

вы можете удалить его из объекта, а затем обновить представление списка –

+0

@Slavik 'servers.removeViewAt (position);' но я получил ошибку "removeViewAt (int) не поддерживается в AdapterView" – Andics

ответ

0

Если removeViewAt() дает вам сообщение об ошибке, просто установите позицию элемента, щелкнув и удалив его из вашего массива. А затем скажем, адаптер.notifyDataSetChanged(); представление будет обновляться самостоятельно.

0

После того, как объект был удален из списка внутри адаптера, попробуйте выполнить следующие действия адаптера:

this.notifyItemRemoved(position); 

Когда позиция является позиция удаляемого элемента.

+0

И каков правильный способ ее удалить? – Andics

+0

Как вы это делаете, это выполнить операцию удаления в вашем списке -> list.remove (position) и call adapter.notifyItemRemoved (position). Это самый эффективный способ сделать это. –

1

Определите метод, называемый removeRow в ListViewAdapter.

public void removeRow(int position) { 
    // Remove the element from the results array here. 
    notifyDataSetChanged(); 
} 

Некоторые рекомендации: используйте RecyclerView, если сможете. Эта структура имеет лучшие способы обработки анимации удаления и т. Д. Пожалуйста, используйте convertView в getView(). Не раздувайте новое представление для каждого вызова getView. Это сделает ваш listView намного быстрее.

+0

Массив 'result' является одним из 3 (других:' players', 'imageId') массивов, которые меняют мой элемент интерфейса. Кроме того, даже после того, как я установил все из них в null (потому что метода remove() нет, который оставляет соответствующий текст в виде изображений пустыми, фон все еще существует – Andics

+0

Я хотел бы предложить использовать список вместо массив. Вы также можете определить один объект для хранения всех данных, связанных с каждой строкой, такой как этот класс RowData { int imageId; Струнный игрок, результат; } И иметь список как элемент данных массива. Список rowData; Теперь вы можете удалить элементы без проблем. – greenrobo

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

  • Нет связанных вопросов^_^