2017-01-06 7 views
0

私はアンドロイドを学ぶ学校の学生です。私は簡単な連絡先アプリをやっている!私はクリアコールログボタンをクリックすると、私の最近の連絡先リストビューは同じままです。それはクリアされていません。しかし、私は、アプリケーションを閉じて再び開くと、最近の連絡先の断片がクリアされている!私はclearcallログをクリックすると、コードが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

ええ、すでにそれをして、o/pを得ました!ありがとう@I_A_Mok! – Kanagalingam

答えて

0

あなたはそれをクリアしたときに、リストビューがリフレッシュされるようrr.notifyDataSetChanged();を呼び出す必要があります。

+0

私は既にMENUでclearcalllogをクリックすると呼び出されるupdateFragment2ListView()の下で、それをbro @ Aubtin Samaiと呼んでいます! – Kanagalingam

+0

list.setAdapter(rr)を削除します。 updateFragment2ListView()から...あなたは2回それを必要としません。 –

関連する問題