ListView过滤器不能使用SearchView,如何使用过滤器更新列表视图?

问题描述:

这是我的第3个问题在*,因为我不知道如何使用*。我的问题是关于我的论文的项目。请帮我... 我有1个列表视图和1个SearchView。我想搜索过滤器添加到我的列表视图,我的问题是:ListView过滤器不能使用SearchView,如何使用过滤器更新列表视图?

  1. 我有一些项目在ListView中显示
  2. 例如,在第一次名单上有数据“Aisyah”,并在接下来的名单上有数据“ Farhan“按名称排序,当我在ListView的顶部键入”FA“ListView时显示”Farhan“。
  3. 但是当我点击,选择对“Aisyah”(第一项的ListView)不是“法尔汉”

基本上,在列表视图中的数据的位置是没有得到后我们刷新制成已经执行搜索。但我不知道如何刷新ListView并获取正确的数据位置。

请帮帮我......我在这里呆了好几天。 这是我的代码..

public class DosenActivity extends AppCompatActivity implements ListView.OnItemClickListener, SearchView.OnQueryTextListener { 
//root url dari webservice 
public static final String ROOT_URL = "http://fyptes.esy.es/"; 
//deklarasi varibel untuk mengirim data ke activity lain 
public static final String ID = "id"; 
public static final String NAMA = "nama"; 
public static final String SITUS = "situs"; 
public static final String EMAIL = "email"; 
public static final String TELEPON = "telepon"; 
public static final String KANTOR = "kantor"; 
public static final String JABATAN = "jabatan"; 
public static final String MATKUL = "matkul"; 
public static final String FOTO = "foto"; 
//listview untuk menampilkan data 
private ListView listview; 
//varibel books bertipe List dan List tersebut berdasarkan objek Listdosen 
private List<Listdosen> dosens; 
private ArrayAdapter adapter; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_dosen); 
    Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 

    //inisialisasi listview 
    listview = (ListView) findViewById(R.id.listViewDosen); 

    //memanggil method untuk mengambil data dosen 
    getDosen(); 

    //setting onItemClickListener untuk listview 
    listview.setOnItemClickListener(this); 


} 

private void getDosen() { 
    //Ketika Aplikasi mengambil data kita akan melihat progress dialog 
    final ProgressDialog loading = ProgressDialog.show(this,"Mengambil Data","Mohon tunggu..",false,false); 
    //Logging Interceptor 
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
    //set Level Log 
    logging.setLevel(HttpLoggingInterceptor.Level.BODY); 
    OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 
    httpClient.addInterceptor(logging); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(ROOT_URL) 
      .addConverterFactory(GsonConverterFactory.create())//GsonConverter untuk parsing json 
      .client(httpClient.build()) 
      .build(); 

    RestAPI service = retrofit.create(RestAPI.class); 

    Call<Model> call = service.loadListDosen(); 
    call.enqueue(new Callback<Model>() { //Asyncronous Request 
     @Override 
     public void onResponse(Call<Model> call, Response<Model> response) { 
      loading.dismiss(); 
      List<Listdosen> dosen = response.body().getListdosen(); 

      //memasukkan data dari varibel dosen ke dosens 
      dosens = dosen; 
      //memanggil method untuk menampilkan list 
      showList(); 
     } 

     @Override 
     public void onFailure(Call<Model> call, Throwable t) { 

     } 
    }); 
} 

private void showList() { 
    //String array untuk menyimpan nama semua nama dosen 
    String[] items = new String[dosens.size()]; 

    for (int i = 0; i < dosens.size(); i++) { 
     items[i] = dosens.get(i).getNama(); 
    } 
    //Membuat Array Adapter for listview 
    ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_dosen_listview, items); 

    //setting adapter untuk listview 
    listview.setAdapter(adapter); 
    listview.setTextFilterEnabled(true); 
    adapter.setNotifyOnChange(true); 
} 

//method ini akan dieksekusi ketikan listitem diklik 
@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    //membuat intent 
    Intent intent = new Intent(this, DosenDetailActivity.class); 
    //mengambil dosen dari list 
    Listdosen listdosen = dosens.get(position); 
    //menambahkan detail dosen untuk intent 
    intent.putExtra(ID, listdosen.getId()); 
    intent.putExtra(NAMA, listdosen.getNama()); 
    intent.putExtra(SITUS, listdosen.getSitus()); 
    intent.putExtra(EMAIL, listdosen.getEmail()); 
    intent.putExtra(TELEPON, listdosen.getTelepon()); 
    intent.putExtra(KANTOR, listdosen.getKantor()); 
    intent.putExtra(JABATAN, listdosen.getJabatan()); 
    intent.putExtra(MATKUL, listdosen.getMatkul()); 
    intent.putExtra(FOTO, listdosen.getFoto()); 

    //memulai activity lain untuk menampilkan detail dosen 
    startActivity(intent); 
} 

public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); 

    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
    searchView.setOnQueryTextListener(this); 
    return super.onCreateOptionsMenu(menu); 
} 

public boolean onQueryTextChange(String newText) { 
    // this is your adapter that will be filtered 
    if (TextUtils.isEmpty(newText)) 
    { 
     listview.clearTextFilter(); 
    } 
    else 
    { 
     listview.setFilterText(newText.toString()); 
    } 

    return true; 
} 

public boolean onQueryTextSubmit(String query) { 
    // TODO Auto-generated method stub 
    return false; 
} 
} 
+0

我试图前实施这一一段时间,但是,它的工作没有'searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));'你得到选为“Aisyah”因为你搜索后 –

+0

是更新列表视图。查看我的回答我已经发布了完整的代码。 –

+0

我刚刚删除了 searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 但仍然不适合我... – pahlevikun

使用下面的代码中搜索名称,再次填充根据搜索query.It是对我工作的罚款列表视图。

edittext.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       textlength = edittext.getText().length(); 
       ArrayList<HashMap<String, String>> arrayList2 = new ArrayList<HashMap<String, String>>(); 
       // arrayList2 = arraylist; 

       for (int i = 0; i < arraylist.size(); i++) { 

        username[i] = arraylist.get(i).get("Username"); 
        Log.d("unm", username[i]); 
       } 
       for (int i = 0; i < arraylist.size(); i++) { 
        if (textlength <= username[0].length()) { 


         if (username[i].toLowerCase().contains(
           edittext.getText().toString().toLowerCase().trim())) { 
          arrayList2.add(arraylist.get(i)); 
         } 
        } 
       } 
       adapter = new ListViewAdapter(getApplicationContext(), arrayList2); 

       listview.setAdapter(adapter); 


      } 


      @Override 
      public void afterTextChanged(Editable s) { 

      } 
     }); 
+0

但我使用SearchView不编辑文本,我该如何使用它? – pahlevikun

+0

以及我不知道SearchView,但如果你可以使用EditText,而不是SearchView,这将最适合你 –

+0

我会尝试使用edittext :) – pahlevikun