2017-01-06 7 views
0

나는 안드로이드를 배우는 학생입니다. 나는 간단한 연락처 응용 프로그램을하고있다! 통화 기록 지우기 버튼을 클릭하면 최근 연락처 목록보기가 동일하게 유지됩니다. 그것의 지워지지 않습니다. 하지만 앱을 닫고 다시 열면 최근 연락처 조각이 지워집니다! 나는 코드를 디버깅했다. clearcall 로그를 클릭하면 code가 cursor.movetoNext() 행 다음에 입력되지 않는다. 친절하게 도와주세요 techies!ClearCallLog가 목록보기를 업데이트하지 않습니다.

메뉴에서 통화 로그 버튼을 지울 때 updateFragment2ListView()가 호출되는 것처럼 프로그래밍되었습니다.

public class RecentContacts extends Fragment { 
    HashMap contactMap = new HashMap(); 
    View rootView; 
    RecentAdapter rr; 
    ListView list; 
    private static final int PERMISSIONS_REQUEST_READ_CALLLOG = 100; 
    Cursor cursor; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     rootView = inflater.inflate(R.layout.fragment_recent_contacts, container, false); 
     list = (ListView) rootView.findViewById(R.id.customlist); 
     getRecentContacts(); 
     rr = new RecentAdapter(contactMap, getActivity()); 
     list.setAdapter(rr); 
     return rootView; 
    } 

    public void updateFragment2ListView() { 
     getRecentContacts(); 
     rr.notifyDataSetChanged(); 
     list.setAdapter(rr); 
     System.out.println("Fragment recent updated-updateFragment2listview"); 
    } 

    @Override 
    public void onResume() { 
     getRecentContacts(); 
     rr.notifyDataSetChanged(); 
     System.out.println("Fragment recent updated- onresume"); 
     super.onResume(); 
    } 

    @Override 
    public void onStart() { 
     System.out.println("Fragment recent onstart"); 
     super.onStart(); 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    void getRecentContacts() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && getContext().checkSelfPermission(Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{Manifest.permission.READ_CALL_LOG}, PERMISSIONS_REQUEST_READ_CALLLOG); 
      //After this point you wait for callback in onRequestPermissionsResult(int, String[], int[]) overriden method 

      System.out.println("Security check ok"); 
     } else { 
      System.out.println("Entered recent onstart"); 
      int i=0; 

      Uri queryUri = android.provider.CallLog.Calls.CONTENT_URI; 
      String[] projection = new String[]{ 
        ContactsContract.Contacts._ID, 
        CallLog.Calls._ID, 
        CallLog.Calls.NUMBER, 
        CallLog.Calls.CACHED_NAME, 
        CallLog.Calls.DATE, 
        CallLog.Calls.TYPE}; 

      String sortOrder = String.format("%s limit 500 ", CallLog.Calls.DATE + " DESC"); 

      try { 
       System.out.println("Entering cursor in recent contacts"); 
       cursor = getActivity().getContentResolver().query(queryUri, projection, null, null, sortOrder); 
       System.out.println("Entered cursor in recent contacts"); 

      } catch (SecurityException e) { 
       Log.e("", ""); 
      } 

      while (cursor.moveToNext()) { 
       System.out.println("Entered cursor.movetoNext recent contacts"); 
       String phoneNumber = cursor.getString(cursor 
         .getColumnIndex(CallLog.Calls.NUMBER)); 
       System.out.println("Entered phone number in recent contacts"); 
       String title = (cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME))); 

       int duration1 = cursor.getColumnIndex(CallLog.Calls.DURATION); 
       System.out.println("Duration" + duration1); 
       System.out.println("Entered duration in recent contacts"); 

       int date = cursor.getColumnIndex(CallLog.Calls.DATE); 
       String callDate = cursor.getString(date); 
       Date callDayTime = new Date(Long.valueOf(callDate)); 
       System.out.println("Call Date" + callDayTime); 

       int type = cursor.getColumnIndex(CallLog.Calls.TYPE); 
       String callType = cursor.getString(type); 

       String dir = null; 
       int dircode = Integer.parseInt(callType); 
       switch (dircode) { 
        case CallLog.Calls.OUTGOING_TYPE: 
         dir = "OUTGOING"; 
         break; 

        case CallLog.Calls.INCOMING_TYPE: 
         dir = "INCOMING"; 
         break; 

        case CallLog.Calls.MISSED_TYPE: 
         dir = "MISSED"; 
         break; 
       } 

       System.out.println("Call type" + dir); 

       // if (phoneNumber == null || title == null) continue; 

       String uri = "tel:" + phoneNumber; 
       Intent intent = new Intent(Intent.ACTION_CALL); 
       intent.setData(Uri.parse(uri)); 
       String intentUriString = intent.toUri(0); 

       contactMap.put(i, new RecentPojo(title, phoneNumber, duration1, false, callDayTime, dir)); 
       // Toast.makeText(this,title,Toast.LENGTH_SHORT).show(); 

       i++; 

      } 
      cursor.close(); 
     } 

    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, 
              int[] grantResults) { 
     if ((requestCode == PERMISSIONS_REQUEST_READ_CALLLOG)) { 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       // Permission is granted 
       System.out.println(""); 
       getRecentContacts(); 
      } else { 
       Toast.makeText(getContext(), "Until you grant the permission, we cannot display the names", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
} 
+0

while 루프 전에 contactMap을 지우는 것이 좋습니다. 데이터베이스에서 모든 데이터를 삭제 한 후에는 커서가 null이고 moveToNext()를 수행 할 수 없다고 생각하므로 while 루프 내부로 들어 가지 않습니다. 희망이 도움이! –

+0

그래, 이미 해냈어. 오/피! @I_A_Mok에게 감사합니다! – Kanagalingam

답변

0

당신은 그렇게 ListView에 새로 고칠 때를 명확 rr.notifyDataSetChanged();를 호출해야합니다.

+0

나는 이미 MENU에서 clearcalllog를 클릭 할 때 호출되는 updateFragment2ListView() 아래에서 bro @ Aubtin Samai라고 불렀습니다! – Kanagalingam

+0

제거 list.setAdapter (rr); updateFragment2ListView()에서 ... 두 번 필요하지 않습니다. –