2014-09-04 112 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