2013-09-26 11 views
6

In meiner benutzerdefinierten Liste Ansicht Elemente wiederholen.Position des Artikels ist für alle Artikel identisch. Code ist unterListenelement wiederholt in android angepasst listview

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

also was genau ist die Frage? –

+0

listview items erhalten repeated.suppose A, B, C, D sind Listenelemente, dann zeigt es A, B, C, D, A, B, C, D –

Antwort

13

versuchen diese, Sie müssen für jede convertview zu setTag().

@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

danke .. Ihre Arbeit jetzt .. –

+0

http: // Entwickler .android.com/training/verbessernde-layouts/smooth-scrolling.html. sein View-Halter nicht nur setTag. und View-Halter muss statisch sein, warum ist View-Halter endgültig? – Raghunandan

+0

@Raghunandan Danke für die Tipps –

1

ändern getView

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

initialisieren inflater in Ihrem Konstruktor. Entfernen Sie diese mLayout=new View(mContext) Coz Sie ein Layout mit mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null)

In Ihrem Konstruktor

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; 
} 

Verwenden Sie einen Blick Halter für smooth scrolling und Leistung aufblasen.

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 (Halter);' in Ihrer 'if (v == null)' Anweisung wird NPE verursachen. –

+0

@ Shubham, Bitte überprüfen Sie meine aktualisierten ans und danke für die Hervorhebung. –

0

Stellen Sie sicher, dass die convertView nicht null ist. Platziere also den gesamten Code nach dem if (convertView == null) { }, was sicherstellt, dass du eine convertView hast, deren Wert nicht null ist, indem du aus dem Kontext aufhebst, wenn dies der Fall ist.

@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 sollte nicht null sein. Das Auffinden von Views nach if (convertView == null) {} löst das Problem. –

Verwandte Themen