마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리스트뷰 즐겨찾기에서 searchview이후

0 추천
package com.cookandroid.shopping;

import java.util.ArrayList;

import android.app.Activity;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.SearchView.OnQueryTextListener;
import android.widget.Toast;

public class FavoriteActivity extends Activity implements OnQueryTextListener { 
 
 ListView listView;
 
 Intent intent;
 
 private DBAdapter mDb;
 private ArrayList<Info> mInfo;
 private ArrayAdapter<Info> mAdapter;
 private static final int MENU_DELETE=0;
 private static final int MENU_SHARE=1;
 private static final int MENU_ALLDELETE=2;
 
 protected void onCreate(Bundle savedInstanceState) {
 
  super.onCreate(savedInstanceState);
  setContentView(R.layout.favorite_listview);
  
  setTitle("즐겨찾기 리스트");
  listView = (ListView) findViewById(R.id.favoview);
  
  registerForContextMenu(listView);

  mDb = new DBAdapter(this);
  mInfo = mDb.getAllInfo();
  mAdapter = new ArrayAdapter<Info>(this, android.R.layout.simple_list_item_1, mInfo);
  listView.setAdapter(mAdapter);
  listView.setTextFilterEnabled(true); 
  

  Toast.makeText(FavoriteActivity.this, "길게 누르면 삭제.공유할 수 있습니다." , Toast.LENGTH_SHORT).show();

  listView.setOnItemClickListener(new OnItemClickListener() {

             @Override
             public void onItemClick(AdapterView<?> parent, View v, int position, long id){
                 Info i = mInfo.get(position);
                 Toast.makeText(FavoriteActivity.this, i.getName(), Toast.LENGTH_SHORT).show();
                 
                 Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(i.getAddr()));
                 startActivity(in);

             }
         });
  
 
 }
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu){
  //Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.search_view, menu);
  SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
  SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
  searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
  searchView.setSubmitButtonEnabled(true);
  searchView.setOnQueryTextListener(this);
  return super.onCreateOptionsMenu(menu);
 }

 @Override
 public boolean onQueryTextChange(String newText)
 {
  if(TextUtils.isEmpty(newText))
  {
   listView.clearTextFilter();
  }
  else
  {
   listView.setFilterText(newText.toString());
  }
  return true;
 }
 @Override
 public boolean onQueryTextSubmit(String query)
 {
  return false;
 }
 
 int nPosition;
 @Override
 public void onCreateContextMenu(ContextMenu menu, View v,
   ContextMenuInfo menuInfo){
  
  super.onCreateContextMenu(menu, v, menuInfo);
  nPosition = ((AdapterView.AdapterContextMenuInfo)menuInfo).position;
  menu.add(0, MENU_DELETE, 0, "삭제");
  menu.add(0, MENU_SHARE, 0, "공유");
  menu.add(0, MENU_ALLDELETE, 0, "모두 삭제");
 }
 
 @Override
 public boolean onContextItemSelected(MenuItem item) {
  super.onContextItemSelected(item);

  Info i = mInfo.get(nPosition);
  
  switch(item.getItemId()) {
  case MENU_DELETE:
   
         mDb.deleteInfo(i.getId());
         Toast.makeText(FavoriteActivity.this, "삭제되었습니다.", Toast.LENGTH_SHORT).show();
   refreshList();
   
   return true;
  
  case MENU_SHARE:
   Intent msg = new Intent(Intent.ACTION_SEND);
   msg.addCategory(Intent.CATEGORY_DEFAULT);
   msg.putExtra(Intent.EXTRA_SUBJECT, "너에게 추천하는 쇼핑몰이야!");
   msg.putExtra(Intent.EXTRA_TEXT, i.getAddr());
   msg.setType("text/plain");
   startActivity(Intent.createChooser(msg, "공유"));
   return true;
  
  case MENU_ALLDELETE:
   mDb.deleteAll();
   Toast.makeText(FavoriteActivity.this, "모두 삭제되었습니다.", Toast.LENGTH_SHORT).show();
   refreshList();
   return true;
  }
  
  return false;
 }
 
 
     protected void onDestroy() {
         mDb.close();
         super.onDestroy();
     }
     
 private void refreshList() {
        mInfo.clear();
        mInfo.addAll(mDb.getAllInfo());
        mAdapter.notifyDataSetInvalidated();
    }
 
 
 

}

 

커스텀리스트뷰에 있던 리스트들을 즐겨찾기로 추가해놓으면

이 FavoriteActivity에 저장이 되는데요 저장되어있는 리스트들을

여기서 롱클릭해서 컨텍스트 메뉴로 띄워서 삭제/공유/모두삭제 기능을 추가해서  해보면 잘 되는데

여기서 Search View를 추가했습니다.. 그리고 검색아이콘을 누른다음에

롱클릭해서 리스트를 삭제하려고하면 삭제가안대요..

아정확히는 삭제는 되는데 다시 refresh()로 갱신이 안되고

뒤로 갔다가 다시 즐겨찾기로 들어와야 없어져있고..

검색아이콘 누른담에 삭제한다음에 또 다시 롱클릭해서 뭐 누를라그러면

아예 눌리지도않고 먹통이돼요 소스를 어떻게 고쳐아하나요??ㅠㅠㅠ

익명사용자 님이 2014년 11월 24일 질문

1개의 답변

0 추천
갱신하는 부분

notifyDataSetInvalidated를 notifydatasetchanged로 고쳐보실래요?

저도 삭제/추가하고 난 직후에 notifydatasetchanged로 갱신했어요.

삭제한 후 바로 갱신되지 않고 뒤로갔다가 다시 액티비티 실행후에 삭제된것처럼 보이는건 갱신이 제대로 안되서 발생하는 문제인거같네요. 이미 해당 아이템은 삭제 되었는데 또 삭제하려고 누르면 먹통이 될수밖에없는..

 

아래 사이트 참고해보세요.

http://www.androidstudy.co.kr/bbs/board.php?bo_table=C09&wr_id=26
anci (19,950 포인트) 님이 2014년 11월 24일 답변
anci님이 2014년 11월 24일 수정
답변감사합니다. 그래도 안되네요 ㅠㅠ search view 버튼만 눌렀다가 삭제하면 왜 갱신이 안대는지 휴 ㅠㅠ
흠..지금 갱신할 때마다 무조건 아래 함수를 실행하는거같은데..
private void refreshList() {
        mInfo.clear();
        mInfo.addAll(mDb.getAllInfo());
        mAdapter.notifyDataSetInvalidated();
    }
리스트뷰를 전체 삭제한 후, 다시 addall하는 방식으로 전부 추가하는 거같은데..
이렇게 하지말고, 갱신만 해보시는게 어때요?..
addAll을 없애라는 말씀이신가요?.?.. 제가 초보라서 잘 모르겠네요ㅠㅠ addAll없애고 하면 그냥 삭제만 눌러도 모두삭제가되버리는데. 음...
저도 리스트뷰쪽 추가삭제 후 갱신은 예전에 해서 가물가물한데..
어제 드린 링크내용대로 데이터 추가/삭제할 땐 notifyDataSetChanged() 쓰시면 되구요.
http://www.masterqna.com/android/32598/db-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%B7%B0-%EC%82%AD%EC%A0%9C-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EA%B0%B1%EC%8B%A0

http://www.androidpub.com/2444367

두개 링크 참고해보세요..
지금보니 데이터베이스에서 내용불러와서 갱신하는거였군요.-_-,ㅎㅎ;;
새로 갱신될 녀석을 불러오려면 clear한 후, add시키면 될거같은데..
일단 중간중간에 로그를 찍어서 어디까지 소스가 돌아가는지 확인해보시면 될거같네요. mAdapter.notifyDataSetInvalidated();까지 작동하는데 갱신이 되지않는다면 거기서부터 다시 방법을 찾으시면 될거같네요.
본문내용대로, 삭제버튼을 누른 후 즉시 리스트가 갱신이 안되는데 뒤로갔다가 다시 이 액티비티를 실행하면 정상적으로 삭제된 리스트가 나온다고 하셨는데..삭제나 다른데엔 이상이 없고, 삭제버튼을 누른 후, 갱신시키는 refreshList()함수만 잘 고치면 될거같네요
네감사합니다. 그런데 검색버튼을 안누르면 삭제하고 갱신도 되고 모두삭제하고 갱신도 되고 그러는데 왜 검색버튼을 눌렀다가 다시하면 안되는건가요?? 저렇게는 되니까 refresh를 못건드리겠어서.. searchview를 눌렀다가 돌아오면 뭐가 변하길래 저런건가요?? searchview를 건드려야하는게아닌가여?
...