Android 避免ListView项重复

Android 避免ListView项重复,android,listview,baseadapter,Android,Listview,Baseadapter,我试图在ListView中显示一些项目,后跟其子项目。为此,我将集合(ArrayList)传递给ListView适配器类以显示每个项。对于子项,我必须通过每个位置Id从SQLite数据库获取数据,并为每个子项创建动态视图。幸运的是,它显示了所有项目和子项目,但显示了多次。同样在加载后,当我单击某个动态视图时,列表再次创建了相同的视图3/4次 适配器类: @Override public View getView(int position, View convertView, ViewGroup

我试图在ListView中显示一些项目,后跟其子项目。为此,我将集合(ArrayList)传递给ListView适配器类以显示每个项。对于子项,我必须通过每个位置Id从SQLite数据库获取数据,并为每个子项创建动态视图。幸运的是,它显示了所有项目和子项目,但显示了多次。同样在加载后,当我单击某个动态视图时,列表再次创建了相同的视图3/4次

适配器类:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ViewHolder mViewHolder;
    LayoutInflater mInflater;

    if(convertView == null){
        mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mViewHolder = new ViewHolder();
        convertView = mInflater.inflate(R.layout.customincidentquestion, null);         
        mViewHolder.customLayout = (LinearLayout)convertView.findViewById(R.id.linearLayoutCustomIncidentQuestionList);
        mViewHolder.question = (TextView) convertView.findViewById(R.id.textViewQuestion);
        convertView.setTag(mViewHolder);
    } else {
        mViewHolder = (ViewHolder)convertView.getTag();
    }

    ArrayList<IncidentOptionHolder> mOptionCollection = new ArrayList<IncidentOptionHolder>();
    ArrayList<String> optionText = new ArrayList<String>();
    ArrayList<String> orderedId = new ArrayList<String>();
    Log.v("POSITION", String.valueOf(position));
    IncidentQuestionHolder mHolder = mQuestionData.get(position);
    String mServerId = mQuestionData.get(position).getId();
    Log.e("mServerId", mQuestionData.get(position).getId());



    String mQText = mHolder.getqText();
    Log.e("mQText", mQText);
    String mType = mHolder.getType();
    String mOrderId = mHolder.getOrderId();
    String mIsMandatory = mHolder.getIsMandatory();
    String mIsOption = mHolder.getIsOption();

            Log.v("Equality", "Not Equal");
            IncidentOption mOptions = new IncidentOption(mContext);
            mOptions.open();
            mOptionCollection = mOptions.getOptions(mServerId);
            mOptions.close();

            //if(mViewHolder.customLayout.getChildAt(0) == null){
                mViewHolder.question.setText(mQText);
            for (int i = 0; i < mOptionCollection.size(); i++) {
                //optionText.add(mOptionCollection.get(i).getOptionText());
                //orderedId.add(mOptionCollection.get(i).getOrderId());
                Log.e("mOptionCollection.get(i).getOptionText()", mOptionCollection.get(i).getOptionText());


                if (mType.equals("Cb")) {
                    Log.v("TYPE", "Check Box");
                    LinearLayout ll = new LinearLayout(mContext);
                    ll.setOrientation(LinearLayout.VERTICAL);
                    ll.setPadding(10, 10, 10, 10);
                    CheckBox product = new CheckBox(mContext);
                    product.setText(mOptionCollection.get(i).getOptionText());
                    product.setGravity(Gravity.CENTER_VERTICAL);
                    product.setBackgroundResource(R.drawable.bg_designs);
                    product.setPadding(50, 10, 10, 30);
                    ll.addView(product);
                    mViewHolder.customLayout.addView(ll);
                }

                else if (mType.equals("Ta")) {
                    LinearLayout ll = new LinearLayout(mContext);
                    ll.setOrientation(LinearLayout.VERTICAL);
                    ll.setPadding(10, 10, 10, 10);
                    Log.v("TYPE", "Text Box");
                    LinearLayout lll = new LinearLayout(mContext);
                    lll.setOrientation(LinearLayout.VERTICAL);
                    TextView tv = new TextView(mContext);
                    tv.setText(mOptionCollection.get(i).getOptionText());
                    lll.addView(tv);

                    EditText ta = new EditText(mContext);

                    ta.setPadding(10, 10, 10, 10);
                    ta.setBackgroundResource(R.drawable.bg_designs);
                    lll.addView(ta);
                    ll.addView(lll);
                    mViewHolder.customLayout.addView(ll);
                }

                else if (mType.equals("Rb")) {
                    LinearLayout ll = new LinearLayout(mContext);
                    ll.setOrientation(LinearLayout.VERTICAL);
                    ll.setPadding(10, 10, 10, 10);
                    Log.v("TYPE", "Radio Button");
                    RadioButton rb = new RadioButton(mContext);
                    rb.setText(mOptionCollection.get(i).getOptionText());
                    rb.setGravity(Gravity.CENTER_VERTICAL);
                    rb.setPadding(50, 10, 10, 30);
                    rb.setBackgroundResource(R.drawable.bg_designs);
                    ll.addView(rb);
                    mViewHolder.customLayout.addView(ll);
                }
                else{
                    Log.v("TYPE", "Nothing");
                }


            }


    return convertView;


}

public static class ViewHolder {
    public LinearLayout customLayout = null;
    public TextView question;
}
@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
视窗支架;
拉平机;
if(convertView==null){
mInflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
mViewHolder=新的视图持有者();
convertView=mInflater.充气(R.layout.customincidentquestion,null);
mViewHolder.customLayout=(LinearLayout)convertView.findViewById(R.id.linearLayoutCustomIncidentQuestionList);
mViewHolder.question=(TextView)convertView.findViewById(R.id.textViewQuestion);
setTag(mViewHolder);
}否则{
mViewHolder=(ViewHolder)convertView.getTag();
}
ArrayList mOptionCollection=新的ArrayList();
ArrayList optionText=新建ArrayList();
ArrayList OrderId=新的ArrayList();
Log.v(“位置”,String.valueOf(位置));
IncidentQuestionHolder mHolder=mQuestionData.get(位置);
字符串mServerId=mQuestionData.get(position.getId();
Log.e(“mServerId”,mQuestionData.get(position.getId());
字符串mQText=mHolder.getqText();
Log.e(“mQText”,mQText);
字符串mType=mHolder.getType();
字符串mOrderId=mHolder.getOrderId();
字符串mIsMandatory=mHolder.getIsMandatory();
字符串mIsOption=mHolder.getIsOption();
Log.v(“相等”、“不相等”);
IncidentOption mOptions=新IncidentOption(mContext);
mOptions.open();
mOptionCollection=mOptions.getOptions(mServerId);
mOptions.close();
//if(mViewHolder.customLayout.getChildAt(0)=null){
mViewHolder.question.setText(mQText);
对于(int i=0;i
对于子项,我不需要使用可扩展列表


有人能告诉我我在哪里犯了错误,导致ListView多次加载相同的项。

ArrayList mOptionCollection=new ArrayList();ArrayList optionText=new ArrayList();ArrayList OrderId=new ArrayList();将这行移出getView()。在构造函数之前在类内声明它们,然后重试。每次创建列表时。这可能是cause@EagleEye谢谢你的建议。我现在就试试。@EagleEye我已经试过了。但不幸的是它不起作用。结果与以前一样。你确定mOptionCollection和mQuestionData没有重复的项吗是的,我确定。收集的数据来自我的本地数据库。我知道问题是通过调用getView meth来解决的