2014-09-04 110 views
0

我是新来的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; 
} 

}

+0

不使用ArrayAdapter,而是使用SimpleCursorAdapter – pskink 2014-09-04 10:57:12

+0

可以帮我一些代码吗?因为我有点迷失在这一切:P – 2014-09-04 11:02:54

+0

阅读此http://thinkandroid.wordpress.com/2010/01/09/simplecursoradapters-and-listviews/ – pskink 2014-09-04 11:12:26

回答

0

This。它包含你想要的并且还有源代码。

+0

我会试一试。谢谢! – 2014-09-04 17:32:38

+0

谢谢我按照教程,改变了我的代码,它的工作。再次感谢! – 2014-09-05 10:54:41

+0

欢迎您。 – 2014-09-05 10:59:16