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