-1

私が取り組んでいる小さな「検索」の実装があります。listView は、クエリに一致する場合にアイテムを表示します。これは正常に機能しますが、メニューが非表示になり、再表示され、新しいクエリが作成されるたびに、すべての「検索可能」が積み重なっていきます。表示する必要があるものが 4 つある場合、最初に 4 が表示され、次に 8、次に 12 などが表示されます。

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;
    }           
}
4

3 に答える 3

1

menuItems にある listitems をクリアしてから、新しいクエリが作成された後に項目を追加してみてください。menuItems にある listitems をクリアしてから、新しいクエリが arraylist か何かになった後に項目を追加しようとしていますか?

于 2012-09-14T15:25:29.970 に答える
1

あなたが投稿した内容から確実に判断するのは難しいですが、新しい結果を新しいデータに置き換えるのではなく、menuItems に追加していると思います。

于 2012-09-14T15:26:03.710 に答える
0

私はあなたの問題をあまり理解していませんでした。しかし、あなたのコードをちらっと見るだけで、1つの問題が見えます

if (!isSearching) {
            convertView = inflater.inflate(R.layout.rbm_item, null);
        } else {
            convertView = inflater.inflate(R.layout.rbm_search_item, null);                 
        }

この部分が問題の原因になる可能性があります。リスト アダプターの getView メソッドは非常に頻繁に呼び出されるため、最小限の負担の少ない操作を含める必要があります。

リストアダプターのデフォルトの例を確認する場合。convertView が null に対してチェックされるため、再度インフレートする必要がなく、リストに表示されるビューの準備を高速化するために再利用されます。そして、これはあなたのコードでは起こっていません。

Efficient Adapter Example Android についての Google。

于 2012-09-14T15:30:35.200 に答える