2015-09-22 45 views
0

我有一個名爲Contacts的類,它接受來自另一個活動的數據並創建一個自定義ListView。我的困境是我的CustomAdapter類。我嘗試將我的Activity上下文傳遞給我的CustomAdapter的構造函數。我試過了,使用這個,Contacts.this,都沒有工作。我的所有小部件都不會使用適當的文本進行更新。所以我的自定義ListView將加載,但沒有什麼。相反,我通過getApplicationContext()。這工作,但我不得不在我的自定義適配器類中設置標誌,我不確定是否最好的編程實踐。首先,這是我的聯繫活動文件傳遞上下文到自定義適配器對於ListView

public class Contacts extends AppCompatActivity implements View.OnClickListener { 
private Button addContactBtn; 
private ListView contactList; 
private CustomAdapter customAdapter; 
private ArrayList<String> names = new ArrayList<>(); 
private ArrayList<String> phoneNums = new ArrayList<>(); 
private ArrayList<String> emails = new ArrayList<>(); 
static final int REQUEST_CODE = 1; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_contacts); 

    addContactBtn = (Button)findViewById(R.id.contactAddButton); 
    contactList = (ListView)findViewById(R.id.contactList); 

    addContactBtn.setOnClickListener(this); 

    customAdapter = new CustomAdapter(getApplicationContext(),names,phoneNums,emails); 
    contactList.setAdapter(customAdapter); 
} 


@Override 
public void onClick(View v) { 
    switch (v.getId()){ 
     case R.id.contactAddButton:{ 
      Intent i = new Intent(Contacts.this, AddContact.class); 
      startActivityForResult(i,REQUEST_CODE); 

     } 

    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(requestCode == REQUEST_CODE){ 
     if(resultCode == RESULT_OK){ 
      String name = data.getStringExtra("name"); 
      String phone = data.getStringExtra("phone"); 
      String email = data.getStringExtra("email"); 
      phoneNums.add(phone); 
      names.add(name); 
      emails.add(email); 
     } 
    } 
} 

}

接下來,這裏是我的CustomAdapter類。我在這裏傳遞我的上下文,這是我遇到問題的地方。我爲某些小部件設置了onClick。我希望他們在點擊時啓動另一個目標,特別是打開android的撥號屏幕。一切都設置好了,但是當我點擊CustomList視圖中的小部件時,應用程序崩潰。我可以通過設置標誌來解決這個問題,但我寧願解決上下文問題。爲什麼我傳遞的上下文導致這個問題?我如何解決它?

public CustomAdapter(Context c,ArrayList<String>n, ArrayList<String>nums, ArrayList<String>e){ 

    context = c; 
    phoneNumbers = nums; 
    names = n; 
    emails = e; 
    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

} 
@Override 
public int getCount() { 
    return phoneNumbers.size(); 
} 

@Override 
public Object getItem(int position) { 
    return position; 
} 

@Override 
public long getItemId(int position) { 
    return (long)position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 

    if (view == null){ 
     view = inflater.inflate(R.layout.contacts_custom_row,null); 
     TextView name = (TextView)view.findViewById(R.id.customRowContactName); 
     TextView phone = (TextView)view.findViewById(R.id.customRowContactNumber); 
     TextView email = (TextView)view.findViewById(R.id.customRowContactEmail); 

     name.setText(names.get(position)); 
     phone.setText(phoneNumbers.get(position)); 
     email.setText(emails.get(position)); 

     phone.setOnClickListener(this); 
    } 
    return view; 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()){ 
     case R.id.customRowContactNumber:{ 
      Intent i = new Intent(Intent.ACTION_DIAL); 
      context.startActivity(i);//THIS IS THE ISSUE I THINK 
      break; 
     } 
    } 

} 

這是日誌目錄錯誤:

09-22 10:38:25.679 2794-2794/com.markfeldman.mydoggydays E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.markfeldman.mydoggydays, PID: 2794 
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 
     at android.app.ContextImpl.startActivity(ContextImpl.java:1238) 
     at android.app.ContextImpl.startActivity(ContextImpl.java:1225) 
     at android.content.ContextWrapper.startActivity(ContextWrapper.java:323) 
     at com.markfeldman.mydoggydays.CustomAdapter.onClick(CustomAdapter.java:73) 
     at android.view.View.performClick(View.java:4780) 
     at android.view.View$PerformClick.run(View.java:19866) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5257) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
+0

*我想,用這個,Contacts.this並沒有被工作*?他們爲什麼不工作? – Blackbelt

+0

對不起,我在上面添加了它 –

回答

1

你使用Context調用另一個活動,所以它認爲你想活動之外的電話,所以你會需要使用國旗FLAG_ACTIVITY_NEW_TASK。 相反,您可以嘗試通過Activity。像下面這樣:

public CustomAdapter(Contacts activity,ArrayList<String>n, ArrayList<String>nums, ArrayList<String>e){ 

    mActivity = activity; 
    phoneNumbers = nums; 
    names = n; 
    emails = e; 
    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

} 

@Override 
public void onClick(View v) { 
    switch (v.getId()){ 
     case R.id.customRowContactNumber:{ 
      Intent i = new Intent(Intent.ACTION_DIAL); 
      mActivity.startActivity(i);//THIS IS THE ISSUE I THINK 
      break; 
     } 
    } 

} 

然後,你可以只是調用,如:

customAdapter = new CustomAdapter(Contacts.this,names,phoneNums,emails); 
contactList.setAdapter(customAdapter); 
相關問題