2016-03-26 15 views
0

ListView'umdaki her satır için gizli bir kimlik değeri kaydetmem gerekiyor. Temel olarak, kodun ihtiyaç duyduğu ve kullanıcının görmesi gerekmeyen bir dize değeri içeren bir değişken.Android ListView Bağdaştırıcısında bir String değişkeninin saklanması

  1. Kullanıcı ViewHolder
  2. Baskı beyan String kurtulur saveName Button
  3. Değeri nameField EditText
  4. Clicks bir değer girer o

Not: Her satırın saklamak için String değerine sahip olduğunu unutmayın. Her satırın ViewHolder'da saklanan String değeri vardır. Ben bunu başarmaya çalışıyorum.

Benim yaklaşımım, String değişkenimi, ViewHolder sınıfında, söz konusu belirli satır için bu değeri koruyacağını umuyordu. Ancak, bağdaştırıcı bu satırı geri döndürdüğünde, dize değerinin boş bir dizeye sıfırlandığını fark ettim.

Adaptör:

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

     final ViewHolder holder; 

     if (convertView == null) { 
      inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.custom_row, null); 
      holder = new ViewHolder(); 
      holder.saveName = (Button) convertView.findViewById(R.id.saveName); 
      holder.nameField = (EditText) convertView.findViewById(R.id.nameField); 
      convertView.setTag(holder); 
     } 
     else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     //Button That saves what the user entered in the nameField to the String variable 
     holder.saveName.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
        holder.hidden_value = nameField.getText().toString(); 
      } 
     }); 

     //Just to check whether the value is saved when I recycle listview when scrolling 
     Log.d("test", holder.hidden_value); 
     //It logs an empty string. The value from the editext was not saved! 
} 

static class ViewHolder { 
     EditText nameField; 
     Button saveName; 
     String hidden_value = ""; 
} 

Neden değer dize kaydedilen almaz? Günlüğe kaydetmeye çalıştığımda boş bir dizeyi kaydeder! Neyi yanlış yapıyorum?

+1

"gizli dize kimliğinizi" bağdaştırıcınızın veri modelinde saklayın – pskink

+0

Maalesef, Veri modeli nedir? @pskink – Dinuka

+0

Bu dizeyi bir ArrayList'e yerleştirin ve onClick yönteminde notifyDatasetChanged() öğesini çağırın. Ayrıca, getItem (int position) ve getCount() yöntemlerinde, arraylist'inizi kullanın. – Ozgur

cevap

2

ViewHolder'da değeri saklayamazsınız. ViewHolder almak için holder = (ViewHolder) convertView.getTag(); kullanın. Bu ViewHolder, diğer görünümün form etiketidir, bu konumda sakladığınız ViewHolder değil.

private SparseArray<String> values = new SparseArray<>(); 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

     final ViewHolder holder; 

     if (convertView == null) { 
      inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.custom_row, null); 
      holder = new ViewHolder(); 
      holder.saveName = (Button) convertView.findViewById(R.id.saveName); 
      holder.nameField = (EditText) convertView.findViewById(R.id.nameField); 
      convertView.setTag(holder); 
     } 
     else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     //Button That saves what the user entered in the nameField to the String variable 
     holder.saveName.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
        values.put(position,nameField.getText().toString()); 
      } 
     }); 

     //Just to check whether the value is saved when I recycle listview when scrolling 
     Log.d("test", values.get(position,"null")); 
     //It logs an empty string. The value from the editext was not saved! 
} 

static class ViewHolder { 
     EditText nameField; 
     Button saveName; 
     String hidden_value = ""; 
} 
+0

Bunun işe yaradığından emin misin? SparseArray – Dinuka

+0

'da saklandıktan sonra bile boş değerler alıyorum. Kodunuzun bir kısmını sağlayabilirsiniz. –

2

şey ViewHolder "Görüntüleme" değil "Veri" tutmak gerekiyordu vardır. Uygulamanızı burada değiştirmelisiniz. Değerleri bağdaştırıcıya ilettiğiniz dizide saklayın. Bu, "Verilerinizi" tutan dizidir.

Yani, özel adaptörünün yapıcısı

public CategoryListViewAdapter(Context c, ArrayList<MyData> al) { 
    mContext = c; 
    mArrayList = al; 
    .... 
} 

Ve MyData Bu konu hakkında tam öğretici için kimlik alanını

class Mydata{ 
    String ID; 
    .... 
} 

bakınız this olacak gibi olacak. Bilmeniz gereken her şeye sahip.