2012-06-14 2 views
0

, когда я использую serachbox для своего списка, я получаю каждый раз тот же результат. Например:Searchbox в Listview: всегда тот же результат

автомобиля Цветок Hate Любовь Вода

Когда я typef или ч или л и т.д. результат является автомобиль. Я работал с этим примером http://androidcocktail.blogspot.in/2012/04/search-custom-listview-in-android.html

активность:

package de.bodprod.rettinfo; 

import java.util.ArrayList; 
import java.util.HashMap; 
import android.app.ListActivity; 
import android.content.Context; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.TextView; 

public class AntidotList extends ListActivity{ 
    ArrayList<HashMap<String, Object>> antidots; 
    ArrayList<HashMap<String, Object>> antidotsResult; 
    LayoutInflater inflater; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.antidotlist_layout); 
     final EditText searchBox=(EditText) findViewById(R.id.EditText01); 
     ListView antidotListView=(ListView) findViewById(android.R.id.list); 

     inflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     antidots = new ArrayList<HashMap<String,Object>>();   
     DatabaseHandler db = new DatabaseHandler(getApplicationContext()); 
     antidots = db.getAllAntidots(); 

     antidotsResult = new ArrayList<HashMap<String,Object>>(antidots); 

     final CustomAdapter adapter = new CustomAdapter(this, R.layout.antidotlist_layout, antidotsResult); 
     antidotListView.setAdapter(adapter); 

     searchBox.addTextChangedListener(new TextWatcher() { 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       //get the text in the EditText 
       String searchString=searchBox.getText().toString(); 
       int textLength=searchString.length(); 

       antidotsResult.clear(); 

       for(int i=0;i<antidots.size();i++){ 
        String toxinname=antidots.get(i).get("toxin").toString(); 
        if(textLength<=toxinname.length()){ 
         if(searchString.equalsIgnoreCase(toxinname.substring(0,textLength))) 
          antidotsResult.add(antidots.get(i)); 
        } 
       } 
       adapter.notifyDataSetChanged(); 
      } 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
      public void afterTextChanged(Editable s) {} 
     }); 
    } 

    private class CustomAdapter extends ArrayAdapter<HashMap<String, Object>>{ 
     public CustomAdapter(Context context, int textViewResourceId, ArrayList<HashMap<String, Object>> Strings) { 
      super(context, textViewResourceId, Strings); 
     } 
     private class ViewHolder{ 
      TextView sqlite_id, tox_layout, antidot_layout; 
     } 

     ViewHolder viewHolder; 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if(convertView==null){   
       convertView=inflater.inflate(R.layout.antidotlistitem_layout, null); 
       viewHolder=new ViewHolder(); 

       viewHolder.sqlite_id=(TextView) convertView.findViewById(R.id.sqlite_id); 
       viewHolder.tox_layout=(TextView) convertView.findViewById(R.id.tox_layout); 
       viewHolder.antidot_layout=(TextView) convertView.findViewById(R.id.antidot_layout); 

       convertView.setTag(viewHolder); 

      }else{ 
       viewHolder=(ViewHolder) convertView.getTag(); 
      } 

      viewHolder.sqlite_id.setText(antidots.get(position).get("sql_id").toString()); 
      viewHolder.tox_layout.setText(antidots.get(position).get("toxin").toString()); 
      viewHolder.antidot_layout.setText(antidots.get(position).get("antidot").toString()); 

      return convertView; 
     } 
    } 
} 

DatabaseHandler:

package de.bodprod.rettinfo; 

import java.util.ArrayList; 
import java.util.HashMap; 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DatabaseHandler extends SQLiteOpenHelper { 
    // All Static variables 
    // Database Version 
    private static final int DATABASE_VERSION = 7; 

    // Database Name 
    private static final String DATABASE_NAME = "rettinfo"; 

    // Antidot table name 
    private static final String TABLE_ANTIDOT = "antidotlist"; 

    // Antidot Table Columns names 
    private static final String KEY_ID = "id"; 
    private static final String KEY_TOX = "tox"; 
    private static final String KEY_ANTIDOT = "antidot"; 
    private static final String KEY_DOS = "dos"; 
    private static final String KEY_KAT = "kat"; 

    public DatabaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     Log.d("Create: ", "Creating .."); 
     String CREATE_ANTIDOT_TABLE = "CREATE TABLE " + TABLE_ANTIDOT + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TOX + " TEXT," 
       + KEY_ANTIDOT + " TEXT," + KEY_DOS + " TEXT," + KEY_KAT + " INTEGER" + ")"; 
     Log.d("Create: ", CREATE_ANTIDOT_TABLE); 
     db.execSQL(CREATE_ANTIDOT_TABLE); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_TOX, "Alkylphosphat"); 
     values.put(KEY_ANTIDOT, "Atropinsulfat"); 
     values.put(KEY_DOS, "Initial: 2 - 5 mg i.V. alle 10 bis 15 Min &#xA; Kinder - Initial: 0,5 - 2 mg i.V. &#xA; bis zum Rückgang der Bronchialsekretion"); 
     values.put(KEY_KAT, "1"); 
     db.insert(TABLE_ANTIDOT, null, values); 

     values.put(KEY_TOX, "E605 (Alkylphosphat)"); 
     values.put(KEY_ANTIDOT, "Atropinsulfat"); 
     values.put(KEY_DOS, "Initial: 2 - 5 mg i.V. alle 10 bis 15 Min &#xA; Kinder - Initial: 0,5 - 2 mg i.V. &#xA; bis zum Rückgang der Bronchialsekretion"); 
     values.put(KEY_KAT, "1"); 
     db.insert(TABLE_ANTIDOT, null, values); 

     values.put(KEY_TOX, "DDVP (Alkylphosphat)"); 
     values.put(KEY_ANTIDOT, "Atropinsulfat"); 
     values.put(KEY_DOS, "Initial: 2 - 5 mg i.V. alle 10 bis 15 Min &#xA; Kinder - Initial: 0,5 - 2 mg i.V. &#xA; bis zum Rückgang der Bronchialsekretion"); 
     values.put(KEY_KAT, "1"); 
     db.insert(TABLE_ANTIDOT, null, values);  

     values.put(KEY_TOX, "Sarin (Alkylphosphat)"); 
     values.put(KEY_ANTIDOT, "Atropinsulfat"); 
     values.put(KEY_DOS, "Initial: 2 - 5 mg i.V. alle 10 bis 15 Min &#xA; Kinder - Initial: 0,5 - 2 mg i.V. &#xA; bis zum Rückgang der Bronchialsekretion"); 
     values.put(KEY_KAT, "1"); 
     db.insert(TABLE_ANTIDOT, null, values);   

     values.put(KEY_TOX, "Nervengas (Alkylphosphat)"); 
     values.put(KEY_ANTIDOT, "Atropinsulfat"); 
     values.put(KEY_DOS, "Initial: 2 - 5 mg i.V. alle 10 bis 15 Min &#xA; Kinder - Initial: 0,5 - 2 mg i.V. &#xA; bis zum Rückgang der Bronchialsekretion"); 
     values.put(KEY_KAT, "1"); 
     db.insert(TABLE_ANTIDOT, null, values);   
    } 

    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_ANTIDOT); 
     // Create tables again 
     onCreate(db); 
    } 


    public ArrayList<HashMap<String,Object>> getAllAntidots() { 
     ArrayList<HashMap<String,Object>> antidotList = new ArrayList<HashMap<String,Object>>(); 
     String selectQuery = "SELECT * FROM " + TABLE_ANTIDOT + " ORDER BY " + KEY_TOX; 
     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     HashMap<String , Object> antidot; 
     if (cursor.moveToFirst()) { 
      do { 
       antidot = new HashMap<String, Object>(); 
       antidot.put("sql_id", Integer.parseInt(cursor.getString(0))); 
       antidot.put("toxin", cursor.getString(1)); 
       antidot.put("antidot", cursor.getString(2)); 
       antidotList.add(antidot); 
      } while (cursor.moveToNext()); 
     } 
     return antidotList; 
    }  
} 

antidotlist_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    style="@style/mainView" 
    android:orientation="vertical" > 
    <EditText android:id="@+id/EditText01" 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" 
     android:hint="Suchen">        
    </EditText>  
    <ListView 
     android:id="@android:id/list" 
     style="@style/mainView" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" > 
    </ListView>   
</LinearLayout> 

antidotlistitem_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    style="@style/mainView" 
    android:padding="5dip"> 

    <!-- SQLite row id/hidden by default --> 
    <TextView android:id="@+id/sqlite_id" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
     <!-- android:visibility="gone" --> 


    <!-- web site title --> 
    <TextView 
     android:id="@+id/tox_layout" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingTop="8dip" 
     android:paddingLeft="8dip" 
     android:paddingBottom="4dip" 
     android:textSize="18dip" 
     android:textColor="#1a1a1a" /> 

    <!-- web site url --> 
    <TextView android:id="@+id/antidot_layout" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:paddingLeft="8dip" 
     android:paddingBottom="6dip" 
     android:textSize="15dip" 
     android:textColor="#c00300" 
     android:layout_below="@id/tox_layout"/> 
</RelativeLayout> 

Я загрузил файлы в затмение рабочее пространство: http://www.file-upload.net/download-4447258/test.rar.html

+0

http://stackoverflow.com/questions/8678163/list-filter -custom-adapter-dont-give-result/8678198 # 8678198 –

ответ

0

Вы уверены, что эта линия работает ?:

if(searchString.equalsIgnoreCase(toxinname.substring(0,textLength))){

Может быть, попробовать это вместо:

if(toxiname.toUpperCase().indexOf(searchString.toUpperCase()) != -1)

+0

Обе версии имеют одинаковый результат ... – Laire

+0

Ошибка, кажется, в пользовательском адаптере .... – Laire

+0

Вы пытались отладить эту строку 'String toxinname = antidots.get (я) .get ("токсин") ToString();. '? Он возвращает слово из db? –

0

Я нашел проблема. В деятельности последние три viewHolder работал с антиточками, а не с antidotsResult

Неправильно:

viewHolder.sqlite_id.setText(antidots.get(position).get("sql_id").toString()); 
viewHolder.tox_layout.setText(antidots.get(position).get("toxin").toString()); 
viewHolder.antidot_layout.setText(antidots.get(position).get("antidot").toString()); 

Работа:

viewHolder.sqlite_id.setText(antidotsResult.get(position).get("sql_id").toString()); 
viewHolder.tox_layout.setText(antidotsResult.get(position).get("toxin").toString()); 
viewHolder.antidot_layout.setText(antidotsResult.get(position).get("antidot").toString()); 
Смежные вопросы