Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么我的listview中会有重复的项目?_Android_Listview - Fatal编程技术网

Android 为什么我的listview中会有重复的项目?

Android 为什么我的listview中会有重复的项目?,android,listview,Android,Listview,我已经检查了数组菜单项,看起来不错,但是下面的代码中有一些错误。 当我开始的时候,它看起来还可以,但当我开始滚动的时候,它就被搞砸了,把项目放在列表的顶部,然后复制项目……这很奇怪 public class ScoresAdapter extends BaseAdapter { private MainActivity activity; private ScoreItem[] menuItems; private static LayoutInflater inflater=null; Im

我已经检查了数组菜单项,看起来不错,但是下面的代码中有一些错误。 当我开始的时候,它看起来还可以,但当我开始滚动的时候,它就被搞砸了,把项目放在列表的顶部,然后复制项目……这很奇怪

public class ScoresAdapter extends BaseAdapter {

private MainActivity activity;
private ScoreItem[] menuItems;
private static LayoutInflater inflater=null;
ImageDownloader downloader;

public ScoresAdapter(MainActivity a, ScoreItem[] scoreItems) {
    activity = a;
    menuItems = scoreItems;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    downloader = new ImageDownloader();
}

public int getCount() {
    int teller = 0;

    for(int i = 0 ; menuItems.length > i ; i++){
        if(menuItems[i] != null){
            teller++;
        }
    }

    return teller;
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

public View getView(final int position, View convertView, ViewGroup parent) {        
    View vi=convertView;
    if(convertView==null){    
        if(menuItems[position].getId() == 888){
            //fav header
            vi = inflater.inflate(R.layout.scoresheaderfavoriet, null);

        }else if(menuItems[position].getId() == 999){
            //overige header
            vi = inflater.inflate(R.layout.scoresheaderoverig, null);

        }else{



            if(menuItems[position].getIsFav()){
                vi = inflater.inflate(R.layout.scoresfavitem, null);
            }else{
                vi = inflater.inflate(R.layout.scoresitem, null);
            }

            TextView text2=(TextView)vi.findViewById(R.id.position);
            text2.setText(""+ menuItems[position].getPosition());

            TextView text=(TextView)vi.findViewById(R.id.name);
            text.setText(menuItems[position].getFirstName() + " " + menuItems[position].getLastName().toUpperCase());

            TextView text5=(TextView)vi.findViewById(R.id.country);
            text5.setText(""+ menuItems[position].getCountry());

            TextView text3=(TextView)vi.findViewById(R.id.score);
            text3.setText(""+ menuItems[position].getScore());

            TextView text8=(TextView)vi.findViewById(R.id.hole);
            text8.setText(""+ menuItems[position].getHole());

            vi.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    Intent intent = new Intent(v.getContext(), SpelerView.class);
                    intent.putExtra("id", menuItems[position].getId());
                    v.getContext().startActivity(intent);

                    activity.sluitAlleMenus();
                }
            });
        }


    }



    return vi;
}
}

我曾经有过同样的问题。我认为这是因为适配器的“缓存”…您应该实现一个类似以下的其他方法:

 if(convertView==null){
     holder = new NodeViewHolder();
     //Your stuff
     convertView.setTag(holder);
 }else{
     holder = (NodeViewHolder) convertView.getTag();
 }

 public static class NodeViewHolder {
    TextView text;
    TextView text2;
    TextView text3;
    //So on...
 }
public View getView(final int position, View convertView, ViewGroup parent) {        
    View vi=convertView;
    if(convertView==null){    
        if(menuItems[position].getId() == 888){
            //fav header
            vi = inflater.inflate(R.layout.scoresheaderfavoriet, null);

        }else if(menuItems[position].getId() == 999){
            //overige header
            vi = inflater.inflate(R.layout.scoresheaderoverig, null);

        }else{



            if(menuItems[position].getIsFav()){
                vi = inflater.inflate(R.layout.scoresfavitem, null);
            }else{
                vi = inflater.inflate(R.layout.scoresitem, null);
            }


        }


    }
            TextView text2=(TextView)vi.findViewById(R.id.position);
            text2.setText(""+ menuItems[position].getPosition());

            TextView text=(TextView)vi.findViewById(R.id.name);
            text.setText(menuItems[position].getFirstName() + " " + menuItems[position].getLastName().toUpperCase());

            TextView text5=(TextView)vi.findViewById(R.id.country);
            text5.setText(""+ menuItems[position].getCountry());

            TextView text3=(TextView)vi.findViewById(R.id.score);
            text3.setText(""+ menuItems[position].getScore());

            TextView text8=(TextView)vi.findViewById(R.id.hole);
            text8.setText(""+ menuItems[position].getHole());

            vi.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    Intent intent = new Intent(v.getContext(), SpelerView.class);
                    intent.putExtra("id", menuItems[position].getId());
                    v.getContext().startActivity(intent);

                    activity.sluitAlleMenus();
                }
            });





    return vi;
}

它将在缓存视图时执行(非空)

如果您的convertView未正确为空,则不会处理该情况。按如下方式更改代码:

 if(convertView==null){
     holder = new NodeViewHolder();
     //Your stuff
     convertView.setTag(holder);
 }else{
     holder = (NodeViewHolder) convertView.getTag();
 }

 public static class NodeViewHolder {
    TextView text;
    TextView text2;
    TextView text3;
    //So on...
 }
public View getView(final int position, View convertView, ViewGroup parent) {        
    View vi=convertView;
    if(convertView==null){    
        if(menuItems[position].getId() == 888){
            //fav header
            vi = inflater.inflate(R.layout.scoresheaderfavoriet, null);

        }else if(menuItems[position].getId() == 999){
            //overige header
            vi = inflater.inflate(R.layout.scoresheaderoverig, null);

        }else{



            if(menuItems[position].getIsFav()){
                vi = inflater.inflate(R.layout.scoresfavitem, null);
            }else{
                vi = inflater.inflate(R.layout.scoresitem, null);
            }


        }


    }
            TextView text2=(TextView)vi.findViewById(R.id.position);
            text2.setText(""+ menuItems[position].getPosition());

            TextView text=(TextView)vi.findViewById(R.id.name);
            text.setText(menuItems[position].getFirstName() + " " + menuItems[position].getLastName().toUpperCase());

            TextView text5=(TextView)vi.findViewById(R.id.country);
            text5.setText(""+ menuItems[position].getCountry());

            TextView text3=(TextView)vi.findViewById(R.id.score);
            text3.setText(""+ menuItems[position].getScore());

            TextView text8=(TextView)vi.findViewById(R.id.hole);
            text8.setText(""+ menuItems[position].getHole());

            vi.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    Intent intent = new Intent(v.getContext(), SpelerView.class);
                    intent.putExtra("id", menuItems[position].getId());
                    v.getContext().startActivity(intent);

                    activity.sluitAlleMenus();
                }
            });





    return vi;
}
那会让你走到那里。如果(convertView==null),您可能还需要将一些收藏夹和/或页脚逻辑移出
if(convertView==null)
。但是我不能确切地告诉你你在用它做什么,所以我不能确定它应该是怎样的。

我也有同样的问题

    public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    CalendarsData c = (CalendarsData) this.getItem(position);

    if (convertView == null) {
        holder=new ViewHolder();
        convertView = l_Inflater.inflate(R.layout.preference_list_element, null);

        holder.text=(CheckBox)convertView.findViewById(R.id.checkTextView);         
        //holder.tv =(TextView)convertView.findViewById(R.id.textview);

        holder.text.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                CheckBox cb = (CheckBox) v;
                CalendarsData ssi = (CalendarsData) cb.getTag();
                ssi.setChecked(cb.isChecked());
            }
        });             

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }   

holder.text.setText("c.anyvalue");
return convertView;
}               
就像上面的人说你需要其他人:

} else {
        holder = (ViewHolder) convertView.getTag();

如果convertView不为null,则不需要对其执行任何操作,但应该这样做。convertView-是屏幕外的回收项目。您已经向它传递了数据。所以,你们应该改变这个数据。@Jay Biggue,若你们有解,那个么我也有同样的结果issue@PankajAndroid还需要帮助吗?