简体   繁体   English

在android自定义列表视图中重复列出项目

[英]List item repeating in android customized listview

In my customized list view items are repeating.position of item is same for all item. 在我的自定义列表视图中,项目正在重复。项目的位置对于所有项目是相同的。 code is below 代码如下

ListAdapter.java- 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;
}

  }

try this one, You need to setTag() for each convertview. 试试这个,你需要为每个转换视图设置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;

}

Change your getView 更改你的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 in your constructor. 在构造函数中初始化inflater。 Remove this mLayout=new View(mContext) coz you are inflating a layout with mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null) 删除这个mLayout=new View(mContext)因为你正在用mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null)给布局mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null)

In your constructor 在你的构造函数中

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

Use a View holder for smooth scrolling and performance. 使用View支架可以实现平滑滚动和性能。

http://developer.android.com/training/improving-layouts/smooth-scrolling.html 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;
}
// 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;
        }

    }

Make sure the convertView is not null. 确保convertView不为null。 Hence place all code after the if(convertView == null){ } which ensures you have a convertView whose value is not null, by inflating from context if so. 因此,将所有代码放在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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM