2012-08-19 17 views
5

tekrarlar:Android özel ListView Özel bir adaptörü seçimi arka plan

public class PhraseCustomAdapter extends BaseAdapter 
{ 
public String original[]; 
public String translation[]; 
public String transcription[]; 

public Activity context; 
public LayoutInflater inflater; 

public PhraseCustomAdapter(Activity context,String[] original, String[] translation, String[] transcription) { 
    super(); 

    this.context = context; 
    this.original = original; 
    this.translation = translation; 
    this.transcription = transcription; 

    inflater = LayoutInflater.from(context); 
    this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return original.length; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

public String getItemTranlation(int position) { 

    return translation[position]; 
} 

public String getItemTranscription(int position) { 
    // TODO Auto-generated method stub 
    return transcription[position]; 
} 

public String getItemOriginal(int position) { 
    // TODO Auto-generated method stub 
    return original[position]; 
} 


@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

static class ViewHolder 
{ 
    ImageView imgViewLogo; 
    TextView txtViewOriginal; 
    TextView txtViewTranslation; 
    TextView txtViewTranscription; 
} 

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

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

     holder.imgViewLogo = (ImageView) convertView.findViewById(R.id.imgViewLogo); 
     holder.txtViewOriginal = (TextView) convertView.findViewById(R.id.txtViewOriginal); 
     holder.txtViewTranslation = (TextView) convertView.findViewById(R.id.txtViewTranslation); 
     holder.txtViewTranscription = (TextView) convertView.findViewById(R.id.txtViewTranscription); 

     convertView.setTag(holder); 
    } 
    else 
     holder=(ViewHolder)convertView.getTag(); 


    holder.txtViewOriginal.setText(original[position]); 
    holder.txtViewTranslation.setText(translation[position]); 
    holder.txtViewTranscription.setText(transcription[position]); 

    return convertView; 
} 

}

Ve android4 tarzı çoklu seçim uygulamak gerekir (uzun basın, ardından öğeyi seçmek için tıklayın). Yani:

lview1 = (ListView) findViewById(R.id.listViewPhrase); 
    adapter = new PhraseCustomAdapter(this, original, translation, transcription); 
    lview1.setAdapter(adapter); 
    lview1.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
    lview1.setMultiChoiceModeListener(new MultiChoiceModeListener() { 

     @Override 
     public void onItemCheckedStateChanged(ActionMode mode, int position, 
               long id, boolean checked) { 
      View view; 
      if (checked){ 
       Log.v ("checked?", "YES"); 
       Log.v ("Position", Integer.toString(position)); 

       view = lview1.getChildAt(position); 
       view.setBackgroundColor(Color.LTGRAY); 


       original_list.add (adapter.getItemOriginal(position)); 
       translation_list.add (adapter.getItemTranlation(position)); 
       transcription_list.add (adapter.getItemTranscription(position)); 

       countSelected += 1; 
      } 
      if (!checked){ 
       Log.v ("checked?", "NO"); 
       Log.v ("Position", Integer.toString(position)); 


       for (int i = 0; i < original_list.size(); i++) 
       { 
        if (original_list.get(i) == adapter.getItemOriginal(position)){ 
         original_list.remove (i); 
         translation_list.remove (i); 
         transcription_list.remove (i); 
        } 
       } 
       countSelected -= 1; 
      } 


      mode.setTitle(Integer.toString(countSelected) + " " + getString(R.string.selectItem)); 
     } 

sorun: Ben uzun basın (örneğin, ilk madde) madde, 7 madde (arka planını değiştirerek) çok vurgulandığında. 7. öğenin vurgulandığı "unhighlight" ı yapmaya çalıştığımda, uygulama çöküyor. En son öğeyi tıklamaya çalışırsam, uygulama çöküyor. Ben Görünüm işlenen ve öğeleri geri dönüşüm nasıl hakkında bazı makaleler okudum, ama benim sorun için olası çözeltisini

UPD bilmiyorum:

V/checked?(24966): YES 
V/Position(24966): 7 
Shutting down VM 
threadid=1: thread exiting with uncaught exception (group=0x2b542210) 
AndroidRuntime(24966): FATAL EXCEPTION: main 
java.lang.NullPointerException 
at com.alextee.phrases.PhraseActivity$1.onItemCheckedStateChanged(PhraseActivity.java:145) 
at android.widget.AbsListView$MultiChoiceModeWrapper.onItemCheckedStateChanged(AbsListView.java:5688) 
at android.widget.AbsListView.performItemClick(AbsListView.java:1040) 
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2522) 
at android.widget.AbsListView$1.run(AbsListView.java:3183) 
at android.os.Handler.handleCallback(Handler.java:605) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
android.app.ActivityThread.main(ActivityThread.java:4441) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
at dalvik.system.NativeStart.main(Native Method) 
+0

Eğer LogCat stacktrace gönderebilir miyim
7. öğeyi kaldırdığınızda uygulamanız çöküyor? – tolgap

+0

Yayının sonuna eklendi. –

cevap

10

Liste görünümü karmaşıktır ve geri dönüşümü de çok fazladır. Liste görünümü için android geliştirici videolarını izlerseniz liste görünümü geri dönüşümü ve sorunları hakkında daha fazla bilgi edineceksiniz.
Uygulamanızdaki sorun, liste görünümünü geri dönüşüme bağlıyor.
Bir liste öğesinin arka planını tıkladıktan veya uzun tıkladıktan sonra arka plan değiştiğinde ve bu öğe cihazınızın görünür alanından dışarı kaydırıldığında, bu öğeye eklenen görünüm geri dönüştürülür ve başka bir liste öğesine ayrılır. Şu anda görünür olan. Yani şimdi bu öğe de vurgulanacaktır.
Bu resim listesi görünümü geri dönüşümünü anlatmaktadır:

enter image description here


aşağıdakileri yapmanız gereken bir liste görünümünde bir öğeyi vurgulayarak için:

  • liste görünümünde onItemClickListener ayarlayın.
  • onItemClick() yönteminde, görünümün arka planını değiştirin ve geçerli olarak vurgulanan konumu liste görünümünde kaydedin ve liste bağdaştırıcısındaki notifyDataSetChanged() öğesini çağırın. NotifyDataSetChanged() çağrısı, geçerli görünen öğeleri yeniden çizdiği için önemlidir.Liste onItemClick için

Kod böyle bir şey olmalı:

grid[pos].setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick (AdapterView<?> parent, 
        View v, int position, long Id) 
      { 
        highlighted = position; //highlighted is a global variable 
        //container is the root view of the list row layout 
        LinearLayout container = (LinearLayout)v.findViewById(R.id.container); 
        container.setBackgroundResource(R.drawable.highlighted_backg); 
        mListAdapter.notifyDataSetChanged(); 

      } 
    }); 

GetView() yöntemi şu şekilde uygulanmalıdır:

public View getView (int position, View convertView, ViewGroup parent) 
{ 
    ViewHolder holder; 

    if(convertView == null) { 
     convertView = inflater.inflate(R.layout.row_item, null); 
     holder = new ViewHolder(); 
     holder.itemName1 = (TextView)convertView.findViewById(R.id.text1); 
     ... 
     holder.container = (LineaLayout)convertView.findViewById(R.id.container); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    if(MainActivity.highlighted == position) { 
     holder.container.setBackgroundResource(R.drawable.highlighted_backg); 
    }else { 
     holder.foodItemCol1.setBackgroundResource(R.drawable.normal_back); 
    } 

    return convertView; 
} 
+0

Bana çok yardımcı oldu. Teşekkür ederim. –

+0

Mükemmel! En iyi çok güzel cevap! Ful lcode'u yüklemek için – Kay

+0

neyse? Bu durumun şu anki durumuma nasıl uyduğunu görmeye çalışıyorum ama biraz kayboldum –

1

Set: 7 öğeyi "belirtmeden" zaman LogCat çıktı işaretli durumuna göre getView() öğesinin arka plan rengi. Bunu doğrudan ListView'den elde edip edemeyeceğinizi bilmiyorum, aksi halde örneğin. bir Set ve o anda kontrol edilen konumları orada tutun. Daha sonra, getView() içinde, geçirilen konum bu ayardaysa, bu şekilde kontrol edilir ve arka planı buna göre ayarladığınız anlamına gelir. Değilse, arka planı işaretlenmemiş renge ayarlayın. Arka plan, 'kontrol edilen' renge ayarlanmış arka plana sahip bir geri dönüştürülmüş Görünüm verilebileceği için önemlidir.

Kontrol edilen öğeleri takip etmek için bir örnek here bulunabilir.

İlgili konular