Android SearchBox für Custom Listview

Laire

Mitglied
Hallo,

ich brauche für meine Custom Listview eine searchbox also sowas wie hier:

custom_listview_search2.png


Die Beispiele die ich im Netzt gefunden haben, waren meist für normale Fieldlists oder sehr speziell auf ein Beispiel beschränkt, so das ich die nich adaptieren konnte.

Die activity sieht so aus:
Java:
package de.bodprod.rettinfo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class AntidotList extends Activity{
    ArrayList<HashMap<String, String>> antidotList;

    String[] sqliteIds;

    public static String TAG_ID = "id";
    public static String TAG_TOX = "tox";
    public static String TAG_ANTIDOT = "antidot";

    ListView lv;
    int textlength=0;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.antidotlist_layout);

        antidotList = new ArrayList<HashMap<String, String>>();
        lv = (ListView) findViewById(R.id.antidotlistlayout);

        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            }
        });        
        new loadStoreAntidots().execute();
    }

    class loadStoreAntidots extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... args) {
            // updating UI from Background Thread
            runOnUiThread(new Runnable() {
                public void run() {
                    DatabaseHandler db = new DatabaseHandler(getApplicationContext());
                    List<AntidotsClass> antidots = db.getAllAntidots();
                    sqliteIds = new String[antidots.size()];

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

                        AntidotsClass s = antidots.get(i);

                        // creating new HashMap
                        HashMap<String, String> map = new HashMap<String, String>();

                        // adding each child node to HashMap key => value
                        map.put(TAG_ID, s.getId().toString());
                        map.put(TAG_TOX, s.getTox());
                        map.put(TAG_ANTIDOT, s.getAntidot());

                        // adding HashList to ArrayList
                        antidotList.add(map);

                        // add sqlite id to array
                        // used when deleting a website from sqlite
                        sqliteIds[i] = s.getId().toString();
                    }
                    ListAdapter adapter = new SimpleAdapter(
                        AntidotList.this,
                        antidotList, R.layout.antidotlistitem_layout,
                        new String[] { TAG_ID, TAG_TOX, TAG_ANTIDOT },
                        new int[] { R.id.sqlite_id, R.id.tox_layout, R.id.antidot_layout }
                    );
                    lv.setAdapter(adapter);
                }
            });
            return null;
        }
    }
}

und die Layout Datei so:

Code:
<?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="@+id/antidotlistlayout"
        style="@style/mainView" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </ListView>           
</LinearLayout>

Wäre für jede Hilfe dankbar.
 

schlingel

Gesperrter Benutzer
Woran genau scheitert es? Die Beispiele zeigen doch das Prinzip schön vor?

Du hast eine Menge von Objekten in denen du suchen kannst. Jedes Mal wenn sich der Text in deiner Search-Box ändert, stößt du einen Async-Task an. Dieser Async-Task filtert die Objektmenge nach dem eingegebenen Begriff, teilt dem Adapter mit wie seine neuen Daten aussehen und stößt dann ein notifyDataSetChanged an.

Daraufhin zeichnet die ListView neu. Das einzige was jetzt noch fehlt, ist Code der den Async-Task abbricht wenn er noch läuft und ein neuer gestartet werden soll.
 

Laire

Mitglied
Habe jetzt noch ein paar Beispiel durchgeguckt und bin etwas weiter gekommen. Aber irgendwie funktioniert die Suche nicht wirklich. Egal welchen Buchstabe ich in die Searchbox eingebe, er zeigt mir immer den ersten Eintrag in der Liste an und weiter nichts.

Wenn also die Liste zum BEispiel so aussieht:

Auto
Blume
Gabel
Hund
Wasser

und gebe in der Searchbox W ein, verschwinden alle Einträge ausser Auto. Vielleicht kann mir wer weiter helfen.

Hier der Quelltext:

Activity:
Java:
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;
		}
	}
}

Datenbank Handler:

Java:
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 
 Kinder - Initial: 0,5 - 2 mg i.V. 
 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 
 Kinder - Initial: 0,5 - 2 mg i.V. 
 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 
 Kinder - Initial: 0,5 - 2 mg i.V. 
 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 
 Kinder - Initial: 0,5 - 2 mg i.V. 
 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 
 Kinder - Initial: 0,5 - 2 mg i.V. 
 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;
    }    
}

Ich habe mit diesem Beispiel gearbeitet: Android..:): Search a Custom ListView in Android
 

mjdv

Bekanntes Mitglied
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kazudemruzo Android API/Library für externe Entwickler zur Verfügung stellen Android & Cross-Platform Mobile Apps 7
C Consent für Admob mit ump / funding choices Android & Cross-Platform Mobile Apps 6
B Was fehlt mir hier für diese Klasse? ich habe es mit (>>> ... <<<) markiert. Android & Cross-Platform Mobile Apps 4
J SharedPreferences für User-Session Android & Cross-Platform Mobile Apps 2
M Barrierefreie Appentwicklung für Android - Suche Codebeispiele Android & Cross-Platform Mobile Apps 8
I App für Fire HD entwickeln Android & Cross-Platform Mobile Apps 3
T Bringen mir die Java-Basics irgendetwas für die Android-Programmierung Android & Cross-Platform Mobile Apps 4
L Textfeld für Dezimalzahl mit Vorzeichen Android & Cross-Platform Mobile Apps 2
J Android Datenbank Klasse nur für CRUD-Operation, oder auch mehr ? Android & Cross-Platform Mobile Apps 8
B Android Projekt für Android und IOS erstellen? Android & Cross-Platform Mobile Apps 5
J Impressumspflicht für App, wenn ich kein Unternehmer bin? Android & Cross-Platform Mobile Apps 13
T Android Equalizer für Android Android & Cross-Platform Mobile Apps 3
L Zeitstempel für Sensordaten bekommen Android & Cross-Platform Mobile Apps 3
L Android Texterkennung für Android? Android & Cross-Platform Mobile Apps 1
L Android Chart API für Android Android & Cross-Platform Mobile Apps 0
T Android Datenbankverbindung in Service für Push Notification Android & Cross-Platform Mobile Apps 0
R Android USB Treiber für Huawei Android & Cross-Platform Mobile Apps 1
M Hilfe bei App Programmierung für Android Android & Cross-Platform Mobile Apps 1
B Script für Android Android & Cross-Platform Mobile Apps 1
H Datenprotokoll für Graphview Android & Cross-Platform Mobile Apps 2
M Android Obfuscation für Strings Android & Cross-Platform Mobile Apps 8
S Bilder mit fester grösse für verschiedene Android Endgeräte Android & Cross-Platform Mobile Apps 2
D Android Layout für alle Geräte Android & Cross-Platform Mobile Apps 4
A String[] für Lisadapter Android & Cross-Platform Mobile Apps 4
D Lib für (Desktop-)Java und Android schreiben Android & Cross-Platform Mobile Apps 7
J MySQL Simulation für Android App Android & Cross-Platform Mobile Apps 2
kaoZ Tutorial .xml Layouting für z.B ListView elemente Android & Cross-Platform Mobile Apps 7
W Java Editor für Android +Emulator Android & Cross-Platform Mobile Apps 7
M 20 Image Button für jede Auflösung positionieren Android & Cross-Platform Mobile Apps 3
L Android ActionBar mit unterschiedlichen Farben für Tabs Android & Cross-Platform Mobile Apps 3
S Voraussetzungen für Android-Apps Android & Cross-Platform Mobile Apps 7
R Sinnvoller Ablageort für Leveldaten Android & Cross-Platform Mobile Apps 8
B App bei Play-Store für bestimmte auflösungen anbieten? Android & Cross-Platform Mobile Apps 3
G extends Activity für Berechnungen? Android & Cross-Platform Mobile Apps 7
H Progrämmchen für Symbian Android & Cross-Platform Mobile Apps 4
G wiederkehrenden Wert für Design in XML ablegen Android & Cross-Platform Mobile Apps 2
T Android KontrollApp für Nitrado Server Android & Cross-Platform Mobile Apps 2
L Android Eine Kleinigkeit für Profis Android & Cross-Platform Mobile Apps 2
G Android C++ Quellcode für Android Geräte compilieren Android & Cross-Platform Mobile Apps 2
T Zeit in zwei Zahlen für Widget zerlegen Android & Cross-Platform Mobile Apps 2
J Apps für Android programmieren - Android Handy notwendig oder reicht Simulator? Android & Cross-Platform Mobile Apps 3
A Android SimpleDateFormat gibt für Date unter android anderes Datum zurück als in Std. Java Android & Cross-Platform Mobile Apps 2
H Android Landscape Modus für App dektivieren Android & Cross-Platform Mobile Apps 3
M Frage zu Java Programm für Windows Mobile 6.5 Android & Cross-Platform Mobile Apps 2
H Welches JDK für Huawei G7002? Android & Cross-Platform Mobile Apps 6
C Panel/View für Android Android & Cross-Platform Mobile Apps 3
C Sanke für Android Android & Cross-Platform Mobile Apps 3
Kukulkan Welche Mindestanforderungen (JDK) für Android und BB? Android & Cross-Platform Mobile Apps 8
G Views für verschiedenen Bildschirmgroeßen Android & Cross-Platform Mobile Apps 2
thE_29 Widget für verpasste Anruf + SMS Android & Cross-Platform Mobile Apps 2
A Android Android Parameter für VM Android & Cross-Platform Mobile Apps 7
O Entwickler für Java Anwendungen auf Handy gesucht! Android & Cross-Platform Mobile Apps 3
S JButton in GUI für Handys? Android & Cross-Platform Mobile Apps 3
M Welche Datenbank für J2ME? Android & Cross-Platform Mobile Apps 5
D Event für Tastensperre? Android & Cross-Platform Mobile Apps 3
G WTK für Nokia Android & Cross-Platform Mobile Apps 2
P bestimmte API für XDA ORBIT2 Android & Cross-Platform Mobile Apps 3
S Idee gesucht für ein kleines Programm Android & Cross-Platform Mobile Apps 3
M ein image pixel für pixel aufbauen : setPixel() ? Android & Cross-Platform Mobile Apps 1
M Handyprogramm für U-Bahn-Fahrplan für Siemens SK65 Android & Cross-Platform Mobile Apps 2
J Empfehlungen für ME-Anfänger Android & Cross-Platform Mobile Apps 2
K Anwendung für Handy programmieren Android & Cross-Platform Mobile Apps 1
P Java für PDA DELL Axim 51 Android & Cross-Platform Mobile Apps 4
M Virtuelle Machiene für PDA Android & Cross-Platform Mobile Apps 8
B Programm für NokiaComunicator erstellen Android & Cross-Platform Mobile Apps 2
K Programme für Handy erstellen Android & Cross-Platform Mobile Apps 3
M Java-Programme für Handy auf Desktop-PC ausführen Android & Cross-Platform Mobile Apps 4
T Für Handy Game die Sprache umschreiben? Android & Cross-Platform Mobile Apps 24
M java game für handy mit grahi. oberfläche Android & Cross-Platform Mobile Apps 1
D java.security.MessageDigest (für ME?) Android & Cross-Platform Mobile Apps 1
N Unser Team such Coder für Spieleprojekte Android & Cross-Platform Mobile Apps 8
B WTK für Sony Ericsson? Android & Cross-Platform Mobile Apps 7
S JAVA für java-mobiltelefone Android & Cross-Platform Mobile Apps 14
I Android ListView (Custom) soll auf Hardwaretasten nicht reagieren. Android & Cross-Platform Mobile Apps 10
N Probleme mit custom dynamic ListView Android & Cross-Platform Mobile Apps 15
B Android Memory Leak: Custom Adapter, Timer Android & Cross-Platform Mobile Apps 9
B Android ListView set custom check Image and delete Android & Cross-Platform Mobile Apps 0
J Android Custom ViewGroup onMeasure() - heightMeasureSpec ist 0. Warum? Android & Cross-Platform Mobile Apps 2
Miguel Gonzalez Android Anfaengerproblem: Multiple Custom Views in Custom Views Android & Cross-Platform Mobile Apps 2
L Custom Dialog Button event Android & Cross-Platform Mobile Apps 2

Ähnliche Java Themen

Neue Themen


Oben