我是新来的android和尝试使用我的列表视图顶部搜索联系应用程序。当我搜索了接触它过滤正确的,并显示我只是我搜索了接触,但是当我尝试编辑/删除对接触它抛出我数据库/ CursorIndexOutOfBoundsException,也是的TextView我的手机hyperling使用不工作太...当我不搜索所有一切正确的工作(编辑,删除,从文本视图等电话)。我发布该类与搜索过滤器,如果你需要更多的代码让我知道。假设适配器不显示正确的列表视图或类似的东西。 对不起,提前致谢。搜索过滤器适配器不能正常工作
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;
}
}
不使用ArrayAdapter,而是使用SimpleCursorAdapter – pskink 2014-09-04 10:57:12
可以帮我一些代码吗?因为我有点迷失在这一切:P – 2014-09-04 11:02:54
阅读此http://thinkandroid.wordpress.com/2010/01/09/simplecursoradapters-and-listviews/ – pskink 2014-09-04 11:12:26