2015-04-27 5 views
0

Я создал адаптер класса в отдельном файле, но в моем основном файле я вызываю метод remove для удаления элемента или того, что когда-либо выбирал элемент, но когда я его удаляю, он не обновляет мое приложение.Android, он не удаляет элемент из ListView

КОД:

public static void populateChatListView(final Context context){ 
    adapter = new myAdapter(context, R.layout.source_contact); 

    listv.setAdapter(adapter); 

    for (Contacts friend: friends){ 
     adapter.add(friend); 
    } 

    listv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
      Toast.makeText(context, "DELETED", Toast.LENGTH_SHORT).show(); 
      //supposed to remove it 
      adapter.remove(adapter.getItem(0)); 
      //supposed to update it(notify) 
      adapter.notifyDataSetChanged(); 
      return true; 
     } 

    }); 

    adapter.registerDataSetObserver(new DataSetObserver() { 
     @Override 
     public void onChanged() { 
      super.onChanged(); 
      listv.setSelection(adapter.getCount() - 1); 
     } 
    }); 
} 

Это не дает мне какую-либо ошибку и не удаляет его. Буду признателен за любую помощь.

КЛАСС ADAPTER:

public class myAdapter extends ArrayAdapter<Contacts>{ 
    private List<Contacts> Listc = new ArrayList<>(); 
    TextView NameWindow, LastN; 
    ImageView contactProfile; 

    Context context; 

    public myAdapter(Context context, int resource) { 
     super(context, resource); 
     this.context = context; 
    } 
    @Override 
    public void add(Contacts object) { 


     Listc.add(object); 
     super.add(object); 
    } 

    @Override 
public Contacts getItem(int position) { 
    return Listc.get(position); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if(convertView == null){ 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.source_contact, parent, false); 
    } 

    NameWindow = (TextView) convertView.findViewById(R.id.contactN); 
    LastN = (TextView) convertView.findViewById(R.id.contactL); 

    contactProfile = (ImageView) convertView.findViewById(R.id.contactProfile); 

    String name, lastn; 

    Contacts provider = getItem(position); 

    name = provider.getName(); // name goes down 
    lastn = provider.getLastn(); // goes upper 

    NameWindow.setText(name); 
    LastN.setText(lastMessage); 

    return convertView; 
} 
    ... 

отредактирован.

+0

Вы можете показать больше коды? Где источник данных вашего адаптера? –

+0

где вы устанавливаете элементы адаптера? – Elltz

+0

Я отредактировал это, так что вы можете видеть – kobbycoder

ответ

1

добавить к вашему адаптеру классу

public void myRemove(int position){ 
    Listc.remove(position); 
    myAdapter.super.notifyDataSetChanged(); 
} 

и использовать их, а чтобы увидеть, если это будет делать различие

+0

Я реализую его в классе адаптера? или в основном файле? – kobbycoder

+0

в классе адаптера поставьте его там, и в вашем onitemclicklistener используйте этот 'adapter.myRemove (position);' не вызывайте notifydatatsetchanged @ kobbycoder – Elltz

+0

Это сработало <3 спасибо, я не знал, что могу сделать это – kobbycoder

0

Я думаю, что в вашем адаптере вы должны иметь такую ​​переменную массива.

class yourAdapter extends BaseAdapter { 
    private ArrayList<Object> your_list_variable; 
    .... 
} 

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

adapter.notifyDataSetChanged(); 

Попробуйте.

// обновляем здесь пример, вы можете проверить мой код.

public class MainActivity extends ActionBarActivity { 

private ListView myList; 
private myAdapter mAdapter; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    mAdapter = new myAdapter(this, android.R.layout.simple_list_item_1); 
    myList = (ListView) findViewById(R.id.myList); 

    for(int i = 0; i < 100; i++) { 
     mAdapter.add("item : " + (i+1)); 
    } 
    myList.setAdapter(mAdapter); 

    myList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, int index, long id) { 

      System.out.println("index : " + index); 
      System.out.println("item : " + mAdapter.getItem(index)); 
      mAdapter.remove(mAdapter.getItem(index)); 
      mAdapter.notifyDataSetChanged(); 
      return false; 
     } 
    }); 

} 


class myAdapter extends ArrayAdapter<String> { 

    private List<String> listData = new ArrayList<>(); 


    public myAdapter(Context context, int resource) { 
     super(context, resource); 
    } 

    @Override 
    public void add(String object) { 
     super.add(object); 

     listData.add(object); 
    } 

    @Override 
    public void remove(String object) { 
     super.remove(object); 
     listData.remove(object); 
    } 

    @Override 
    public String getItem(int position) { 
     return super.getItem(position); 
    } 
} 

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

+0

Я уже добавил его в 'setOnItemLongClickListener', или что вы имеете в виду? вы имеете в виду в классе? и что вы имеете в виду при обновлении этого списка? – kobbycoder

+0

Я имею в виду, вы можете напрямую вызвать функцию удаления из своего списка, например, ArrayList .remove, а затем использовать notifyDataSetChanged. – Chauyan

+0

Какой тип адаптера вы используете? Это ArrayAdapter? Просьба взглянуть на: http://stackoverflow.com/questions/18444671/remove-item-in-arrayadapterstring-in-listview – Sam

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