2013-06-24 21 views
5

Basit olması gereken bir sorum var ama bunu çözemiyorum.Özel arrayadapter kullanmadan liste öğeleri göster

DragSortListView kullanıyorum. Her bir liste görünümü öğesinin orijinal konumuna sahip bir etiket vermek istiyorum. Kullanıcı yeniden siparişi verdiğinde, orijinal kimliğe sahip bir dize döndürmek istiyorum (kullanıcı ilk öğeyi sonuncuya taşıdıysa 2,3,4,1 gibi). Bir öğe silinirse, orignal kimliğini de bilmek isterim.

İşte kodum.

DragSortListView mainListView = (DragSortListView) findViewById(R.id.list_pages); 
String[] names = settings.getString("pages", "Error,error").split(",");  
ArrayList<String> list = new ArrayList<String>(Arrays.asList(names)); 
adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.row, list); 
mainListView.setAdapter(adapter); 
DragSortController controller = new DragSortController(mainListView); 
... 

Şimdi tüm öğeler arasında geçiş yapıp orijinal kimlikleriyle etiketler vermenin en iyi olacağını düşündüm. Ben adaptör ayarlanmış olsa bile, ancak bu liste görünümü boş görünüyor bu

for (int i = 0; i < mainListView.getCount(); i++) 
{ 
    View v = mainListView.getChildAt(i); 
    TextView tx = (TextView) v.findViewById(R.id.text); 
    tx.setTag(i); 
} 

gibi bir şey kullanarak öğeleri döngü çalışıyorum.

Özel bir ArrayAdapter kullanamıyorum, çünkü bir öğe düşürüldüğünde veya kaydırıldığında uygulama çökecektir.

Ek bilgi: Veriler bir yayın tarafından bir BroadcastReceiver kullanılarak döndürüldüğünde liste görünümü doldurulur. Bunun bunu etkilediğini sanmıyorum, ama asla bilemezsiniz.

Sorum: Daha Sonra onu erişebilmesi

  • nasıl, her liste-ürün orijinal pozisyonunu saklamak?

Şimdiden teşekkürler! Eğer özel bir Adapter kullanmak istemiyorsanız

cevap

8

, o zaman böyle yapmak sadece edebilirsiniz:

List<Item> dataForTheAdapter = new ArrayList<Item>(); 

    // 'dataRetrivedfromService' is the data, that gets returned by the service 
    for (int counter = 0; counter < dataRetrivedfromService.size(); counter++) { 
     dataForTheAdapter.add(new Item(dataRetrivedfromService.get(counter), counter)); 
    } 

    mContext = MyActivity.this; 
    mAdapter = new ArrayAdapter<Item>(mContext, R.layout.row, dataForTheAdapter); 

    ListView listView = (ListView) findViewById(R.id.listView); 
    listView.setAdapter(mAdapter); 

Bu kod oldukça açıktır. Şimdi Item.java sınıfına bakarak, toString() yöntemini geçersiz kıldığımı göreceksiniz. toString() yöntemi, ListView ile veriyi doldurmak için sağlanan nesneye çağrılır.

public class Item { 

    private String mText; 
    private int mPosition; 

    public Item(String text, int position) { 

     this.mText = text; 
     this.mPosition = position; 
    } 

    public int getPosition() { 

     return mPosition; 
    } 

    public void setPosition(int position) { 

     this.mPosition = position; 
    } 

    public String getText() { 

     return mText; 
    } 

    public void setText(String text) { 

     this.mText = text; 
    } 

    @Override 
    public String toString() { 

     return this.mText; 
    } 
} 

Şimdi özel bir Adaptörü yazmak zorunda olmayacak, ancak bir öğesinin nesne ile ListView doldurabilir. eğer çalışırsa

, Bunu sınamak için size ListView bir OnItemClickListener ayarlayabilir ve bunu:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       Toast.makeText(mContext, String.valueOf(mAdapter.getItem(position).getPosition()), Toast.LENGTH_SHORT).show(); 
      } 
     }); 
+0

Gerçekten yararlı cevap, teşekkürler Ahmed! Bu farklı bir bağdaştırıcı olduğundan, hala setDropListener() 've' setRemoveListener() 'değiştirdim, ancak bunu anlayacağım. Yaptığım anda, bunu tamamlandı olarak işaretleyeceğim :) Tekrar teşekkürler! –

+0

Bitti! Bu cevap mükemmeldi. Teşekkürler! –

İlgili konular