Soru & Cevap

Searchview ve JSON ...

23.05.2016 - 02:42

Merhabalar, JSON ile mysqlden verileri çekebiliyorum, çektiğim verileri listview'de de gösterebiliyorum. Ama searchview ile listview in içerisinde anlık arama yaptıramıyorum. Her şey normal gidiyor ama arama kısmına yazar yazmaz hata verip kapanıyor. 

Yani aslında yapmak istediğim, listviewe searchview uygulamak. Aşağıda kodlar ve hata mnesajı var.

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends Activity implements SearchView.OnQueryTextListener{
    private String jsonResult;
    private String url = "http://192.168.81.5/sql/a.php";
    private ListView listView;
    ArrayAdapter<String> adapter;
    SearchView search_view;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.list_view);
        search_view = (SearchView) findViewById(R.id.search_view);
        accessWebService();


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }



    // Async Task to access the web
    private class JsonReadTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(params[0]);
            try {
                HttpResponse response = httpclient.execute(httppost);
                jsonResult = inputStreamToString(
                        response.getEntity().getContent()).toString();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        private StringBuilder inputStreamToString(InputStream is) {
            String rLine = "";
            StringBuilder answer = new StringBuilder();
            BufferedReader rd = new BufferedReader(new InputStreamReader(is));

            try {
                while ((rLine = rd.readLine()) != null) {
                    answer.append(rLine);
                }
            } catch (IOException e) {
                // e.printStackTrace();
                Toast.makeText(getApplicationContext(),
                        "Error..." + e.toString(), Toast.LENGTH_LONG).show();
            }
            return answer;
        }

        @Override
        protected void onPostExecute(String result) {
            ListDrwaer();
        }
    }// end async task

    public void accessWebService() {
        JsonReadTask task = new JsonReadTask();
        // passes values for the urls string array
        task.execute(new String[]{url});
    }

    // build hash set for list view
    public void ListDrwaer() {
        List<Map<String, String>> employeeList = new ArrayList<Map<String, String>>();

        try {
            JSONObject jsonResponse = new JSONObject(jsonResult);
            JSONArray jsonMainNode = jsonResponse.optJSONArray("emp_info");

            for (int i = 0; i < jsonMainNode.length(); i++) {
                JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
                String name = jsonChildNode.optString("Name");
                String surname = jsonChildNode.optString("Surname");
                String outPut = name + " " + surname;
                employeeList.add(createEmployee("employees", outPut));
            }
        } catch (JSONException e) {
            Toast.makeText(getApplicationContext(), "Error" + e.toString(),
                    Toast.LENGTH_SHORT).show();
        }

        SimpleAdapter adapter = new SimpleAdapter(this, employeeList,
                android.R.layout.simple_list_item_1,
                new String[]{"employees"}, new int[]{android.R.id.text1});
        listView.setAdapter(adapter);
        search_view.setOnQueryTextListener(this);

    }

    private HashMap<String, String> createEmployee(String name, String surname) {
        HashMap<String, String> employeeNameNo = new HashMap<String, String>();
        employeeNameNo.put(name, surname);
        return employeeNameNo;
    }
    @Override
    public boolean onQueryTextSubmit(String query) {
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        adapter.getFilter().filter(newText);
        return false;
    }
}

 

 

Aşağıdakiler de arama yapmaya başladığımda çıkan hata mesajları 

05-23 07:45:17.905 29930-29930/com.example.alper.json E/InputEventSender: Exception dispatching finished signal.
05-23 07:45:17.905 29930-29930/com.example.alper.json E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
05-23 07:45:17.906 29930-29930/com.example.alper.json E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'android.widget.Filter android.widget.ArrayAdapter.getFilter()' on a null object reference
                                                                              at com.example.alper.json.MainActivity.onQueryTextChange(MainActivity.java:145)
                                                                              at android.widget.SearchView.onTextChanged(SearchView.java:1209)
                                                                              at android.widget.SearchView.-wrap9(SearchView.java)
                                                                              at android.widget.SearchView$9.onTextChanged(SearchView.java:1682)
                                                                              at android.widget.TextView.sendOnTextChanged(TextView.java:7991)
                                                                              at android.widget.TextView.handleTextChanged(TextView.java:8053)
                                                                              at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:10157)
                                                                              at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:1033)
                                                                              at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:559)
                                                                              at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:492)
                                                                              at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:491)
                                                                              at android.text.method.QwertyKeyListener.onKeyDown(QwertyKeyListener.java:223)
                                                                              at android.text.method.TextKeyListener.onKeyDown(TextKeyListener.java:136)
                                                                              at android.widget.TextView.doKeyDown(TextView.java:6098)
                                                                              at android.widget.TextView.onKeyDown(TextView.java:5911)
                                                                              at android.widget.AutoCompleteTextView.onKeyDown(AutoCompleteTextView.java:720)
                                                                              at android.view.KeyEvent.dispatch(KeyEvent.java:2640)
                                                                              at android.view.View.dispatchKeyEvent(View.java:9234)
                                                                              at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                              at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                              at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                              at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                              at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                              at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                              at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                              at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                              at com.android.internal.policy.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2395)
                                                                              at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1727)
                                                                              at android.app.Activity.dispatchKeyEvent(Activity.java:2725)
                                                                              at com.android.internal.policy.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2310)
                                                                              at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4127)
                                                                              at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4089)
                                                                              at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
                                                                              at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
                                                                              at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
                                                                              at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3787)
                                                                              at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
                                                                              at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3844)
                                                                              at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
                                                                              at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
                                                                              at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
                                                                              at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
                                                                              at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
                                                                              at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
                                                                              at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
                                                                              at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3820)
                                                                              at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3981)
                                                                              at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2253)
                                                                              at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1874)
                                                                              at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1865)
                                                                              at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2230)
                                                                          	at android.view.In
05-23 07:45:17.906 29930-29930/com.example.alper.json D/AndroidRuntime: Shutting down VM
05-23 07:45:17.907 29930-29930/com.example.alper.json E/AndroidRuntime: FATAL EXCEPTION: main
                                                                        Process: com.example.alper.json, PID: 29930
                                                                        java.lang.NullPointerException: Attempt to invoke virtual method 'android.widget.Filter android.widget.ArrayAdapter.getFilter()' on a null object reference
                                                                            at com.example.alper.json.MainActivity.onQueryTextChange(MainActivity.java:145)
                                                                            at android.widget.SearchView.onTextChanged(SearchView.java:1209)
                                                                            at android.widget.SearchView.-wrap9(SearchView.java)
                                                                            at android.widget.SearchView$9.onTextChanged(SearchView.java:1682)
                                                                            at android.widget.TextView.sendOnTextChanged(TextView.java:7991)
                                                                            at android.widget.TextView.handleTextChanged(TextView.java:8053)
                                                                            at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:10157)
                                                                            at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:1033)
                                                                            at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:559)
                                                                            at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:492)
                                                                            at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:491)
                                                                            at android.text.method.QwertyKeyListener.onKeyDown(QwertyKeyListener.java:223)
                                                                            at android.text.method.TextKeyListener.onKeyDown(TextKeyListener.java:136)
                                                                            at android.widget.TextView.doKeyDown(TextView.java:6098)
                                                                            at android.widget.TextView.onKeyDown(TextView.java:5911)
                                                                            at android.widget.AutoCompleteTextView.onKeyDown(AutoCompleteTextView.java:720)
                                                                            at android.view.KeyEvent.dispatch(KeyEvent.java:2640)
                                                                            at android.view.View.dispatchKeyEvent(View.java:9234)
                                                                            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
                                                                            at com.android.internal.policy.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2395)
                                                                            at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1727)
                                                                            at android.app.Activity.dispatchKeyEvent(Activity.java:2725)
                                                                            at com.android.internal.policy.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2310)
                                                                            at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4127)
                                                                            at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4089)
                                                                            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
                                                                            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
                                                                            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
                                                                            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3787)
                                                                            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
                                                                            at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3844)
                                                                            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
                                                                            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
                                                                            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
                                                                            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
                                                                            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
                                                                            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
                                                                            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
                                                                            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3820)
                                                                            at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3981)
                                                                            at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2253)
                                                                            at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1874)
                                                                            at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1865)
                                                                        	at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInpu

 

 

Değerli fikirlerinizi bekliyorum. Aya da searchview yerine listview e başka nasıl filtre uygulayabilirim ? 

52 Görüntülenme

2 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user alperaltınkaynak
alperaltınkaynak
25.05.2016 - 01:30

Hata kayıtları ona ait. Neyse, ben başka bir şekilde hallettim orayı. 

public boolean onQueryTextChange(String newText) {
        adapter.getFilter().filter(newText);
        return false;
    }

buradan dolayı bir hata kaynaklanıyor. Ben sorunu şöyle hallettim. 

listviewe adapter tanımladıktan sonra 

list.setAdapter(adapter); 
list.setTextFilterEnabled(true);
setupSearchView();

aşağıda da setupSearchview metodu ; 

 

private void setupSearchView() {
        search_view.setIconifiedByDefault(false);
        search_view.setOnQueryTextListener(this);
        search_view.setSubmitButtonEnabled(false);
        list.setFooterDividersEnabled(false);
        search_view.setQueryHint(getString(R.string.arama));
    }

 

ve son olarak Searchview'in onquerytextchange metodu ; 

    public boolean onQueryTextChange(String newText) {
        System.out.println("tap");
        SimpleAdapter ca = (SimpleAdapter) list.getAdapter();
        if (TextUtils.isEmpty(newText)) {
            System.out.println("isEmpty");
            ca.getFilter().filter(null);
            //list.clearTextFilter();
        } else {
            ca.getFilter().filter(newText);
            // list.setFilterText(newText.toString());
        }
        return true;
    }

burada list.clearTextFilter(); un yerine ca.getFilter().filter(null); şeklinde kullanmamın sebebi, querybox'un çıkmaması için. 

Profile picture for user yahyacan55
yahyacan55
24.05.2016 - 05:17

Merhaba,

Loglar yukarıdaki koda ait değil sanırım. Hata 145. satırda diyor ama silmişsiniz gibi orayı. ListView ile şöyle yapabilirsin. ListView ın üstüne EditText koyup edittext in aşağıdaki özelliğini kullanıp listenizi filtreler, ListView a geri bind edersiniz.


et.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { Log.e("TextWatcherTest", "afterTextChanged:\t" +s.toString()); } });