[英]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.