Android搜索过滤器自定义列表视图,自定义adapater和自定义对象

问题描述:

我试图为我的代码实现一个搜索过滤器,但是,我目前有一些问题。那我收到的错误是Android搜索过滤器自定义列表视图,自定义adapater和自定义对象

的ArrayList不能转换到CustomApapter

我知道这个错误发生,因为我用我的CustomAdapter代替ArrayList的名单之内。问题是我不知道如何解决它以使其正常工作。

CustomAdapter

DataLayout

import java.util.List; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.widget.ListView; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.Button; 
import android.widget.EditText; 

public class DataLayout extends Activity { 
    private RecordsDataSource datasource; 

    Button btnDataCancel; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.data_layout);  

     datasource = new RecordsDataSource(this); 
     datasource.open(); 

     final List<Records> values = datasource.getNameType(); 

     //use the SimpleCursorAdapter to show the 
     //elements in a ListView 
     //ArrayAdapter<Records> adapter = new ArrayAdapter<Records>(this, android.R.layout.simple_list_item_1, values); 
     //setListAdapter(adapter); 


     CustomAdapter adapter = new CustomAdapter(this, R.layout.data_layout_listview, values); 
     final ListView listView1 = (ListView)findViewById(R.id.listView1); 

     listView1.setAdapter(adapter); 


     Button btnDataCancel = (Button)findViewById(R.id.btnDataCancel); 

     //Cancel Button 
     btnDataCancel.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View arg0) { 
       //Starting a new Intent 
       Intent goMain = new Intent(getApplicationContext(), MainActivity.class); 

       startActivity(goMain); 
       finish(); 
      } 
     }); 

     //ListView onClick 
     listView1.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Object o = listView1.getItemAtPosition(position); 
       Records str =(Records)o; 

       Intent rData = new Intent(DataLayout.this, RecordView.class); 
       rData.putExtra("DataId", String.valueOf(str.getId())); 
       DataLayout.this.startActivity(rData); 
       //Toast.makeText(getBaseContext(), str.getName(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     //Filter Text 
     EditText edtFilter = (EditText)findViewById(R.id.edtFilter); 

     edtFilter.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void afterTextChanged(Editable s) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, 
        int count) { 
       System.out.println("Text [" + s + "]"); 
       ((CustomAdapter) values).getFilter().filter(s.toString()); 

      } 

     }); 
    } 

    @Override 
    protected void onResume() { 
     datasource.open(); 
     super.onResume(); 
    } 

    @Override 
    protected void onPause() { 
     datasource.close(); 
     super.onPause(); 
    } 


} 

请不要让我知道如果你需要任何额外的信息。

谢谢你的帮助。

编辑1: @alexei burmistrov 谢谢你的帮助,它现在抛出一个不同的错误。下面是日志:

05-20 22:54:39.275: E/AndroidRuntime(526): FATAL EXCEPTION: main 
05-20 22:54:39.275: E/AndroidRuntime(526): java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3 
05-20 22:54:39.275: E/AndroidRuntime(526): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
05-20 22:54:39.275: E/AndroidRuntime(526): at java.util.ArrayList.get(ArrayList.java:308) 
05-20 22:54:39.275: E/AndroidRuntime(526): at com.pbear.drillmaster.CustomAdapter.getView(CustomAdapter.java:69) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.widget.AbsListView.obtainView(AbsListView.java:1949) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.widget.ListView.measureHeightOfChildren(ListView.java:1228) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.widget.ListView.onMeasure(ListView.java:1139) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.view.View.measure(View.java:10828) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4351) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1284) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.widget.LinearLayout.measureVertical(LinearLayout.java:613) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.widget.LinearLayout.onMeasure(LinearLayout.java:519) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.view.View.measure(View.java:10828) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4351) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.widget.FrameLayout.onMeasure(FrameLayout.java:267) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.view.View.measure(View.java:10828) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4351) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1284) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.widget.LinearLayout.measureVertical(LinearLayout.java:613) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.widget.LinearLayout.onMeasure(LinearLayout.java:519) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.view.View.measure(View.java:10828) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4351) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.widget.FrameLayout.onMeasure(FrameLayout.java:267) 
05-20 22:54:39.275: E/AndroidRuntime(526): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:1889) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.view.View.measure(View.java:10828) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.view.ViewRoot.performTraversals(ViewRoot.java:938) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.view.ViewRoot.handleMessage(ViewRoot.java:2040) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.os.Looper.loop(Looper.java:132) 
05-20 22:54:39.275: E/AndroidRuntime(526): at android.app.ActivityThread.main(ActivityThread.java:4123) 
05-20 22:54:39.275: E/AndroidRuntime(526): at java.lang.reflect.Method.invokeNative(Native Method) 
05-20 22:54:39.275: E/AndroidRuntime(526): at java.lang.reflect.Method.invoke(Method.java:491) 
05-20 22:54:39.275: E/AndroidRuntime(526): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
05-20 22:54:39.275: E/AndroidRuntime(526): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
05-20 22:54:39.275: E/AndroidRuntime(526): at dalvik.system.NativeStart.main(Native Method) 

EDIT2: 感谢阿列克谢burmistrov对清理了很多概念与过滤。我终于搞定了。

你应该叫用getFilter()过滤器(...)不是在你的数据源(值),但作为

adapter.getFilter()过滤器(s.toString();

没有类型转换

在过滤数据时,请勿修改原始数据集,在publishResults中使用适配器的getItem修改其内部副本,添加和清除方法或使用getView的手动数据副本以及getCount来覆盖此手动副本的大小。

请参阅here作为使用内部数据复制的示例之一。

第一个替代方案(对我来说最为理智),在getView中使用getItem来获取记录不是从原始数据集,而是从内部记录。不要重写getCount。在publishResults中使用clear,然后添加(addAll)来复制过滤的数据。

对于第二种替代方法,将构造函数中的数据复制到例如filteredData中,并在getView()getCount()和publishResults中使用filteredData而不是数据。离开执行过滤,因为

+0

所以,你的意思是使用**适配器**从下面的代码而不是? 'CustomAdapter adapter = new CustomAdapter(this,R.layout.data_layout_listview,values);' – fireboy0526

+0

是的,将它保存在活动中或通过listview.getAdapter() –

+0

得到的工作,但现在我得到一个大小错误在** CustomAdapter **我的** getView ** ** – fireboy0526