Android 搜索筛选器适配器工作不正常

Android 搜索筛选器适配器工作不正常,android,listview,filter,Android,Listview,Filter,我是android新手,尝试在我的listview上创建一个带有搜索功能的联系人应用程序。当我搜索联系人时,它会正确过滤并仅显示我搜索的联系人,但当我尝试编辑/删除该联系人时,它会抛出我的数据库/CursorIndexOutOfBoundsException,而且我用作电话hyperling的文本视图也不起作用…当我没有搜索所有内容时,一切都正常(编辑、删除、从文本视图打电话等)。如果您需要更多代码,请告诉我,我正在使用搜索筛选器发布该类。我假设适配器未显示正确的listview或类似内容。 很

我是android新手,尝试在我的listview上创建一个带有搜索功能的联系人应用程序。当我搜索联系人时,它会正确过滤并仅显示我搜索的联系人,但当我尝试编辑/删除该联系人时,它会抛出我的数据库/CursorIndexOutOfBoundsException,而且我用作电话hyperling的文本视图也不起作用…当我没有搜索所有内容时,一切都正常(编辑、删除、从文本视图打电话等)。如果您需要更多代码,请告诉我,我正在使用搜索筛选器发布该类。我假设适配器未显示正确的listview或类似内容。 很抱歉发了大邮件,提前谢谢

public class Promitheutis extends Activity implements SearchView.OnQueryTextListener {
Button add_btn;
ListView Contact_listview;
ArrayList<Contact> contact_data = new ArrayList<Contact>();
Contact_Adapter cAdapter;
DatabaseHandler db;
String Toast_msg;
SearchView search_view;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
    Contact_listview = (ListView) findViewById(R.id.list);
    Contact_listview.setItemsCanFocus(false);
    add_btn = (Button) findViewById(R.id.add_btn);
    search_view = (SearchView) findViewById(R.id.search_view);

    Set_Referash_Data();

    search_view.setOnQueryTextListener(this);


} catch (Exception e) {
    // TODO: handle exception
    Log.e("some error", "" + e);
}
add_btn.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent add_user = new Intent(Promitheutis.this,
        Add_Update_User.class);
    add_user.putExtra("called", "add");
    add_user.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
        | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(add_user);
    finish();
    }
});

}





public void Set_Referash_Data() {
contact_data.clear();
db = new DatabaseHandler(this);
ArrayList<Contact> contact_array_from_db = db.Get_Contacts();

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

    int tidno = contact_array_from_db.get(i).getID();
    //String name = contact_array_from_db.get(i).getName();
    String epitheto = contact_array_from_db.get(i).getEpitheto();
    String mobile = contact_array_from_db.get(i).getPhoneNumber();
    // String email = contact_array_from_db.get(i).getEmail();
    String eidos = contact_array_from_db.get(i).getEidos();
    Contact cnt = new Contact();
    cnt.setID(tidno);
    //cnt.setName(name);
    cnt.setEpitheto(epitheto);
    //cnt.setEmail(email);
    cnt.setEidos(eidos);
    cnt.setPhoneNumber(mobile);

    contact_data.add(cnt);
}
db.close();
cAdapter = new Contact_Adapter(Promitheutis.this, R.layout.listview_row,
    contact_data);
Contact_listview.setAdapter(cAdapter);
cAdapter.notifyDataSetChanged();
}

public void Show_Toast(String msg) {
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
}

@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
Set_Referash_Data();

}

public class Contact_Adapter extends ArrayAdapter<Contact> implements Filterable {

ValueFilter valueFilter;    
Context context;
Activity activity;
int layoutResourceId;
Contact user;
ArrayList<Contact> data;
ArrayList<Contact> filterdata;

public Contact_Adapter(Activity act, int layoutResourceId,
    ArrayList<Contact> data) {
    super(act, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.activity = act;
    this.data = data;
    filterdata = data;
    notifyDataSetChanged();
}



@Override
public int getCount() {
    // TODO Auto-generated method stub
    return data.size();
}



@Override
public Contact getItem(int position) {
    // TODO Auto-generated method stub
    return data.get(position);
}



@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return data.indexOf(getItem(position));
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    UserHolder holder = null;

    if (row == null) {
    LayoutInflater inflater = LayoutInflater.from(activity);

    row = inflater.inflate(layoutResourceId, parent, false);
    holder = new UserHolder();
    //holder.name = (TextView) row.findViewById(R.id.user_epitheto_txt);
    holder.epitheto = (TextView) row.findViewById(R.id.user_epitheto_txt);
    //holder.email = (TextView) row.findViewById(R.id.user_email_txt);
    holder.eidos = (TextView) row.findViewById(R.id.user_eidos_txt);
    holder.number = (TextView) row.findViewById(R.id.user_mobile_txt);
    holder.edit = (Button) row.findViewById(R.id.btn_update);
    holder.delete = (Button) row.findViewById(R.id.btn_delete);
    row.setTag(holder);
    } else {
    holder = (UserHolder) row.getTag();
    }
    user = data.get(position);
    holder.edit.setTag(user.getID());
    holder.delete.setTag(user.getID());
    //holder.name.setText(user.getName());
    holder.epitheto.setText(user.getEpitheto());
    //holder.email.setText(user.getEmail());
    holder.eidos.setText(user.getEidos());
    holder.number.setText(user.getPhoneNumber());



   // String url = holder.number.getText().toString();
   //final Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse(url));

    final String phone_no= holder.number.getText().toString().replaceAll("-", "");


    holder.number.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:"+phone_no));
            callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
            startActivity(callIntent);
        }
    });




    holder.edit.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        Log.i("Edit Button Clicked", "**********");

        Intent update_user = new Intent(activity,
            Update_User.class);
        update_user.putExtra("called", "update");
        update_user.putExtra("USER_ID", v.getTag().toString());
        activity.startActivity(update_user);


    }
    });
    holder.delete.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(final View v) {
        // TODO Auto-generated method stub

        // show a message while loader is loading

        AlertDialog.Builder adb = new AlertDialog.Builder(activity);
        adb.setTitle("Διαγραφή;");
        adb.setMessage("Είστε σίγουρος για τη διαγραφή; ");
        final int user_id = Integer.parseInt(v.getTag().toString());
        adb.setNegativeButton("Άκυρο", null);
        adb.setPositiveButton("Ok",
            new AlertDialog.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog,
                int which) {
                // MyDataObject.remove(positionToRemove);
                DatabaseHandler dBHandler = new DatabaseHandler(
                    activity.getApplicationContext());
                dBHandler.Delete_Contact(user_id);
                Promitheutis.this.onResume();

            }
            });
        adb.show();
    }

    });
    return row;

}



@Override
public Filter getFilter() {
      if (valueFilter == null) {
            valueFilter = new ValueFilter();
        }
        return valueFilter;
}


private class ValueFilter extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        // TODO Auto-generated method stub
        FilterResults results = new FilterResults();

         if (constraint != null && constraint.length() > 0) {
                ArrayList<Contact> filterList = new ArrayList<Contact>();
                for (int i = 0; i < filterdata.size(); i++) {
                    if ( (filterdata.get(i).getEpitheto().toUpperCase() )
                            .contains(constraint.toString().toUpperCase())) {

                        Contact cnt = new Contact(filterdata.get(i)
                                .getEpitheto() ,  filterdata.get(i)
                                .getPhoneNumber() ,  filterdata.get(i)
                                .getEidos());

                        filterList.add(cnt);
                    }
                }
                results.count = filterList.size();
                results.values = filterList;
            } else {
                results.count = filterdata.size();
                results.values = filterdata;
            }
            return results;
    }


    @Override
    protected void publishResults(CharSequence constraint,
            FilterResults results) {
        // TODO Auto-generated method stub
        data = (ArrayList<Contact>) results.values;
        notifyDataSetChanged();
    }

}

class UserHolder {
    TextView name;
    TextView epitheto;
    TextView email;
    TextView number;
    TextView stathero;
    TextView eidos;
    TextView eponimia_user;
    TextView afm;
    TextView eidos2;
    TextView eidos3;
    Button edit;
    Button delete;
}

}

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





@Override
public boolean onQueryTextChange(String newText) {
    // TODO Auto-generated method stub
    cAdapter.getFilter().filter(newText);
    return false;
}
公共类PromithUtis扩展活动实现SearchView.OnQueryTextListener{
按钮添加按钮;
ListView联系人\u ListView;
ArrayList联系人_data=new ArrayList();
联系适配卡接受器;
数据库处理程序数据库;
串烤面包和味精;
搜索视图搜索视图;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
试一试{
联系人_listview=(listview)findViewById(R.id.list);
联系_listview.setItemsCanFocus(false);
add_btn=(按钮)findviewbyd(R.id.add_btn);
search\u view=(SearchView)findViewById(R.id.search\u view);
设置_refereash_Data();
search_view.setOnQueryTextListener(这个);
}捕获(例外e){
//TODO:处理异常
Log.e(“某些错误”,即“+e”);
}
添加_btn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
意向添加用户=新意向(promithutis.this,
添加_Update _User.class);
add_user.putExtra(“调用”、“添加”);
添加\u user.setFlags(Intent.FLAG\u活动\u清除\u顶部
|意图。标记活动(新任务);
startActivity(添加用户);
完成();
}
});
}
公共无效集\u引用\u数据(){
联系_data.clear();
db=新的DatabaseHandler(此);
ArrayList contact_array_from_db=db.Get_Contacts();
对于(int i=0;i