2013-09-26 44 views
6

Trong các mục xem danh sách tùy chỉnh của tôi được lặp lại.vị trí của mục giống nhau cho tất cả các mục. code đang dướiMục danh sách lặp lại trong chế độ xem danh sách tùy chỉnh 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

vì vậy câu hỏi chính xác là gì? –

+0

mục listview được lặp lại.suppose A, B, C, D là các mục danh sách sau đó nó hiển thị A, B, C, D, A, B, C, D –

Trả lời

13

thử thế này, Bạn cần phải setTag() cho mỗi 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

cảm ơn .. làm việc ngay bây giờ .. –

+0

http: // nhà phát triển .android.com/training/improve-layouts/smooth-scrolling.html. người giữ khung nhìn của nó không chỉ setTag. và người giữ xem phải tĩnh tại sao người xem xem lại là người cuối cùng? – Raghunandan

+0

@Raghunandan Cảm ơn những lời khuyên –

1

Thay đổi getView bạn

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

Initialize inflater trong constructor của bạn. Di mLayout=new View(mContext) này coz bạn đang thổi phồng một cách bố trí với mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null)

Trong constructor của bạn

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

Dùng giữ Xem cho di chuyển mượt mà và hiệu suất.

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 (chủ);' trong câu lệnh 'if (v == null)' của bạn sẽ gây ra NPE. –

+0

@ Shubham, Vui lòng kiểm tra ans cập nhật của tôi và cảm ơn vì đã đánh dấu nó. –

0

Đảm bảo convertView không rỗng. Do đó, hãy đặt tất cả mã sau if (convertView == null) { } để đảm bảo bạn có một convertView có giá trị không phải là null, bằng cách tăng từ ngữ cảnh nếu có.

@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 không được rỗng. Do đó việc tìm kiếm các khung nhìn sau nếu (convertView == null) {} sẽ giải quyết vấn đề. –

Các vấn đề liên quan