0

上部に拡張可能なリストビューと検索バーを含むAndroidアプリを開発しています。したがって、編集テキストフィールドに何かを入力する場合は、展開可能なリストをフィルタリングする必要があります。

例:検索バーに「as 」と入力すると、リストには「 as sert」、「b as e」、「c as e」、「 assembling」などのエントリのみが表示されます

インターネットで数時間検索しましたが、この機能を実装できません。だから私はあなたが私を助けてくれることを本当に望んでいます(:

これが私の拡張可能リストアダプタです:

package my.pack;

public class ExpandableListAdapter extends BaseExpandableListAdapter {

    @Override
    public boolean areAllItemsEnabled() {
        return true;
    }

    private Context context;
    private ArrayList<String> groups;
    private ArrayList<ArrayList<Product>> children;

    public ExpandableListAdapter(Context context, ArrayList<String> groups,
            ArrayList<ArrayList<Product>> children) {
        this.context = context;
        this.groups = groups;
        this.children = children;
    }

    public void addItem(Product product) {
        if (!groups.contains(product.getGroup())) {
            groups.add(product.getGroup());
        }
        int index = groups.indexOf(product.getGroup());
        if (children.size() < index + 1) {
            children.add(new ArrayList<Product>());
        }
        children.get(index).add(product);

    }

    public Object getChild(int groupPosition, int childPosition) {
        return children.get(groupPosition).get(childPosition);
    }

    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    // Return a child view. You can load your custom layout here.

    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {
        Product product = (Product) getChild(groupPosition, childPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.productinsertchild,
                    null);
        }
        TextView tv = (TextView) convertView.findViewById(R.id.tvChild);
        tv.setText("   " + product.getpName());

        return convertView;
    }

    public int getChildrenCount(int groupPosition) {
        return children.get(groupPosition).size();
    }

    public Object getGroup(int groupPosition) {
        return groups.get(groupPosition);
    }

    public int getGroupCount() {
        return groups.size();
    }

    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    // Return a group view. You can load your custom layout here.

    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
        String group = (String) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.productinsertgroup,
                    null);
        }
        TextView tv = (TextView) convertView.findViewById(R.id.tvGroup);
        tv.setText(group);
        return convertView;
    }

    public boolean hasStableIds() {
        return true;
    }

    public boolean isChildSelectable(int arg0, int arg1) {
        return true;
    }

}

そして、ここで私のアクティビティ:ExpandableListViewがオンラインのmysqlサーバーからデータを取得することに注意してください。それが私が非同期タスクを使用している理由です。

package activities.shop;

public class ProductInsert extends BaseActivity {

    public static final String phpServerConnection = "url-to-php-file";
    public static final String phpgetGrocery = "url-to-php-file";

    static final int MY_DIALOG_ID = 0;
    protected static AppPreferences appPrefs;
    private getGroceryTask ggt = null;

    private ExpandableListAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        ExpandableListView listView = (ExpandableListView) findViewById(R.id.listView);

        listView.setOnChildClickListener(new OnChildClickListener() {

            public boolean onChildClick(ExpandableListView arg0, View arg1,
                    int arg2, int arg3, long arg4) {
                Toast.makeText(getBaseContext(), "Child clicked",
                        Toast.LENGTH_LONG).show();
                return false;
            }
        });

        listView.setOnGroupClickListener(new OnGroupClickListener() {

            public boolean onGroupClick(ExpandableListView arg0, View arg1,
                    int arg2, long arg3) {
                return false;
            }
        });

        adapter = new ExpandableListAdapter(this, new ArrayList<String>(),
                new ArrayList<ArrayList<Product>>());

        // Set this blank adapter to the list view
        listView.setAdapter(adapter);

        ggt = new getGroceryTask(this);
        ((getGroceryTask) ggt).execute();

    }

    @Override
    public int getContentViewId() {

        return R.layout.productinsert;
    }

    @Override
    protected Dialog onCreateDialog(int id) {

        ProgressDialog progressDialog = null;

        switch (id) {
        case MY_DIALOG_ID:
            progressDialog = new ProgressDialog(this);
            progressDialog.setMessage("Aktualisieren...");

            break;
        default:
            progressDialog = null;
        }

        return progressDialog;
    }

    final static class getGroceryTask extends
            SuperAsyncTask<String, String, Void> {

        ProductInsert activity;
        InputStream is = null;
        String result = "";

        public getGroceryTask(BaseActivity activity) {

            super(activity, MY_DIALOG_ID); // change your dialog ID here...
            this.activity = (ProductInsert) activity; // and your dialog will be
                                                        // managed
                                                        // automatically!
        }

        @Override
        protected Void doInBackground(String... params) {

            appPrefs = new AppPreferences(activity);

            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("uEmail", appPrefs
                    .getUserEmail()));

            try {
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost(phpgetGrocery);
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();

            } catch (Exception e) {
                Log.e("log_tag", "Error in http connection " + e.toString());
            }

            // convert response to string
            try {
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(is, "UTF-8"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                result = sb.toString();

            } catch (Exception e) {
                Log.e("log_tag", "Error converting result " + e.toString());
            }

            return null;
        }

        private Product get(int pid, String pName, String pKat) {
            return new Product(pid, pName, pKat);
        }

        @Override
        public void onAfterExecute() {

            try {

                JSONArray jArray = new JSONArray(result);
                for (int i = 0; i < jArray.length(); i++) {

                    JSONObject json_data = jArray.getJSONObject(i);

                    activity.adapter.addItem(get(json_data.getInt("pid"),
                            json_data.getString("pName"),
                            json_data.getString("pKat")));

                }

                activity.adapter.notifyDataSetChanged();

            } catch (JSONException e) {
                Log.e("log_tag", "Error parsing datauuuuuu " + e.toString());

            }
        }

    }

}
4

2 に答える 2

0

BaseExpandableListAdapterの代わりにCursorTreeAdapterから拡張することを検討してください。そうすれば、探している機能に対してgetFilterQueryProviderをオーバーライドできます(そして独自のFilterQueryProviderを提供できます)。確かに、これはMySQL DBからの結果をカーソルに変換する必要があることを意味しますが、そうするとフィルタリングプロセスがはるかに簡単になります。

それ以外の場合は、ListAdapterで独自のフィルターをオーバーライドgetFilter()して提供する必要があります(これはそれほど違いはありません)。さらに複雑になりますが、カーソル変換レイヤーを追加する必要はありません。

いずれの場合も、独自のtextChangedListenerをフィルター編集テキストに追加して、フィルターを呼び出します。

于 2012-04-06T16:54:49.333 に答える
0

拡張可能なリストビューの問題は、グループの親に関連付けられた子が多数ある場合、時間がかかることです。

むしろ、拡張可能なリストビューの事前入力されたアイテムでAutoCompleteTextViewを使用して、検索のスムーズな機能を実現し、上記の機能の代わりにユーザーの選択に基づいてリストを更新できるようにすることができます...エンドユーザーに影響を与える可能性があります上記の機能の経験....しかし、実装に非常に固執している場合は..onKeyDown機能またはtextvalidation機能で同じAutoCompleteTextViewを使用できます...

ウィジェットをご覧くださいhttp://developer.android.com/reference/android/widget/AutoCompleteTextView.html

于 2012-04-06T18:07:38.580 に答える