2015-09-22 2 views
0

У меня есть класс «Контакты», который принимает данные из другого действия и создает пользовательский ListView. Моя дилемма с моим классом CustomAdapter. Я пытаюсь передать свой контекст Activity в свой конструктор CustomAdapter. Я пробовал, используя это, Contacts.this и никто не работает. Все мои виджеты не обновляются соответствующим текстом. Поэтому мой Custom 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; 
     } 
    } 

} 

Это Error Log Cat:

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); 
Смежные вопросы