2012-01-01 12 views
11

क्या एडाप्टर में अपनी स्थिति के आधार पर आइटम दृश्य प्राप्त करना संभव है और ListView में दिखाई देने वाले दृश्यों में नहीं?एंड्रॉइड में सूचीदृश्य में किसी आइटम के लिए दृश्य कैसे प्राप्त करें?

मुझे getChildAt() और getItemIdAtPosition() जैसे कार्यों के बारे में पता है, हालांकि वे ListView के अंदर दृश्यमान दृश्यों के आधार पर जानकारी प्रदान करते हैं। मुझे यह भी पता है कि एंड्रॉइड दृश्यों को फिर से चलाता है जिसका अर्थ है कि मैं केवल सूची दृश्य में दृश्यमान दृश्यों के साथ काम कर सकता हूं।

मेरा उद्देश्य प्रत्येक आइटम के लिए सार्वभौमिक पहचानकर्ता होना है क्योंकि मैं कर्सर एडाप्टर का उपयोग कर रहा हूं इसलिए मुझे दृश्यमान वस्तुओं के सापेक्ष आइटम की स्थिति की गणना करने की आवश्यकता नहीं है।

उत्तर

1

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

+0

कोई विशेष समारोह है कि मैं इस्तेमाल कर सकते हैं? मैंने कर्सर एडाप्टर फ़ंक्शंस की पूरी सूची पढ़ी है, लेकिन उनमें से कोई भी getView() से अलग आईडी पर आधारित दृश्य नहीं देखता है जिसे बाहरी रूप से उपयोग करने की अनुशंसा नहीं की जाती है। –

+0

सूची को पॉप्युलेट करने के लिए आप किस डेटा संरचना का उपयोग कर रहे हैं? –

+0

मैं कर्सर एडाप्टर –

8

यहां बताया गया है कि मैंने इसे कैसे पूरा किया। मेरी (कस्टम) एडाप्टर वर्ग के भीतर:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView == null) { 
    LayoutInflater inflater = context.getLayoutInflater(); 
    view = inflater.inflate(textViewResourceId, parent, false); 
    final ViewHolder viewHolder = new ViewHolder(); 
    viewHolder.name = (TextView) view.findViewById(R.id.name); 
    viewHolder.button = (ImageButton) view.findViewById(R.id.button); 

    viewHolder.button.setOnClickListener 
     (new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
     int position = (int) viewHolder.button.getTag(); 
     Log.d(TAG, "Position is: " +position); 
     } 
    }); 

    view.setTag(viewHolder); 
    viewHolder.button.setTag(items.get(position)); 

    } else { 
    view = convertView; 
    ((ViewHolder) view.getTag()).button.setTag(items.get(position)); 
    } 


    ViewHolder holder = (ViewHolder) view.getTag(); 

    return view; 
} 

अनिवार्य रूप से चाल की स्थापना की और setTag और getTag विधियों के माध्यम से स्थिति सूचकांक पुनः प्राप्त करने के लिए है। items वैरिएबल ArrayList को संदर्भित करता है जिसमें मेरा कस्टम (एडाप्टर) ऑब्जेक्ट होता है।

गहन उदाहरणों के लिए this ट्यूटोरियल भी देखें। अगर आपको कुछ भी स्पष्ट करने की ज़रूरत है तो मुझे बताएं।

+0

मैंने इस दृष्टिकोण के बारे में सोचा। CursorAdapter में BindView getView को प्रतिस्थापित करता है, मैंने इस कोड का उपयोग करके प्रत्येक दृश्य के लिए एक टैग सेट करने का प्रयास किया: id.setText (cursor.getString (cursor.getColumnIndexOrThrow ("id"))); हालांकि, किसी कारण से आईडी निरंतर होने की बजाय हर दूसरे नंबर थी। वैसे भी, मैं आपके द्वारा प्रदान किए गए उदाहरण के आधार पर अपने कोड की समीक्षा करूंगा। –

3

मई यह आपके लिए सहायक हो सकता है। नीचे कोड देखें:

public static class ViewHolder 
{ 
    public TextView nm; 
    public TextView tnm; 
    public TextView tr; 
    public TextView re; 
    public TextView membercount; 
    public TextView membernm; 
    public TextView email; 
    public TextView phone; 
    public ImageView ii; 
} 
class ImageAdapter extends ArrayAdapter<CoordinatorData> 
{ 
    private ArrayList<CoordinatorData> items; 
    public FoodDriveImageLoader imageLoader; 
    public ImageAdapter(Context context, int textViewResourceId,ArrayList<CoordinatorData> items) 
    { 
     super(context, textViewResourceId, items); 
     this.items = items; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     View v = convertView; 
     ViewHolder holder = null; 
     if (v == null) 
     { 
      try 
      { 
       holder=new ViewHolder(); 
       LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       imageLoader = new FoodDriveImageLoader(FoodDriveModule.this); 
       v = vi.inflate(R.layout.virtual_food_drive_row, null); 
       //System.out.println("layout is null......."); 
       holder.nm = (TextView) v.findViewById(R.id.name); 
       holder.tnm = (TextView) v.findViewById(R.id.teamname); 
       holder.tr = (TextView) v.findViewById(R.id.target); 
       holder.re = (TextView) v.findViewById(R.id.received); 
       holder.membercount = new TextView(FoodDriveModule.this); 
       holder.membernm = new TextView(FoodDriveModule.this); 
       holder.email = new TextView(FoodDriveModule.this); 
       holder.phone = new TextView(FoodDriveModule.this); 
       holder.ii = (ImageView) v.findViewById(R.id.icon); 

       v.setTag(holder); 
      } 
      catch(Exception e) 
      { 
       System.out.println("Excption Caught"+e); 
      } 
     } 
     else 
     { 
      holder=(ViewHolder)v.getTag(); 
     } 
     CoordinatorData co = items.get(position); 
     holder.nm.setText(co.getName()); 
     holder.tnm.setText(co.getTeamName()); 
     holder.tr.setText(co.getTarget()); 
     holder.re.setText(co.getReceived()); 
     holder.ii.setTag(co.getImage()); 

     imageLoader.DisplayImage(co.getImage(), FoodDriveModule.this , holder.ii); 

     if (co != null) 
     { 
     } 
     return v; 
    } 

} 

आनंद लें। धन्यवाद।

0

यहाँ, इसका बहुत ही कम वर्णित कोड, आप सरल फिर से उपयोग viewholder पैटर्न सूचीदृश्य प्रदर्शन को बढ़ाने के लिए कर सकते हैं अपने getview में नीचे दिए गए कोड लिखें() विधि

ViewHolder holder = new ViewHolder(); 
    if (convertView == null) { 
     convertView = layoutInflater.inflate(R.layout.skateparklist, null); 
     holder = new ViewHolder(); 

     holder.headlineView = (TextView) convertView 
       .findViewById(R.id.textView1); 
     holder.DistanceView = (TextView) convertView 
       .findViewById(R.id.textView2); 
     holder.imgview = (NetworkImageView) convertView 
       .findViewById(R.id.imgSkatepark); 
     convertView.setTag(holder); //PLEASE PASS HOLDER AS OBJECT PARAM , CAUSE YOU CAN NOY PASS POSITION IT WILL BE CONFLICT Holder and Integer can not cast 
     //BECAUSE WE NEED TO REUSE CREATED HOLDER 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

// your controls/UI setup 
    holder.DistanceView.setText(strDistance); 
    ...... 
    return convertview 
1
Listview lv = (ListView) findViewById(R.id.previewlist); 

    final BaseAdapter adapter = new PreviewAdapter(this, name, age); 

    confirm.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 


      View view = null; 

      String value; 
      for (int i = 0; i < adapter.getCount(); i++) { 

       view = adapter.getView(i, view, lv); 

       Textview et = (TextView) view.findViewById(R.id.passfare); 


       value=et.getText().toString(); 

       Toast.makeText(getApplicationContext(), value, 
       Toast.LENGTH_SHORT).show(); 
      } 



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