2011-09-22 12 views
5

Bölümler, bölümlere göre ayrılmış bir ListView olması için Sharkey'in SeparatedListAdapter sınıfını kullanıyorum.Android - SeparatedListAdapter - Nasıl doğru öğe pozisyonu açılır onClick?

Sınıf harika çalışıyor, ancak sahip olduğum sorun benim onListItemClick() işleyicim. Aşağıdaki kesiti alınmış listesi varsa:

--------- 
| A  | 
--------- 
| Alex | 
| Allan | 
--------- 
| B  | 
--------- 
| Barry | 
| Bart | 
| Billy | 
| Brian | 
--------- 
| C  | 
--------- 
etc... 

listedeki bir öğenin üzerine tıklayın istediğiniz

, öğenin position almak ve sonra onunla bir şeyler yapmak. Benim durumumda, listem, insanların adlarının dinamik bir listesidir. Adlar, listeye girmeden önce List<CustomClass> içine konan bir veritabanından gelir. Tıkladığım öğenin konumunu bilmek benim için önemli çünkü Liste nesnesindeki kişi hakkındaki diğer bilgileri belirlemek için position öğesini kullanıyorum.

Şimdi, sorun şu: Listede bir öğeyi tıklattığınızda, üstbilgiler, çıkarılabilir olmasalar bile öğe olarak sayılır.

Alex = 1 
Allan = 2 
Barry = 4 
Bart = 5 
Billy = 6 
Brian = 7 

şöyle Yukarıdaki örnekte, listedeki konumum Ama Alex gibi, bir öğenin üzerine tıkladığınızda orijinal List nesnenin sırası, yani

Alex = 0 
Allan = 1 
Barry = 2 
Bart = 3 
Billy = 4 
Brian = 5 

Yani gibidir benim kod, onClick işleyicisini çalıştırır, Alex'in 1 konumunda olduğunu ve daha sonra Allans bilgilerini, Alex'in yerine List'dan aldığını belirler.

Burada delima görüyor musunuz? Bu probleme almam gereken yaklaşım nedir?

cevap

7

listView'daki her öğeniz için setTag() kullanabilirsiniz. Bu, listAdapter'daki görünümü getView() işlevinden döndürmeden önce bu etiketi ekleyerek yapılabilir. Liste bağdaştırıcınızın convertView, ardından liste bağdaştırıcısında döndüğünü söyleyelim.

public View getView(int position, View convertView, ViewGroup parent) { 
      ViewHolder holder; 
      if (convertView == null) 
      { 
       convertView = mLayoutInflater.inflate(R.layout.morestores_list_item, null); 
       holder = new ViewHolder(); 

       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 
      // populate holder here, that is what you get in onItemClick. 
        holder.mNameofItem = "NameofaPerson"; 
      return convertView; 
     } 

static class ViewHolder { 
     TextView mName; 
     Button mAction; 
     ImageView mLogo; 
      // use this class to store the data you need, and use appropriate data types. 
      String mNameofItem. 
    } 

Eğer liste öğesinin üzerine bir tıklama olsun hiç listede öğenin konumunu gerekmez

public void onItemClick(AdapterView<?> arg0, View convertView, int arg2, 
      long arg3) { 
       ViewHolder holder = (ViewHolder) convertView.getTag(); 
       // holder has what ever information you have passed. 
       String nameofItemClicked = holder.mNameofItem; 
       // access the information like this. 
    } 

Bu yaklaşım kullanmak sadece farklı bir yaklaşım bildirmek istedim.

HTH.

+0

Bunu detaylandırabilir misiniz? teşekkürler – Jovan

+0

düzenlenmiş cevabı kontrol edin. –

1

Çözümüm, listedeki konumu almayı ve daha sonra nesneyi, bağdaştırıcıdaki o konumda almasını ve ardından özel parametre veya yöntemi kullanarak almasını sağlamak için bunu ListArray veya Hash'tan almak için kullanmaktı. ihtiyacım vardı. Şimdi çok açık ama ilk başta mantıklı değildi.

Bu kod, uzun bit yüzden sadece bir bakış verecektir oluyor GÜNCELLEME:

yerine liste öğesi için bir dize içinde geçen, özel bir nesnesi geçirin. Bu nesnenin depoladığı iki farklı değere sahip olduğunu söyleyelim. Bir ad (getName() kamu yöntemiyle geri alınabilir) ve bir kimlik (getId() ile geri alınabilir).

Bağdaştırıcı sınıfı için getView() yöntemini geçersiz kılmanız ve nesnenin getName() yöntemini kullanmanız ve liste metninde görüntülenecek metni kullanmanız gerekir.

Sonra, madde tıklandığında, sadece o pozisyonda adaptörden nesneyi almak ve sonra Kimliğini almak:

int id = adapter.get(position).getId(); 
// Then do something with the ID, pass it to an activity/intent or whatever. 

Ayrıca ben this lehine SeparatedListViewAdapter hendeğe. Çok daha iyi ve daha esnek imo.

İlk Harita 'an almaya değiştirerek: Bu kod deneyebilirsiniz

+0

Bu kod için bana "sadece adaptördeki bu nesneyi al" diyebilirsiniz – Jovan

+0

Teşekkür ederim ben de SeparatedListViewAdapter de sağladığınız bağlantı lehine hendek. Çok daha basit. :). Bu bağlantı için teşekkürler. – Veer

1
int idNo= adapter.get(position).getId(); 

...

1

Ben de son zamanlarda bu sorunla karşılaştık ve burada bitti herkesten için, çözülür id'

public Map<String,?> createItem(String title, String caption, String id) { 
    Map<String,String> item = new HashMap<String,String>(); 
    item.put(ITEM_TITLE, title); 
    item.put(ITEM_CAPTION, caption); 
    item.put("id", id); // Add a unique id to retrieve later 
    return item;} 

bir bölümün kimliği içerecek şekilde emin olun eklerken İkincisi:

List<Map<String,?>> GeneralSection = new LinkedList<Map<String,?>>(); 
      GeneralSection.add(createItem(FirstName[GeneralInt] + " " + LastName[GeneralInt], Whatever[GeneralInt], UniqueId[GeneralInt])); 
//Unique id could be populated anyway you like, database index 1,2,3,4.. for example like above question. 
      adapter.addSection("GeneralSection ", new SimpleAdapter(getActivity(), GeneralSection , R.layout.list_complex, 
      new String[] { ITEM_TITLE, ITEM_CAPTION }, new int[] { R.id.list_complex_title, R.id.list_complex_caption })); 
012 Bu kimse yardımcı

@Override 
     public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) { 
      // TODO Auto-generated method stub 

      Map<String, String> map = (Map<String, String>) arg0.getItemAtPosition(position); 
      String UniqueId = map.get("id"); 
      Log.i("Your Unique Id is", UniqueId); 
//Can then use Uniqueid for whatever purpose 
//or any other mapped data for that matter..eg..String FirstName = map.get("ITEM_TITLE"); 


    } 

Hope:

Nihayet doğru pozisyonunun 'kimlik' almak için ItemClickListener bir harita kullanın.

İlgili konular