2015-09-27 24 views
1

我想製作一個listView onItemClickItem來詳細查看。該列表通過使用自定義適配器如何從片段傳遞多個數據活動

這裏是我的名單

import android.app.Fragment; 
    import android.content.Intent; 
    import android.os.Bundle; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.AdapterView; 
    import android.widget.ListView; 
    import android.widget.Toast; 

    import com.rupomkhondaker.sonalibank.adapter.PhoneListAdapter; 
    import com.rupomkhondaker.sonalibank.model.ContactItem; 
    import java.io.Serializable; 
    import java.util.ArrayList; 

    public class GMOFragment extends Fragment { 
     public GMOFragment(){} 


     private ArrayList<ContactItem> phoneItems; 
     private PhoneListAdapter adapters; 


     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_gmo, container, false); 



      final ArrayList<ContactItem> listData = getListData(); 

      final ListView listView = (ListView) rootView.findViewById(R.id.gmolistView); 
      listView.setAdapter(new PhoneListAdapter(getActivity(), listData)); 

      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

       @Override 
       public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
        ContactItem newsData = (ContactItem) listView.getItemAtPosition(position); 


    String names = (String) listView.getItemAtPosition(position); 
    String phones = (String) listView.getItemAtPosition(position); 
    String mobiles = (String) listView.getItemAtPosition(position); 
    String emails = (String) listView.getItemAtPosition(position); 

    Intent intent = new Intent(getActivity(), ContactDetail.class); 

intent.putExtra("key", names); 
intent.putExtra("key2", phones); 
intent.putExtra("key3", mobiles); 
intent.putExtra("key4", emails); 

Toast.makeText(getActivity(), "Selected :" + " " + newsData, Toast.LENGTH_LONG).show(); 

    startActivity(intent); 
} 

}); 

      return rootView; 
     } 

     private ArrayList<ContactItem> getListData() { 
      ArrayList<ContactItem> listMockData = new ArrayList<ContactItem>(); 
      String[] names = getResources().getStringArray(R.array.gmo_name_list); 
      String[] phones = getResources().getStringArray(R.array.gmo_ph_list); 
      String[] mobiles = getResources().getStringArray(R.array.gmo_mob_list); 
      String[] emails = getResources().getStringArray(R.array.gmo_email_list); 

      for (int i = 0; i < names.length; i++) { 
       ContactItem newsData = new ContactItem(); 
       newsData.setName(names[i]); 
       newsData.setPhone(phones[i]); 
       newsData.setMobile(mobiles[i]); 
       newsData.setEmail(emails[i]); 
       listMockData.add(newsData); 
      } 
      return listMockData; 
     } 

    } 

片段來了。如果我只嘗試了吐司顯示它與數據同樣喜歡圖片 但敬酒的時候我試圖顯示/這些數據傳遞給新的活動就顯示錯誤 enter image description here

ContactDetail.java

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.widget.TextView; 

public class ContactDetail extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     this.setContentView(R.layout.view_contact); 

     TextView txtName = (TextView) findViewById(R.id.conName); 
     TextView txtPhone = (TextView) findViewById(R.id.conPhone); 
     TextView txtMobile = (TextView) findViewById(R.id.conMobile); 
     TextView txtEmail = (TextView) findViewById(R.id.conEmail); 


     Intent i = getIntent(); 
     // getting attached intent data 

     // getting attached intent data 
     String name =i.getStringExtra("key"); 
     String phone = i.getStringExtra("key2"); 
     String mobile = i.getStringExtra("key3"); 
     String email = i.getStringExtra("key4"); 

     // displaying selected contact name 
     txtName.setText(name); 
     txtPhone.setText(phone); 
     txtMobile.setText(mobile); 
     txtEmail.setText(email); 

    } 

} 

在這裏是日誌這裏發生

09-27 19:05:21.762  629-629/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.ClassCastException: com.rupomkhondaker.sonalibank.model.ContactItem cannot be cast to java.lang.String 
      at com.rupomkhondaker.sonalibank.GMOFragment$1.onItemClick(GMOFragment.java:49) 
      at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
      at android.widget.AbsListView.performItemClick(AbsListView.java:1086) 
      at android.widget.AbsListView$PerformClick.run(AbsListView.java:2859) 
      at android.widget.AbsListView$1.run(AbsListView.java:3533) 
      at android.os.Handler.handleCallback(Handler.java:615) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4745) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
      at dalvik.system.NativeStart.main(Native Method) 
09-27 19:05:21.782  150-517/? W/ActivityManager﹕ Force finishing activity com.rupomkhondaker.sonalibank/.MainActivity 
09-27 19:05:21.892  150-517/? D/dalvikvm﹕ GC_FOR_ALLOC freed 93K, 10% free 11568K/12807K, paused 58ms, total 63ms 

回答

2

問題:

String names = (String) listView.getItemAtPosition(position); 

getItemAtPosition()返回Object,即儲存在在適配器的位置的對象的方法。在你的情況下,這個對象的動態類型是ContactItem。要檢索的名稱,你可以使用這樣的事情(假設你已經實現了名稱字段一個getter):

String names = (String) listView.getItemAtPosition(position).getName(); 

這將是更好的,但是,只是把整個ContactItem的意圖。這要求ContactItemserializable。那麼你的代碼將變成:

@Override 
public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
    ContactItem newsData = (ContactItem) listView.getItemAtPosition(position); 

    Intent intent = new Intent(getActivity(), ContactDetail.class); 

    intent.putExtra("key", newsData); 

    Toast.makeText(getActivity(), "Selected :" + " " + newsData, Toast.LENGTH_LONG).show(); 

    startActivity(intent); 
} 

而在ContactDetail類,你可以檢索ContactItem的所有領域:

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    this.setContentView(R.layout.view_contact); 

    TextView txtName = (TextView) findViewById(R.id.conName); 
    TextView txtPhone = (TextView) findViewById(R.id.conPhone); 
    TextView txtMobile = (TextView) findViewById(R.id.conMobile); 
    TextView txtEmail = (TextView) findViewById(R.id.conEmail); 

    Intent i = getIntent(); 
    Bundle b = i.getExtras(); 

    // getting attached intent data 
    ContactItem contact = (ContactItem) b.getSerializable("key"); 

    // displaying selected contact name 
    txtName.setText(contact.getName()); 
    txtPhone.setText(contact.getPhone()); 
    txtMobile.setText(contact.getMobile()); 
    txtEmail.setText(contact.getEmail()); 

} 
+0

WOW感謝的人其作品超爽:)p – Firefog

+0

是相同的方式,使用哈希映射? – Firefog

+0

我不確定你指的是哪一部分。 'HashMap'與'Bundle'或'Intent'完全不同。 'ContactItem'似乎是你自己定義的類,並且又是不同的。 – Thomas