Android 自定义listview每10项重复一次

Android 自定义listview每10项重复一次,android,listview,adapter,Android,Listview,Adapter,我的listview自定义适配器遇到了奇怪的问题 我的适配器每10次记录重复项目的ID 非常感谢您的帮助和/或想法 我的列表活动 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);

我的listview自定义适配器遇到了奇怪的问题 我的适配器每10次记录重复项目的ID

非常感谢您的帮助和/或想法

我的列表活动

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_backuplist); // Get main display layout
            lv = (ListView) findViewById(android.R.id.list);
            lists = new ArrayList<BackupListView>();

            int j = 50;
            for (int i = 0; i < 15; i++)
            {
        String fileName = ((i % 2) == 0) ? "sample.csv" : "sample.vcf";
        String fileExt  = ((i % 2) == 0) ? "csv" : "vcf";
        lists.add(new BackupListView(fileName + "\ndate 2014/05/20", j, fileExt, "210"));

        j++;
    }

    int x = lists.size();
    BackupListView[] toArray = new BackupListView[x];
    toArray = lists.toArray(toArray);

    adapter = new BackupListAdapter(this, R.layout.custom_backup_listview_rows, toArray);
    lv.setAdapter(adapter);
    lv.setClickable(true);
    lv.setOnItemClickListener(new OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id)
        {
            dspDialog();
        }
    });
}
初始化数组:

Map<Integer,boolean> checkBoxMap = new Map<Integer,boolean>();
剩余的所有侦听器和setText都应该在上述代码之后

final BackupListView lists = data[position];
        holder.tw.setText(lists.getText() + "  " + lists.getFileSize() + "kb");
        holder.id = lists.getId();

        Log.i("TEST ", "List getId " + lists.getId());

        // Check box event
        holder.cb.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if (((CompoundButton) v).isChecked())
                {
                    checkedItem.add("" + lists.getId());
                }
                else
                {
                    checkedItem.remove("" + lists.getId());
                }
            }
        });

        //  Set CSV file extension icon
        if(lists.getExt().equals("csv"))
            holder.im.setBackgroundResource(R.drawable.icon_csv);
        else
            holder.im.setBackgroundResource(R.drawable.icon_vcf);

        // Button event
        holder.bt.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                final View inflater;
                inflater = ((Activity) context).getLayoutInflater().inflate(
                        R.layout.dialog_filename_change, null);

                AlertDialog.Builder dialog = new AlertDialog.Builder(
                        context.getApplicationContext());
                dialog.setTitle("Enter Pass");
                dialog.setView(inflater);
                dialog.setInverseBackgroundForced(true);
                dialog.setNegativeButton("Cancel", null);
                dialog.setPositiveButton("OK", new OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        Intent i = new Intent(context.getApplicationContext(),
                                PhoneBookDetail.class);
                        i.putExtra("id", lists.getId());
                        context.startActivity(i);
                    }
                });
                dialog.create();

                Log.i("TEST", " Clicked " + lists.getId());

                //dialog.show();
            }
        });
我的意思是所有下面的cose都应该遵循上面的代码

final BackupListView lists = data[position];
        holder.tw.setText(lists.getText() + "  " + lists.getFileSize() + "kb");
        holder.id = lists.getId();

        Log.i("TEST ", "List getId " + lists.getId());

        // Check box event
        holder.cb.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if (((CompoundButton) v).isChecked())
                {
                    checkedItem.add("" + lists.getId());
                }
                else
                {
                    checkedItem.remove("" + lists.getId());
                }
            }
        });

        //  Set CSV file extension icon
        if(lists.getExt().equals("csv"))
            holder.im.setBackgroundResource(R.drawable.icon_csv);
        else
            holder.im.setBackgroundResource(R.drawable.icon_vcf);

        // Button event
        holder.bt.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                final View inflater;
                inflater = ((Activity) context).getLayoutInflater().inflate(
                        R.layout.dialog_filename_change, null);

                AlertDialog.Builder dialog = new AlertDialog.Builder(
                        context.getApplicationContext());
                dialog.setTitle("Enter Pass");
                dialog.setView(inflater);
                dialog.setInverseBackgroundForced(true);
                dialog.setNegativeButton("Cancel", null);
                dialog.setPositiveButton("OK", new OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        Intent i = new Intent(context.getApplicationContext(),
                                PhoneBookDetail.class);
                        i.putExtra("id", lists.getId());
                        context.startActivity(i);
                    }
                });
                dialog.create();

                Log.i("TEST", " Clicked " + lists.getId());

                //dialog.show();
            }
        });

lists变量是最终变量,用于指向特定位置的单击中。当视图被回收时。列表保持不变,因此可以获得重复项。请参见,您需要将更改保存在一个区域中,并更改从Thayener selam读取的项目(如列表),她在《凯塔·比尔米格斯特梅克》中饰演的亚尼在《凯蒂·尤克尔·尤尔松·索拉》中饰演的儿子凯蒂·塔格伦斯·耶尼在《凯蒂·米克·尤尔梅耶·阿尔》中饰演的角色让人耳目一新yorsun@ErsinG尤尔巴哈英语。这是英语问答site@Raghunandan当然,我会的。更有趣的是,我对电话列表使用了相同的适配器,但效果非常好。无论如何,我总是在我的每一个项目中使用列表适配器,但这是我第一次遇到这样的错误@谢谢你的链接。我刚刚读了它,但我不能为我的listview确定宽度和高度。谢谢回复。我已经做了,但不知怎么的,它不起作用。另一个问题是,当我单击列表中#1项处的复选框并快速从上到下从下到上滚动列表,然后在列表视图中选中#1处的复选标记“移动到随机项”。非常非常奇怪的情况。维护一个数组,如ArrayList arrayBool=new ArrayList();在checkBox onClick方法中,保持类似arrayBool[position]=checkBox.isChecked();在getView方法中,keep like checkBox.setChecked(arrayBool[position]);这将解决您的问题。用Map更改了我的答案。请检查此解决方案。我很抱歉,我不能处理这种情况,我想我需要更多的实际例子和更多的展示案例。
    if (convertView == null)
        {
            LayoutInflater inflate = ((Activity) context).getLayoutInflater();
            convertView = inflate.inflate(resID, null);

            holder = new CustomHolder();
            holder.cb = (CheckBox) convertView.findViewById(R.id.custom_checkbox);
            holder.im = (ImageView) convertView.findViewById(R.id.img_file_ext_icon);
            holder.tw = (TextView) convertView.findViewById(R.id.custom_textView);
            holder.bt = (ImageView) convertView.findViewById(R.id.custom_button);  convertView.setTag(holder); 
    } else {
     holder = (CustomHolder) convertView.getTag();  
    }
// Check box event
        holder.cb.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                checkBoxMap.put(position,((CompoundButton) v).isChecked())
            }
        });
holder.cb.setChecked(checkBoxMap.get(position));
final BackupListView lists = data[position];
        holder.tw.setText(lists.getText() + "  " + lists.getFileSize() + "kb");
        holder.id = lists.getId();

        Log.i("TEST ", "List getId " + lists.getId());

        // Check box event
        holder.cb.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if (((CompoundButton) v).isChecked())
                {
                    checkedItem.add("" + lists.getId());
                }
                else
                {
                    checkedItem.remove("" + lists.getId());
                }
            }
        });

        //  Set CSV file extension icon
        if(lists.getExt().equals("csv"))
            holder.im.setBackgroundResource(R.drawable.icon_csv);
        else
            holder.im.setBackgroundResource(R.drawable.icon_vcf);

        // Button event
        holder.bt.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                final View inflater;
                inflater = ((Activity) context).getLayoutInflater().inflate(
                        R.layout.dialog_filename_change, null);

                AlertDialog.Builder dialog = new AlertDialog.Builder(
                        context.getApplicationContext());
                dialog.setTitle("Enter Pass");
                dialog.setView(inflater);
                dialog.setInverseBackgroundForced(true);
                dialog.setNegativeButton("Cancel", null);
                dialog.setPositiveButton("OK", new OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        Intent i = new Intent(context.getApplicationContext(),
                                PhoneBookDetail.class);
                        i.putExtra("id", lists.getId());
                        context.startActivity(i);
                    }
                });
                dialog.create();

                Log.i("TEST", " Clicked " + lists.getId());

                //dialog.show();
            }
        });