2012-07-17 12 views
5

का उपयोग करता है, इसलिए मैं कुछ दिनों से इसके साथ खेल रहा हूं और इसे काम करने के लिए प्रतीत नहीं होता है। मुझे एक ऐसी गतिविधि मिली है जो एक टुकड़ा प्रदर्शित करता है और वह टुकड़ा Fragments की एक सूची का सदस्य है जिसे मैं ViewPager का उपयोग करके पेज करता हूं। फ्रैगमेंट में टेक्स्टव्यू और लिस्ट व्यू शामिल है। ListView खुद को कस्टम एडाप्टर से पॉप्युलेट करता है।OnItemSlectedListener एक फ्रैगमेंट में जो कस्टम एडाप्टर

जो मैं करने की कोशिश कर रहा हूं वह एक ऑनइटेम चयन घटना को वापस फ्रैगमेंट में पास कर देता है जहां इसे संभाला जाता है। मेरे लिए शायद आगे बढ़ना और यहां कोड दिखाना बेहतर है।

public class FragmentOne extends Fragment implements OnItemSelectedListener { 

View view; 
ListView listMain; 
ArrayList<String> invItems = new ArrayList<String>(); 

public FragmentOne() { 
} 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle) { 
    view = inflater.inflate(R.layout.fragment_one, viewGroup, false); 

    listMain = (ListView) v.findViewById(R.id.listMain); 
    listMain.setAdapter(new AdapterItem(getActivity().getApplicationContext(), 
     R.layout.tile_item, invItems)); 
    listMain.setOnItemSelectedListener(this); 
    return view; 
} 
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
    Log.i("Test", "hit"); 
} 

कुछ पंक्तियों में संक्षिप्तता के लिए छोड़े गए हैं:

यह इस टुकड़ा है गतिविधि

public class DialogInventory extends FragmentActivity implements OnItemSelectedListener { 

ViewPager viewPager; 
Pager pager; 

@Override 
protected void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 
    setContentView(R.layout.dialog_inventory); 

    List<Fragment> fragList = new Vector<Fragment>(); 
    fragList.add(Fragment.instantiate(this, FragmentOne.class.getName())); 
    fragList.add(Fragment.instantiate(this, FragmentTwo.class.getName())); 
    pager = new Pager(getSupportFragmentManager(), fragList); 

    viewPager = (ViewPager) findViewById(R.id.pagerMain); 
    viewPager.setAdapter(pager); 

    listMain = (ListView) findViewById(R.id.listMain); 
    listMain.setOnItemSelectedListener(this); 
} 

public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
    switch (viewPager.getCurrentItem()) { 
     case 0: 
      FragmentOne fragOne = new FragmentOne(); 
      fragOne.onItemSelected(parent, view, pos, id); 
      break; 
     case 1: 
      FragmentTwo fragTwo = new FragmentTwo(); 
      fragTwo.onItemSelected(parent, view, pos, id); 
      break; 
    } 
} 
public void onNothingSelected(AdapterView<?> arg0) { 
} 

है। आइए इस धारणा पर जाएं कि टुकड़े सही तरीके से प्रदर्शित होते हैं और यह सब कुछ काम करता है। एकमात्र चीज जो सही तरीके से काम नहीं कर रही है वह यह है कि गतिविधि में OnItem चयनित घटना बिल्कुल फायरिंग नहीं कर रही है ... टुकड़े में OnItem चयनित घटना बहुत कम है। मुझसे यहां क्या गलत हो रहा है?

संपादित करें: सूची दृश्य उनके संबंधित टुकड़ों में होना चाहिए (क्योंकि वे अलग-अलग गतिविधि में व्यक्तिगत रूप से प्रदर्शित होंगे और साथ ही ऊपर सूचीबद्ध एक भी)। यहां सबसे बड़ा मुद्दा यह है कि मैं अपनी गतिविधि में एक ऑनइटेम सेलेक्टेड लिस्टनर सेट नहीं कर सकता, इसलिए घटना को कभी भी निकाल दिया नहीं जाता है। मेरे पास उस बिंदु तक पहुंचने वाले सभी कोड हैं जो काम करते हैं और चलते हैं, यह केवल ऑनइटम चयनकर्ता है जो काम नहीं करता है।

संपादित 2: मैं कल इस प्रश्न पर एक बक्षीस जोड़ूंगा। इसके प्रकाश में मैंने सोचा कि मैं सही उत्तर के दायरे पर अधिक अंतर्निहित होगा। एक सही उत्तर यूआई लेआउट या प्रस्तुति में नाटकीय परिवर्तन का सुझाव नहीं देगा। सही उत्तर एक ऑनइटेम चयन घटना को टुकड़े टुकड़े में पारित करेगा और वहां संभाला जाएगा। उत्तर में मुझे कुछ गतिविधि प्राप्त करने के लिए कोड की रेखा के बाद लाइन के साथ अपनी गतिविधि को लोड नहीं करना पड़ेगा जो मुझे लगता है कि केवल कुछ पंक्तियों के साथ सक्षम है। अधिक सुरुचिपूर्ण उत्तर स्पष्ट रूप से अधिक आकर्षक हैं। इस पर नज़र रखने वाले किसी भी व्यक्ति के लिए धन्यवाद।

समस्या यह है कि मुझे अपनी गतिविधि में एनपीई मिलता है। मैं इसे एक सूची दृश्य में कैसे इंगित करता हूं जो कक्षा के लेआउट की तुलना में एक अलग लेआउट में मौजूद है।

+2

अपने "मैं यूआई परिवर्तन करना चाहते हैं न" नियम को तोड़ने का खतरा चल रहा है, वहाँ एक कारण है कि आप एक 'ListFragment' उपयोग नहीं कर रहे जो डिफ़ॉल्ट रूप से आप एक पद्धति के लिए' देता है ओवरराइड करें जो 'ListView' पर क्लिक प्राप्त करता है और इस प्रकार आप ऐसा कर सकते हैं जो मैं मानता हूं कि आप ऐसा करने का प्रयास कर रहे हैं, जो सूची आइटम को स्थानीय रूप से खंड में क्लिक करने के लिए है ... http://developer.android.com /reference/android/app/ListFragment.html#onListItemClick(android.widget.ListView, android.view.View, int, long) –

+0

हां, क्योंकि ListFragment पूरी स्क्रीन भरता है। इस मामले में मेरे पास नीचे दिए गए बटन होंगे, और शीर्ष – user1449018

+2

पर टेक्स्टव्यू शीर्षक होगा, आपको लगता है कि चीजें सामने आती हैं: आपको गतिविधि में सूची आइटम क्लिक को पकड़ने की कोशिश नहीं करनी चाहिए और उन्हें टुकड़े में प्रचारित नहीं करना चाहिए (एस), बल्कि उन्हें प्रासंगिक खंड में सीधे प्राप्त करें। मूल रूप से @ सलीलपंडित ने सही दृष्टिकोण दिया है। चाहे आप 'ListFragment' का उपयोग करें या नहीं, लेकिन आपकी धारणा है कि यह "पूरी भर जाती है" स्क्रीन सही नहीं है; यह सूचियों से निपटने के लिए सिर्फ एक सुविधा खंड है, लेकिन आप इसे जो कुछ भी चाहते हैं उसे देख सकते हैं, बशर्ते आप कम से कम 'ListView' को '@android: id/list' के साथ घोषित करें। –

उत्तर

2

आप listView.setOnItemSelectedListener(this) कहां उपयोग करते हैं?

listMain.setOnItemSelectedListener(this); 
+0

ओउप्स। बाहर छोड़ दिया। संपादन op – user1449018

+0

ठीक है, अब आपको गतिविधि में अपनी सूची दृश्य ढूंढना होगा ('(ListView) findViewById (R.id.listView)') के साथ, एडाप्टर सेट करें और वही करें। – Sam

+0

मैंने अभी इसे आज़माया है। अब मैं श्रोताओं को गतिविधि में सूचीदृश्य में स्थापित करने पर एनपीई प्राप्त कर रहा हूं। मैं कोड परिवर्तन के साथ ओपी अपडेट करूंगा – user1449018

0

मैं भी इस के समान कुछ करने के लिए कोशिश कर रहा है: आप स्पष्ट रूप से ListView कि आपके गतिविधि यूआई व्यवहार को नियंत्रित करना चाहिए ...

और अपने टुकड़ा में जोड़ने के बारे में सूचित करने की जरूरत है। समस्या इस तथ्य में निहित है कि आपके पास उस गतिविधि में कोई उदाहरण नहीं है जिसके साथ एक ऑनसाइट चयनकर्ता सेटर सेट किया गया है। मैंने, व्यक्तिगत रूप से, यह सब कुछ करने की कोशिश की जिसे मैं काम करने के लिए सोच सकता था। इसमें शामिल हैं:

list = (ListView) vp.getRootView().findViewById(R.id.listMain); 
list.setOnItemSelectedListener(this); 

जहां सूची एक सूचीदृश्य है जिसे आप तत्काल बनाते हैं तो खंड में सूची में सेट करें। इस दृष्टिकोण के साथ समस्या यह है कि जब आप श्रोता को इस पर सेट करने का प्रयास करते हैं तो आपको एनपीई मिलता है। अगर आपको इसका उत्तर मिल जाए, तो कृपया इसे यहां पोस्ट करें। यह मुझे एक टन मदद करेगा।

मैंने लोगों को सुझाव दिया है कि मैं एक नया दृष्टिकोण लेता हूं और जब भी दर्शक को बुलाया जाता है तो सूची को फिर से बनाते हैं (वास्तव में पेजिंग के बिना ... स्वाइप में भ्रम पैदा करने के दौरान जब दृश्य वास्तविकता में कभी नहीं बदलता) और मैंने लोगों को एक सूचीफ्रेम का उपयोग करने का सुझाव दिया है ...ListFragment अच्छा होगा, लेकिन फिर आप ListFragment को छोड़कर अपने लेआउट में कुछ भी शामिल नहीं कर सकते हैं।

+0

इनपुट के लिए धन्यवाद। सैम (ऊपर) और मैंने इस पर थोड़ा सा काम किया और कई समाधानों की कोशिश की लेकिन कुछ भी काम नहीं कर रहा है। मैं लगभग सोच रहा हूं कि एंड्रॉइड इस तरह के फ़ंक्शन का समर्थन नहीं करता है। मेरी कठोरता मुझे बताती है कि मैं गलत हूं, और यह किया जा सकता है। – user1449018

0

आपकी फ्रैगमेंट एक्टिविटी में, OnItemSlectedListener का उपयोग करने के बजाय, शायद आप नौकरी करने के लिए एक स्थिर विधि का उपयोग कर सकते हैं। और इस विधि को पर इटैम चयन() (खंड में) पर कॉल करें।

1

अपना खुद का इंटरफ़ेस बनाएं और कॉलबैक शायद सबसे अच्छा समाधान है। अब मेरी गतिविधि

public class ModuleFragment extends ListFragment { 
    //... 
    private OnModuleSelectedListener mdListener; 

// this method makes sure my activity implements my interface. If not I show an error 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mdListener = (OnModuleSelectedListener) activity; 
      Log.d(TAG, "OnModuleSelectedListener Implemented !"); 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
       + " must implement OnSqSelectedListener"); 
     } 
    } 
// This is the standard onListItemClick, I use it to get data I need and give them to the Listener 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     l.getItemAtPosition(position); 
     HashMap<String, String> map = (HashMap<String, String>) l 
      .getItemAtPosition(position); 
     mdId = map.get("id"); 
     mdName = map.get("name"); 
     mdListener.onModuleSelected(mdId,mdName); 

    } 

    public interface OnModuleSelectedListener { 
     public void onModuleSelected(String mdId, String mdName); 
    } 
} 

यहाँ:

public class Main extends Activity implements OnModuleSelectedListener{ 
//... 
    public void onModuleSelected(String mdId, String mdName) { 
      //.. I do whatever I want with what I get from the list 
    } 
} 

आशा है कि यह आप थोड़ा मदद करता है मेरे एप्लिकेशन में मैं कुछ इस तरह से किया था। यह आपके प्रश्न का सबसे नज़दीकी उत्तर है जो मैं आपको दे सकता हूं।

0

टुकड़े की मूल गतिविधि में एक इंटरफेस लागू करने से आपकी समस्या हल हो जाएगी। उदाहरण के लिए। टेस्टफ्रैगमेंट में टेस्टफ्रैगमेंट लिस्टर नामक एक इंटरफ़ेस होता है। अपनी मूल गतिविधि में इस श्रोता इंटरफ़ेस को कार्यान्वित करें और कॉलबैक करने के लिए फ्रैगमेंट में इंटरफ़ेस का संदर्भ रखें। ऑनइटेम चयन किए गए लिस्टनर विधि पैरेंट गतिविधि पर कॉलबैक करें और शेष को सामान्य के रूप में प्रबंधित करें। कृपया नीचे नमूना कोड देखें।

public final class TestFragment extends Fragment { 

    TextView title; 
    ListView listView; 
    TestFragmentListener mActivity; 
    TestAdapter adapter; 

    public interface TestFragmentListener { 
     public void onItemSelected(Object o); 
    } 

    public static TestFragment newInstance(String content) { 
     TestFragment fragment = new TestFragment(); 
     return fragment; 
    } 

    @Override 
    public void onAttach(Activity activity) { 

     try { 
      mActivity = (TestFragmentListener) activity; 

     } catch (ClassCastException e) { 
      Log.e("Invalid listerer", e.getMessage()); 
     } 

     super.onAttach(activity); 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mActivity = null; 
    } 

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

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

     title = (TextView) vw.findViewById(R.id.textView1); 
     listView = (ListView) vw.findViewById(R.id.listView1); 

     return vw; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 

     TestAdapter adapter = new TestAdapter(); 

     listView.setAdapter(adapter); 

     listView.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView<?> arg0, View arg1, 
        int position, long arg3) { 
      } 
     }); 

     listView.setOnItemSelectedListener(new OnItemSelectedListener() { 

      @Override 
      public void onItemSelected(AdapterView<?> arg0, View arg1, 
        int arg2, long arg3) { 
       mActivity.onItemSelected(arg2); 

      } 

      @Override 
      public void onNothingSelected(AdapterView<?> arg0) { 
       // TODO Auto-generated method stub 

      } 
     }); 
     super.onActivityCreated(savedInstanceState); 
    } 

private class TestAdapter extends BaseAdapter { 

     @Override 
     public int getCount() { 
      return 100; 
     } 

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

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

     @Override 
     public View getView(int position, View convertView, ViewGroup container) { 

      TextView tv = new TextView((Activity) mActivity); 
      tv.setText(Integer.toString(position)); 
      return tv; 
     } 
    } 

} 
संबंधित मुद्दे