2013-09-26 109 views
6

在我的自定義列表視圖項目重複項目的位置是相同的所有項目。 代碼如下在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

那麼究竟是什麼問題? –

+0

listview items getting repeating.suppose A,B,C,D are list items then then shows that A,B,C,D,A,B,C,D –

回答

13

試試這個,你需要setTag()每個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

thanks..its working now .. –

+0

http:// developer .android.com /培訓/改進的佈局/光滑scrolling.html。它的視圖持有者不僅setTag。視圖持有者必須是靜態的爲什麼視圖持有者是最終的? – Raghunandan

+0

@Raghunandan謝謝你的提示 –

1

在構造函數更改getView

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

初始化吹氣。刪除此mLayout=new View(mContext)因爲你與mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null)

充氣佈局在你的構造

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

使用平滑滾動和性能視圖持有人。

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(holder);'在你的'if(v == null)'語句中會導致NPE。 –

+0

@ Shubham,請檢查我更新的答案,並感謝您突出顯示它。 –

0

確保convertView不爲空。因此,將if後面的所有代碼放在if(convertView == null){ }之後,以確保您有一個convertView的值不爲null,如果是的話就從上下文中膨脹。

@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不應該爲null。因此,在if(convertView == null){}之後查找視圖將解決該問題。 –