2012-04-23 11 views
5

मैं वर्तमान में एक ऐप बना रहा हूं जिसमें वेब पर एक अनुरोध भेजा जा रहा है, नतीजा तब पार्स हो जाता है और ऑब्जेक्ट्स के ऐरेलिस्ट में डाल दिया जाता है।एक सूचीदृश्य में कस्टम ऑब्जेक्ट्स तक पहुंच

यह सूची तब सूची सूची को पॉप्युलेट करती है। मैं onClickListener बनाना चाहता हूं जो मुझे यह जानने की अनुमति देगा कि किस ऑब्जेक्ट पर क्लिक किया गया था, लेकिन मुझे इसे लागू करने का सही तरीका नहीं मिल रहा है।

या तो मूल गतिविधि में ListView पर ऑनक्लिक को असाइन करें, या कस्टम एडाप्टर में getView फ़ंक्शन के भीतर श्रोता असाइन करें।

ऐसा लगता है कि getView में श्रोताओं को असाइन करना बहुत अधिक है।

यह कैसे काम करता है? क्या बेहतर है? मुख्य गतिविधि के लिए

कोड:

public class NoPicList extends Activity { 
    ListView list; 
    NoPicAdapter adapter; 
    ProgressDialog mDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.no_pic_list); 
     list = (ListView) findViewById(R.id.noPicListView); 

     Bundle b = getIntent().getExtras(); 
     String request = b.getString("REQUEST"); 
     mDialog = new ProgressDialog(this); 
     mDialog.setCancelable(false); 
     mDialog.setMessage("Lodaing Data"); 
     mDialog.show(); 

     new GetNewsAndCalendar().execute(request); 
    } 

    @Override 
    protected void onPause() { 
     mDialog.dismiss(); 
     super.onPause(); 
    } 

    class GetNewsAndCalendar extends 
     AsyncTask<String, Void, ArrayList<Message>> { 

     @Override 
     protected ArrayList<Message> doInBackground(String... params) { 
      String url = params[0]; 
      DOMFeedParser parser = new DOMFeedParser(url); 
      return parser.parse(); 
     } 

     @Override 
     protected void onPostExecute(ArrayList<Message> result) { 
      adapter = new NoPicAdapter(NoPicList.this, result); 
      list.setAdapter(adapter); 
      //FIRST OPTION TO INSERT onClickListener 
      mDialog.dismiss(); 
     } 
    } //end of GetNewsAndCalendar 
} 

सूची एडाप्टर के लिए कोड:

public class NoPicAdapter extends BaseAdapter { 

    private ArrayList<Message> data; 
    private Activity mActivity; 
    private LayoutInflater inflater = null; 

    public NoPicAdapter(Activity a, ArrayList<Message> result) { 
     mActivity = a; 
     data = result; 
     inflater = (LayoutInflater) mActivity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

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

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi = convertView; 
     if (convertView == null) 
      vi = LayoutInflater.from(mActivity).inflate(R.layout.no_pic_list_item, 
       null); 

     TextView title = (TextView) vi.findViewById(R.id.noPicTitle); 
     TextView subtitle = (TextView) vi.findViewById(R.id.noPicSubtitle); 

     title.setText(data.get(position).getTitle()); 
     subtitle.setText(data.get(position).getDate()); 
    // SECOND PLACE TO INSERT THE onClickListener 
     return vi; 
    } 
} 

उत्तर

3

मेरी चिंता का विषय के अनुसार, मूल गतिविधि है में ListView को onClick आवंटित अच्छा विचार, इसके बजाय इसे अपने कस्टम एडाप्टर के getView() में असाइन करना। क्योंकि आपके एडाप्टर के getView() में यह हमेशा एक नई View.onClick() बनाने रों जवाब की वस्तु ..

list.setOnItemClickListener(new OnItemClickListener() 
{ 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
    { 
    adapter.get(position); 
    // Get data from your adapter, the above code of line give the custom adapter's object of current position of selected list item  
    } 
}); 
+0

'setOnItemSelectedListener'? किस लिए? –

+0

@PareshMayani - ओह क्षमा करें, मेरी गलती यह थी ITemClickListener .. इसके लिए धन्यवाद। – user370305

+0

मुझे लगता है कि 'onClickListener' को' ITemSelectedListener 'पर नहीं मिल सकता है। इसके लिए इसे 'onItemSlectedListener' होना चाहिए – thepoosh

3

user370305 साथ सहमत हूं '।

तुम बस, बनाने कि अंदर आप onItemClick विधि मिल जाएगा के बाद आप क्लिक वस्तु की स्थिति मिल जाएगा, अपनी गतिविधि कक्षा में OnItemClickListener को लागू करने की जरूरत है।

@Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) { 
     // TODO Auto-generated method stub 
     MyObject clickedObject = (MyObject) adapter.getItem(position); 
     // MyObject is user-defined class 

    } 
+0

** adapter.getItem (स्थिति); ** उसे स्थिति चर वापस कर देगा। अपने एडाप्टर कोड को देखें .. और यह क्लास कास्ट अपवाद फेंक देगा .. – ngesh

+0

@ सैंडी हां यह है, मैंने अभी उसे ऑनइटम क्लाइक इवेंट को लागू करने का एक तरीका दिखाया है, बाकी हिस्सों के लिए उसे अपने हाथ से कोशिश करनी चाहिए। –

+0

@ सैंडी, 'getItem (स्थिति)' अभी लागू किया जा रहा है, मैंने अभी तक इसे लागू नहीं किया है ... – thepoosh

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