2013-09-26 7 views
6

Nel mio elenco personalizzato, le voci sono ripetitive. La posizione dell'articolo è la stessa per tutti gli articoli. codice è sottoElenco voce che si ripete in listview personalizzato Android

ListAdapter.java-

public class ListAdapter extends BaseAdapter{ 

    private List<String> mName; 
private List<Drawable> mIcon; 
private Context mContext; 

public ListAdapter(Context mContext, List<String> Name, List<Drawable> Icon) { 
    this.mContext=mContext; 
    this.mName=Name; 
    this.mIcon=Icon; 
} 

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

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

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

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

    View mLayout; 
    TextView mText; 
    ImageView mImage; 
    CheckBox mCheckBox; 

    if(v==null){ 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     mLayout=new View(mContext); 
     mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null); 

     mText=(TextView) mLayout.findViewById(R.id.Name); 
     mImage=(ImageView) mLayout.findViewById(R.id.Icon); 
     mCheckBox=(CheckBox) mLayout.findViewById(R.id.mCheckbox); 

     mText.setText(mName.get(position)); 
     mImage.setImageDrawable(mIcon.get(position)); 

     mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton check, boolean isChecked) { 
       if(check.isChecked()){ 
        Toast.makeText(mContext, "..."+mName.get(position)+"..."+position, Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 
    } 
    else{ 
     mLayout=(View)v; 
    } 
    return mLayout; 
} 

    } 
+0

quindi qual è esattamente la domanda? –

+0

listview gli articoli si ripetono.supponiamo A, B, C, D sono voci di elenco quindi mostra A, B, C, D, A, B, C, D –

risposta

13

provare questo, è necessario setTag() per ogni convertview.

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    final ViewHolder mHolder; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.list_menu, null); 
     mHolder = new ViewHolder(); 

     mHolder.mText=(TextView) convertView.findViewById(R.id.appName); 
     mHolder.mImage=(ImageView) convertView.findViewById(R.id.appIcon); 
     mHolder.mCheckBox=(CheckBox) convertView.findViewById(R.id.mCheckbox); 

     convertView.setTag(mHolder); 

    } else { 
     mHolder = (ViewHolder) convertView.getTag(); 
    } 

    return convertView; 
} 

private class ViewHolder { 
    private TextView mText; 
    private ImageView mImage; 
    private CheckBox mCheckBox; 

} 
+1

grazie .. funziona ora .. –

+0

http: // developer .android.com/formazione/miglioramento-layout/liscia scrolling.html. il suo titolare di vista non solo setTag. e il titolare della vista deve essere statico perché il titolare della vista è definitivo? – Raghunandan

+0

@Raghunandan Grazie per i suggerimenti –

1

Cambia la tua GetView

LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mLayout=new View(mContext); 
    mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null); 

inizializzazione gonfiatore nel costruttore. Rimuovere questo mLayout=new View(mContext) coz si sta gonfiando un layout con mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null)

nel costruttore

LayoutInflater inflater; 
public ListAdapter(Context mContext, List<String> Name, List<Drawable> Icon) { 
this.inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
this.mContext=mContext; 
this.mName=Name; 
this.mIcon=Icon; 
} 

utilizzare una visualizzazione supporto per lo scorrimento regolare e prestazioni.

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

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

    ViewHolder vh; 
    if(convertView==null){ 
     vh = new ViewHolder(); 
     convertView =(LinearLayout) inflater.inflate(R.layout.list_menu, null); 

     vh.mText=(TextView) convertView.findViewById(R.id.Name); 
     vh.mImage=(ImageView) convertView.findViewById(R.id.Icon); 
     vh.mCheckBox=(CheckBox) convertView.findViewById(R.id.mCheckbox); 

     convertView.setTag(vh); 
    } else { 
     vh = (ViewHolder) convertView.getTag(); 
    } 

    vh.mText.setText(mName.get(position)); 
    vh.mImage.setImageDrawable(mIcon.get(position)); 
    vh.mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton check, boolean isChecked) { 
      if(check.isChecked()){ 
       Toast.makeText(mContext, "..."+mName.get(position)+"..."+position, Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 
    return convertView; 
} 

static class ViewHolder 
{ 
    TextView mText; 
    ImageView mImage; 
    CheckBox mCheckBox; 
} 
1
// try this 
public class ListAdapter extends BaseAdapter { 

     private List<String> mName; 
     private List<Drawable> mIcon; 
     private Context mContext; 

     public ListAdapter(Context mContext, List<String> Name, List<Drawable> Icon) { 
      this.mContext=mContext; 
      this.mName=Name; 
      this.mIcon=Icon; 
     } 

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

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

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

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

      ViewHolder holder; 

      if(v==null){ 
       holder = new ViewHolder(); 
       LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       v =(LinearLayout) inflater.inflate(R.layout.list_menu, null); 

       holder.mText=(TextView) v.findViewById(R.id.Name); 
       holder.mImage=(ImageView) v.findViewById(R.id.Icon); 
       holder.mCheckBox=(CheckBox) v.findViewById(R.id.mCheckbox); 

       v.setTag(holder); 
      } 
      else{ 
       holder = (ViewHolder) v.getTag(); 
      } 
      holder.mText.setText(mName.get(position)); 
      holder.mImage.setImageDrawable(mIcon.get(position)); 

      holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton check, boolean isChecked) { 
        if(check.isChecked()){ 
         Toast.makeText(mContext, "..."+mName.get(position)+"..."+position, Toast.LENGTH_SHORT).show(); 
        } 
       } 
      }); 
      v.setTag(holder); 
      return v; 
     } 

     class ViewHolder{ 
      TextView mText; 
      ImageView mImage; 
      CheckBox mCheckBox; 
     } 

    } 
+0

'v.setTag (titolare);' nella tua istruzione 'if (v == null)' causerà NPE. –

+0

@ Shubham, per favore controlla le mie ans aggiornate e grazie per averlo evidenziato. –

0

Assicurarsi che convertView non sia null. Quindi posiziona tutto il codice dopo if (convertView == null) { } che ti assicura di avere un valore convertView il cui valore non è nullo, gonfiandosi dal contesto se è così.

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

    if (convertView == null) { 
    LayoutInflater inflater = LayoutInflater.from(context); 
    convertView = inflater.inflate(R.layout.list_menu, parent, false); 
    } 

    TextView mText=(TextView) convertView.findViewById(R.id.appName); 
    ImageView mImage=(ImageView) convertView.findViewById(R.id.appIcon); 
    CheckBox mCheckBox=(CheckBox) convertView.findViewById(R.id.mCheckbox); 

    mText.setText(mName.get(position)); 
    mImage.setImageDrawable(mIcon.get(position)); 

    return convertView; 
} 
+0

contextView non dovrebbe essere nullo. Quindi trovare le viste dopo if (convertView == null) {} risolverà il problema. –