【问题标题】:Data repeating in android list viewandroid列表视图中重复的数据
【发布时间】:2011-09-09 09:04:31
【问题描述】:

我有一个列表视图,其适配器位于不同包的不同类中。现在我必须从数据库中获取数据,然后使用这些数据为我的列表视图设置适配器。因此,我创建了一个 ArryList 并将其传递给 Adapter 的构造函数,同时为列表视图查看它。但问题是数据在重复。例如 - 数组列表中有 12 个不同的字符串,但我得到的是 - 按顺序排列的前五个元素,然后重复相同的五个元素。数据计数始终正确,但位置始终为 0,1,2,3,4 。我不明白问题是什么。这是代码-

public class CheckboxAdapter extends BaseAdapter{

    LayoutInflater inflater ;
    ArrayList<String> mData = new ArrayList<String>();

    //constructor for lesion adapter
    public CheckboxAdapter (Context context, ArrayList<String> data){
        inflater = LayoutInflater.from(context);
        mData = data;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mData.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(int position, View convertView, ViewGroup parent) {
        if (convertView == null){
            Log.v("pos", ""+position);
            convertView = inflater.inflate(R.layout.e_lesion_liststyle, null);          
            final CheckBox cb = (CheckBox) convertView.findViewById(R.id.disease_lesion_checkbox);
            cb.setText(mData.get(position));
            cb.setOnClickListener(new OnClickListener() {           
                @Override
                public void onClick(final View v) {
                    cb.setButtonDrawable(R.drawable.check_box_1);
                }
            });
        }//end of if condition
        return convertView;
    }

【问题讨论】:

  • Ankit 你也可以粘贴你从 db 获取数据并创建 mData arraylist 的类的代码。
  • 嗨拉胡尔!实际上我已经检查了那部分。没关系。我从数据库中获取正确的数据,并且当我在构造函数中传递 Arraylist 时,它确实保存了有效数据。仅当我将数据设置为行 cb.settext(mData.get(position)); 上的列表视图时这个问题来了,因为位置索引总是相同的,即 0,1,2,3,4
  • 好的,屏幕上一次可以看到多少行。是 5-6 点吗?
  • 问题已解决。问题出在 convertView 上,正如 Vineet 正确指出的那样。如果 convetView != null 并在其中设置数据,我正在检查条件,这是不正确的。我们应该使用 View Holders 在这些 if-else 条件之外进行设置数据部分。
  • @rahul: 是的,一次只能在屏幕上看到 5 行

标签: android listview adapter


【解决方案1】:

试试这个..只要写出条件之外的所有代码期望膨胀代码..

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null){
            Log.v("pos", ""+position);
            convertView = inflater.inflate(R.layout.e_lesion_liststyle, null);   
           }       //end of if condition
            final CheckBox cb = (CheckBox) convertView.findViewById(R.id.disease_lesion_checkbox);
            cb.setText(mData.get(position));
            cb.setOnClickListener(new OnClickListener() {           
                @Override
                public void onClick(final View v) {
                    cb.setButtonDrawable(R.drawable.check_box_1);
                }
            });

        return convertView;
    }

【讨论】:

  • @CapDroid 我对数据绑定到 android 中的视图非常陌生,并且来自使用 C# 的 .net 中继器样式。你能告诉我关于 R.layout.e_lesion_liststyle 的事吗?我猜这是一个通用布局,用于重复给定的字符串数据?提前谢谢你。例如,我有一个 LocationHistory 类型的数组列表,该对象主要包含字符串,我希望在布局的某种视图中显示每一行。除了更改适配器类中的数据类型之外,我是否必须创建一个通用布局,该布局使用 LocationHistory 数据扩展到主布局?
猜你喜欢
  • 2016-09-27
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多