2012-12-08 3 views
1

활동 확장 활동이 있습니다.이 활동에는 SQlite 데이터베이스에서 쿼리 한 데이터를 표시하는 listview가 있습니다. listview의 항목 중 하나를 longclick하면 alertdialog가 표시되어 정말로 삭제하고 싶은지 확인합니다. 그러나 데이터 중 하나를 삭제하면 데이터베이스에서 데이터를 다시 쿼리하고 목록보기 새로 고침을 위해 notifyDataSetChanged()을 사용하지만 작동하지 않습니다. 에서 onCreate에서 몇 가지 코드()Adapter.notifyDataSetChanged()가 작동하지 않습니다.

serviceListView.setOnItemLongClickListener(new OnItemLongClickListener() 
    { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> arg0, View arg1,final int arg2, long arg3) 
     { 
      Map<String, String> map = new HashMap<String, String>(); 
      if (data!=null) 
      { 
       String[] options = new String[]{ "edit", "delete" }; 
       map = data.get(arg2); 
       final String companyname= map.get("companyname"); 
       final String serviceaddress = map.get("serveraddress"); 
       final String id = map.get("id"); 
       new AlertDialog.Builder(ServiceListActivity.this) 
         .setTitle("options") 
         .setIcon(android.R.drawable.ic_dialog_info) 
         .setSingleChoiceItems(options,-1, 
           new DialogInterface.OnClickListener() 
           { 
            public void onClick(DialogInterface dialog,int which) 
            { 
             if (which == 0) 
             { 
              dialog.dismiss(); 
              Toast.makeText(ServiceListActivity.this, id+companyname+serviceaddress+"edit", Toast.LENGTH_SHORT).show(); 
             } 
             else 
             {  
              dialog.dismiss(); 
              AlertDialog.Builder builder = new Builder(ServiceListActivity.this); 
              builder.setMessage("delete?"); 
              builder.setTitle("Notice"); 
              builder.setPositiveButton("yes", new DialogInterface.OnClickListener() 
              { 
               @Override 
               public void onClick(DialogInterface dialog, int which) 
               { 
                // TODO Auto-generated method stub 
                Log.i("ServiceListActivity data1 = ", data.size()+""); 
                dialog.dismiss(); 
                Message message = Message.obtain(); 
                message.what = 1; 
                message.obj = id; 
                messageHandler.sendMessage(message);              
               } 
              }); 
              builder.setNegativeButton("no", new DialogInterface.OnClickListener() { 
               @Override 
               public void onClick(DialogInterface dialog,int which) 
               { 
                // TODO Auto-generated method stub 
                dialog.dismiss(); 
               } 
              }); 
              builder.create().show(); 
             } 
            } 
           }).setNegativeButton("no", new DialogInterface.OnClickListener() 
           {  
            @Override 
            public void onClick(DialogInterface dialog, int which) 
            { 
             // TODO Auto-generated method stub 
             dialog.dismiss(); 
            } 
           }) 
         .show(); 

innter 클래스가있다 : 누군가가, 제발 도와 대단히 감사합니다, 그래서

class MessageHandler extends Handler 
{ 
     public MessageHandler(Looper looper) 
     { 
      super(looper); 
     } 

     @Override 
     public void handleMessage(Message msg) 
     { 
      switch (msg.what) 
      { 
      case 1:   
       String id = msg.obj.toString(); 
       int i = DatabaseTools.DeleteServer(database, Integer.parseInt(id)); 
       if (i==1) 
       { 
        data = DatabaseTools.queryDataFromDatabase(database,cursor); 
        Log.i("ServiceListActivity data2 = ", data.size()+""); 
        myListAdapter.notifyDataSetChanged(); 
        Toast.makeText(ServiceListActivity.this, "finished", Toast.LENGTH_SHORT).show(); 
       } 
       break; 
      } 
     } 

나는이 문제를 해결하지 못할은.

runOnUiThread(new Runnable() { 
    public void run() { 
     myListAdapter.notifyDataSetChanged(); 
    } 
}); 

UPDATE :

선언 어딘가 처리기 중이 Runnable를

+0

레코드 삭제 후'data.size()'가 logcat에 업데이트되어 있습니까? –

+0

@PratikSharma 예, 항목 중 하나를 삭제하면 크기가 -1이됩니다. – jxdwinter

+0

'myListAdapter.notifyDataSetChanged();'호출 전이나 후에'mListView.invalidate();'호출을 시도하십시오. –

답변

3

봅니다 이런 식으로 호출합니다.

Runnable run = new Runnable(){ 
    public void run(){ 
     myListAdapter.notifyDataSetChanged(); 
    } 
}; 

다음 핸들러에서 호출하십시오.

yourActivity.runOnUiThread(run); 

처리기에서 문제가 발생하고 있습니다.

희망이 있으면 문제가 해결 될 것입니다.

감사합니다.

+0

선생님,이 runOnUiThread() 사용법을 모르겠습니다. 좀 더 알려주시겠습니까? 감사합니다 – jxdwinter

+0

내 handleMessage (Message msg)에서 이것을 시도했지만 나에게 적합하지 않습니다 ... – jxdwinter

+0

그에 대한 업데이트 된 해결책을 참조하십시오. –

관련 문제