0

ここに画像の説明を入力してください

EditTextとカスタムListViewアダプターがsqllitedbに接続されています。レコードを追加、削除、編集できます。次の目標は、EditTextでレコードをフィルタリングすることです。このコードを書きましたが、正しくフィルタリングされませんでした。

private EditText et_search_filter;
private TextWatcher watcher_search_filter;
et_search_filter = (EditText) findViewById(id.et_search_box);
et_search_filter.addTextChangedListener(watcher_search_filter);

watcher_search_filter = new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
    adapter.getFilter().filter(s);              
}

public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}

public void afterTextChanged(Editable s) {
}

};

ここに私のカーソルメソッド:

public ArrayList<Item> item_get_all() {
    ArrayList<Item> itemList = new ArrayList<Item>();

    String selectQuery = "SELECT * FROM " + TABLE_ITEMS;

    SQLiteDatabase db = this.getWritableDatabase();

    Cursor cursor = db.rawQuery(selectQuery, null);

    if (cursor.moveToFirst()) {
        do {
            Item dbitems = new Item();
            dbitems.setID(Integer.parseInt(cursor.getString(cursor.getColumnIndex(items_id))));
            dbitems.setName(cursor.getString(cursor.getColumnIndex(items_item_name)));
            dbitems.setBrand(cursor.getString(cursor.getColumnIndex(items_brand)));
            dbitems.setItemType(cursor.getString(cursor.getColumnIndex(items_type)));
            dbitems.setModel(cursor.getString(cursor.getColumnIndex(items_model)));
            dbitems.setNote(cursor.getString(cursor.getColumnIndex(items_note)));
            dbitems.setPurchaseFrom(cursor.getString(cursor.getColumnIndex(items_purchase_from)));
            dbitems.setPurchasePrice(cursor.getString(cursor.getColumnIndex(items_price)));
            dbitems.setPurchaseDate(cursor.getLong(cursor.getColumnIndex(items_purchase_date)));
            itemList.add(dbitems);              
        } while (cursor.moveToNext());
    }
    db.close();
    return itemList;
}

そして、私はこのようにカーソルアダプタを呼び出しました:

public void getItemList() {     
    ArrayList<Item> itemArray = new ArrayList<Item>();      
    itemArray = db.item_get_all();      
    adapter = new ItemAdapter(this, R.layout.items_row, itemArray);
    ilistViewItems.setAdapter(adapter);                     
}

これが私のItemAdapter.javaファイルとItem_row.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="fill_parent" >
    <TextView
        android:id="@+id/tv_item_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:text="@string/nullstr"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="#ffffff"
        android:textSize="13dp"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/tv_item_brand"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/tv_item_name"
        android:text="@string/nullstr"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textColor="#bbbbbb"
        android:textSize="11dp" />
    <TextView
        android:id="@+id/tv_purchase_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/tv_item_name"
        android:text="@string/nullstr"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textColor="#aabbbb"
        android:textSize="11dp" />
</RelativeLayout>

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import db.Item;
public class ItemAdapter extends ArrayAdapter<Item>{
private ArrayList<Item> items;
private TextView item_name;    
private TextView item_brand;
private TextView item_purchase_date;      

public ItemAdapter(Context context, int textViewResourceId, ArrayList<Item> objects) {
    super(context, textViewResourceId, objects);
    this.items = objects;

}

public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = vi.inflate(R.layout.items_row, null);
    }

    item_name = (TextView) convertView.findViewById(R.id.tv_item_name);    

    item_brand = (TextView) convertView.findViewById(R.id.tv_item_brand);
    item_purchase_date = (TextView) convertView.findViewById(R.id.tv_purchase_date);       

    item_name.setText(items.get(position).getName());       
    item_brand.setText("[" + items.get(position).getItemType() + "] " + items.get(position).getBrand() + " " + items.get(position).getModel());
    item_purchase_date.setText(items.get(position).getPurchasedDateStr());

    return convertView;
}   

}

4

3 に答える 3

3

リライト

Item の toString() メソッドを実装しましたか?

public class Item {
    ...

    // Define a method to return a String that describes each Item, preferably unique String
    public String toString() {
        return name + "  " + brand + "  " + model + "  " + type;
    }
}

あなたが投稿したすべてのものでこのメソッドを使用すると、EditText は ListView をうまくフィルタリングします。この簡単な変更がうまくいくかどうか教えてください。

効率

既存のコードをより高速に実行するためのいくつかのトリックを指摘したいと思います。

データベース アダプタの get_item_all() メソッドを見てください。

  • 新しい Cursor の場合、moveToNext() を呼び出すだけで済みます。これは、読み取る有効なデータがある間は true を返します。
  • SQliteDatabases の ID はlongデータ型です。Item の id を anintから aに変更し、 longCursor.getLong() を使用する必要があります。
  • すべてのアイテムの各列のインデックスを検索します。インデックスを一度見つけて、ローカルに保存します。

全体として、これはより効率的です。

int idIndex = cursor.getColumnIndex(items_id);
int nameIndex = cursor.getColumnIndex(items_item_name);
//etc.

while (cursor.moveToNext()) {
    Item dbitems = new Item();

    dbitems.setID(cursor.getLong(idIndex));
    dbitems.setName(cursor.getString(nameIndex));
    ...
    itemList.add(dbitems);              
}

次に、Item.getView() を見てください。

  • LayoutInflater を 1 つ作成してクラスに格納するだけで済みます。コンストラクターで初期化することをお勧めします。
  • item.get(position)getView( ) が呼び出されるたびに、findViewById() と複数回使用します。ユーザーが ListView をスクロールするたびに、アダプターは getView() を使用して各行を表示します。null の場合にのみ findViewById() を呼び出す必要がconvertViewあります。

すべて一緒に:

という変数を作成LayoutInflater mInflaterし、コンストラクターで初期化します。

mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

ItemAdapter に、次のネストされたクラスを追加します。

public class ViewHolder {
    TextView name;
    TextView brand;
    TextView purchase_date;
}

getView() で:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    Item item = (Item) getItem(position);
    if(convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, parent, false);

        viewHolder = new ViewHolder();
        viewHolder.name = (TextView) convertView.findViewById(R.id.tv_item_name);
        viewHolder.brand = (TextView) convertView.findViewById(R.id.tv_item_brand);
        viewHolder.purchase_date = (TextView) convertView.findViewById(R.id.tv_purchase_date);
        convertView.setTag(viewHolder);
    }
    else
        viewHolder = (ViewHolder) convertView.getTag();

    viewHolder.name.setText(item.getName());
    viewHolder.brand.setText("[" + item.getItemType() + "] " + item.getBrand() + " " + item.getModel());
    viewHolder.purchase_date.setText(item.getPurchasedDateStr());
    return convertView;
}

convertView が既に作成されていると、作業がどれだけ少なくなるかわかりますか? それが役立つことを願っています。

于 2012-08-03T23:04:53.503 に答える
0

私はすべてを読んだわけではありませんが、彼はフィルター方法を述べました。そのため、利用可能なテキストの種類に達すると完了するautoCompleteTextViewをお勧めします。文字を押すと「S」と言って、samsungum または sony acd が表示されます

ウェブの例:

public class CountriesActivity extends Activity {
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         setContentView(R.layout.countries);

         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                 android.R.layout.simple_dropdown_item_1line, COUNTRIES);
         AutoCompleteTextView textView = (AutoCompleteTextView)
                 findViewById(R.id.countries_list);
         textView.setAdapter(adapter);
     }

     private static final String[] COUNTRIES = new String[] {
         "Belgium", "France", "Italy", "Germany", "Spain"
     };
 }
于 2012-08-03T20:50:57.940 に答える