Java ListView显示上次通过的数据以及当前pas的数据
我有一个小的“搜索”实现,我正在工作。列表视图显示与查询匹配的项目。这很好,但是每当菜单被隐藏并重新显示,并且进行新的查询时,所有的“可搜索项”都会继续堆积起来。如果我有4个应该显示的,首先它会显示4个,然后是8个,然后是12个,以此类推Java ListView显示上次通过的数据以及当前pas的数据,java,android,listview,android-adapterview,Java,Android,Listview,Android Adapterview,我有一个小的“搜索”实现,我正在工作。列表视图显示与查询匹配的项目。这很好,但是每当菜单被隐藏并重新显示,并且进行新的查询时,所有的“可搜索项”都会继续堆积起来。如果我有4个应该显示的,首先它会显示4个,然后是8个,然后是12个,以此类推 private class Adapter extends BaseAdapter { private LayoutInflater inflater; public Adapter(){ inflater = Layout
private class Adapter extends BaseAdapter {
private LayoutInflater inflater;
public Adapter(){
inflater = LayoutInflater.from(getContext());
}
@Override
public int getCount() {
return menuItems.size();
}
@Override
public Object getItem(int position) {
return menuItems.get(position).text;
}
@Override
public long getItemId(int position) {
return menuItems.get(position).id;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder = new ViewHolder();
if (!isSearching) {
convertView = inflater.inflate(R.layout.rbm_item, null);
} else {
convertView = inflater.inflate(R.layout.rbm_search_item, null);
}
holder.subMenuList = (LinearLayout) convertView.findViewById(R.id.sub_holder);
holder.text = (TextView) convertView.findViewById(R.id.rbm_item_text);
convertView.setTag(holder);
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (holder.subMenuList.getVisibility() == View.VISIBLE) {
holder.subMenuList.setVisibility(View.GONE);
} else {
holder.subMenuList.setVisibility(View.VISIBLE);
}
}
});
if (isSearching) {
holder.image = (ImageView) convertView.findViewById(R.id.rbm_item_icon);
holder.image.setImageResource(menuItems.get(position).icon);
holder.chapterId = (TextView) convertView.findViewById(R.id.id_text);
holder.chapterId.setText("Ch"+Integer.toString(menuItems.get(position).id));
} else {
holder.chapterId = (TextView) convertView.findViewById(R.id.rbm_item_id);
holder.chapterId.setText(Integer.toString(menuItems.get(position).id));
}
holder.text.setText(menuItems.get(position).text);
if (!isSearching) {
for (int i=0;i<menuItems.get(position).subItems.size();i++) {
TextView tv = new TextView(ctx);
tv.setTextColor(0xFF893658);
tv.setText(menuItems.get(position).subItems.get(i).getTitle());
tv.setCompoundDrawablesWithIntrinsicBounds(menuItems.get(position).subItems.get(i).getIcon(), 0, 0, 0);
tv.setCompoundDrawablePadding(5);
if (i == 0) {
if (menuItems.get(position).subItems.size() == 1) {
tv.setPadding(20, 20, 0, 20);
} else{
tv.setPadding(20, 20, 0, 10);
}
} else if (i == menuItems.get(position).subItems.size()-1){
tv.setPadding(20, 10, 0, 20);
} else {
tv.setPadding(20, 10, 0, 10);
}
holder.subMenuList.addView(tv);
}
}
return convertView;
}
class ViewHolder {
TextView text;
ImageView image;
LinearLayout subMenuList;
TextView chapterId;
}
}
私有类适配器扩展BaseAdapter{
私人充气机;
公共适配器(){
充气器=LayoutInflater.from(getContext());
}
@凌驾
public int getCount(){
返回menuItems.size();
}
@凌驾
公共对象getItem(int位置){
返回menuItems.get(position).text;
}
@凌驾
公共长getItemId(int位置){
返回menuItems.get(position.id);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
最终视图持有者=新的视图持有者();
如果(!正在搜索){
convertView=充气机。充气(R.layout.rbm_项,空);
}否则{
convertView=充气机。充气(R.layout.rbm\u搜索项,空);
}
holder.subnumlist=(LinearLayout)convertView.findViewById(R.id.sub_holder);
holder.text=(TextView)convertView.findViewById(R.id.rbm_item_text);
convertView.setTag(支架);
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
if(holder.subnumlist.getVisibility()==View.VISIBLE){
holder.subnumlist.setVisibility(View.GONE);
}否则{
holder.subnumlist.setVisibility(View.VISIBLE);
}
}
});
如果(正在搜索){
holder.image=(ImageView)convertView.findViewById(R.id.rbm_item_图标);
holder.image.setImageResource(menuItems.get(position.icon));
holder.chapterId=(TextView)convertView.findViewById(R.id.id\u text);
holder.chapterId.setText(“Ch”+Integer.toString(menuItems.get(position.id));
}否则{
holder.chapterId=(TextView)convertView.findViewById(R.id.rbm\u item\u id);
holder.chapterId.setText(Integer.toString(menuItems.get(position.id));
}
holder.text.setText(menuItems.get(position.text));
如果(!正在搜索){
对于(int i=0;i尝试清除菜单项中的listitems,然后在进行新查询后重新添加这些项。
是否尝试清除菜单项中的列表项,然后在新查询生成arraylist或其他内容后重新添加这些项?很难从您发布的内容中确定,但我猜您是在将新结果附加到菜单项,而不是用新数据替换它。我不太了解您的问题。bu我只是浏览了一下你的代码,就发现了一个问题
if (!isSearching) {
convertView = inflater.inflate(R.layout.rbm_item, null);
} else {
convertView = inflater.inflate(R.layout.rbm_search_item, null);
}
这一块可能是你的问题的原因。
列表适配器的getView方法被频繁调用,所以它应该包含最少且不太繁重的操作
如果您要检查列表适配器的默认示例,您将看到convertView被检查为空,这样它就不需要再次膨胀,并且再次被重用,以便更快地准备显示在列表中的视图。
这不会发生在你的代码中
谷歌关于高效适配器示例Android。你如何将新的可搜索结果放入菜单项中
?你从哪里获得菜单项以及菜单项是什么?部分问题是你总是在创建一个新的ListView项,你从来没有使用适配器的回收器……你能告诉代码你是怎么做的吗that@Sam,corr等等。这导致了很多问题。我重复使用列表、人员和适配器执行许多不同的任务。删除该检查是它工作的唯一方法。列表的长度永远不会超过10左右,因此不应该有巨大的形式影响。当菜单“显示”时,我清除了menuItems中的所有数据,但我可以尝试在查询更改时清除它们。您的问题得到解决方案了吗?是的。就是这样。我有一个文本监视程序,所以每次查询字符串更改时我都会清除菜单项。看起来有点过火,但它工作正常,所以我不会抱怨