Android 与clear()有关的问题;ListViewAdWater中的语句放置
因此,当使用操作中的下拉菜单在片段之间切换时,我在listview中显示重复项时遇到问题,我放置了一个clear();语句修复了该问题,但使其下面的convertView.setOnClickListener崩溃。如果我移除清除();语句,然后一切正常,但我在listview中得到了重复的项。我正在使用ActionBarSherlock,此代码取自 任何帮助都将非常有助于找出所有东西是如何协同工作的。如果您需要任何其他代码,请告诉我Android 与clear()有关的问题;ListViewAdWater中的语句放置,android,android-listview,Android,Android Listview,因此,当使用操作中的下拉菜单在片段之间切换时,我在listview中显示重复项时遇到问题,我放置了一个clear();语句修复了该问题,但使其下面的convertView.setOnClickListener崩溃。如果我移除清除();语句,然后一切正常,但我在listview中得到了重复的项。我正在使用ActionBarSherlock,此代码取自 任何帮助都将非常有助于找出所有东西是如何协同工作的。如果您需要任何其他代码,请告诉我 public class ListViewAdapter ex
public class ListViewAdapter extends BaseAdapter
{
// Declare Variables
Context mContext;
LayoutInflater inflater;
private List<ErrorCode> errorcodelist = null;
private ArrayList<ErrorCode> arraylist;
public ListViewAdapter(Context context, List<ErrorCode> errorcodelist)
{
mContext = context;
this.errorcodelist = errorcodelist;
inflater = LayoutInflater.from(mContext);
this.arraylist = new ArrayList<ErrorCode>();
this.arraylist.addAll(errorcodelist);
}
public class ViewHolder
{
TextView errorName;
TextView codeValue;
TextView description;
TextView solution;
}
@Override
public int getCount()
{
return errorcodelist.size();
}
@Override
public ErrorCode getItem(int position)
{
return errorcodelist.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}
public View getView(final int position, View convertView, ViewGroup parent)
{
final ViewHolder holder;
if (convertView == null)
{
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.listview_item, null);
// Locate the TextViews in listview_item.xml
holder.errorName = (TextView) convertView.findViewById(R.id.errorName);
holder.codeValue = (TextView) convertView.findViewById(R.id.codeValue);
holder.description = (TextView) convertView.findViewById(R.id.description);
holder.solution = (TextView) convertView.findViewById(R.id.solution);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
// Set the results into TextViews
holder.errorName.setText(errorcodelist.get(position).getErrorName());
holder.codeValue.setText(errorcodelist.get(position).getCodeValue());
holder.description.setText(errorcodelist.get(position).getDescription());
holder.solution.setText(errorcodelist.get(position).getSolution());
errorcodelist.clear();
// Listen for ListView Item Click
convertView.setOnClickListener(new OnClickListener()
{
public void onClick(View arg0)
{
// Send single item click data to SingleItemView Class
Intent intent = new Intent(mContext, SingleItemView.class);
// Pass all data errorName
intent.putExtra("errorName",(errorcodelist.get(position).getErrorName()));
// Pass all data errorCode
intent.putExtra("codeValue",(errorcodelist.get(position).getCodeValue()));
// Pass all data description
intent.putExtra("description",(errorcodelist.get(position).getDescription()));
// Pass all data solution
intent.putExtra("solution",(errorcodelist.get(position).getSolution()));
// Start SingleItemView Class
mContext.startActivity(intent);
}
});
return convertView;
}
// Filter Class
public void filter(String charText)
{
charText = charText.toLowerCase(Locale.getDefault());
errorcodelist.clear();
if (charText.length() == 0)
{
errorcodelist.addAll(arraylist);
}
else
{
for (ErrorCode ec : arraylist)
{
// Search filter code
if (ec.getErrorName().toLowerCase(Locale.getDefault()).contains(charText))
{
errorcodelist.add(ec);
}
if (ec.getCodeValue().toLowerCase(Locale.getDefault()).contains(charText))
{
errorcodelist.add(ec);
}
}
}
notifyDataSetChanged();
}
}
您不能在自己的适配器方法中更改适配器正在迭代的列表,因为您正在更改位置。最糟糕的是清除该列表。这就解释了新的错误。因此,删除getView方法中的clear() 重复的项可能来自您的筛选器,因为如果一个项与错误和代码匹配,它可以添加两次。改为:
// Search filter code
if (ec.getErrorName().toLowerCase(Locale.getDefault()).contains(charText))
{
errorcodelist.add(ec);
}
else if (ec.getCodeValue().toLowerCase(Locale.getDefault()).contains(charText))
{
errorcodelist.add(ec);
}
如果清除列表,errorcodelist.get(position)将抛出异常listview项何时会被复制?当你点击或选择一个列表时?当我使用下拉菜单在片段之间切换时,我忘记写的道歉是当我得到副本时。每次切换时,它都会继续添加相同的listview项。我已经编辑了我的语句。显示yout片段的代码。也许问题就在那里。您是否尝试在fragment onResume方法中调用notifyDataSetChanged?抱歉,我的意思是在使用操作栏中的下拉菜单在片段之间切换时发生问题。这段代码是为我正在实现的搜索函数编写的,但它工作正常;在片段的onResume方法上。
// Search filter code
if (ec.getErrorName().toLowerCase(Locale.getDefault()).contains(charText))
{
errorcodelist.add(ec);
}
else if (ec.getCodeValue().toLowerCase(Locale.getDefault()).contains(charText))
{
errorcodelist.add(ec);
}