2013-09-26 23 views
6

W moim dostosowanym widoku elementy listy powtarzają się.pozycja elementu jest taka sama dla wszystkich elementów. Kod jest poniżejElement listy powtarzany w niestandardowym widoku listy 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

jakie jest dokładnie pytanie? –

+0

item listview get repeatating.suppose A, B, C, D to elementy listy, a następnie pokazuje A, B, C, D, A, B, C, D –

Odpowiedz

13

próbować ten jeden, musisz być setTag() dla każdego 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

dzięki .. teraz działa .. –

+0

http: // programista .android.com/training/improvement-layouts/smooth-scrolling.html. jego uchwyt widoku nie tylko setTag. i uchwyt widoku musi być statyczny, dlaczego uchwyt widoku jest ostateczny? – Raghunandan

+0

@Raghunandan Dzięki za porady –

1

Zmień swoją getView

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

Initialize inflater w konstruktorze. Usuń ten mLayout=new View(mContext) coz jesteś pompowania układ z mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null)

W konstruktora

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

używać widoku uchwyt dla płynnego przewijania i wydajności.

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 (właściciel);' w twoim poleceniu 'if (v == null)' spowoduje NPE. –

+0

@ Shubham, Sprawdź moje zaktualizowane odpowiedzi i podziękowania za wyróżnienie. –

0

Upewnij się, że convertView nie ma wartości null. Dlatego umieść cały kod po znaku if (convertView == null) { }, który zapewnia, że ​​masz przekonwertowany widok, którego wartość nie jest zerowa, przez nadmuchanie z kontekstu, jeśli tak jest.

@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 nie powinien być pusty. Zatem znalezienie widoków po if (convertView == null) {} rozwiąże problem. –