Wie implementieren Sie die Suchfunktion in benutzerdefiniertem Arrayadapter mit SearchView?Android

Forum für diejenigen, die für Android programmieren
Anonymous
 Wie implementieren Sie die Suchfunktion in benutzerdefiniertem Arrayadapter mit SearchView?

Post by Anonymous »

Ich bin ein Anfänger in Android -Programmierung und ich habe ein Problem, für das ich keine Lösung finden kann. Ich habe stundenlang Stackoverflow durchsucht, aber ich verstehe es immer noch nicht ganz, wie soll ich dieses Zeug tun: < /p>

Ich habe eine schlanke API mit PHP erstellt, die mit einem lokalen XAMPP Mysql -Server kommuniziert, und ich kann grundlegende CRUD -Operationen darauf ausführen. Ich erhalte die Daten mit der API vom Server, der alle "Elemente" in der Datenbank in eine Liste zurückgibt, und ich kann diese in einer Listansicht verwenden. Jedes Listenelement enthält 6 Textviews, sodass ich einen benutzerdefinierten Arrayadapter erstellt habe, aber ich weiß nicht, dass ich nach bestimmten Listenelementen suchen soll. < /p>

Meine Artikelklasse: < /p>

public class Item {

private String mName;
private String mQuantity;
private String mDate_added;
private String mBarcode;
private String mPrice;
private String mWarranty;
private int mId;

public Item(String mName, String mQuantity, String mDate_added, String mBarcode, String mPrice, String mWarranty,int mId) {
this.mName = mName;
this.mQuantity = mQuantity;
this.mDate_added = mDate_added;
this.mBarcode = mBarcode;
this.mPrice = mPrice;
this.mWarranty = mWarranty;
this.mId = mId;
}

public int getmId(){return mId; }

public String getmName() {
return mName;
}

public String getmQuantity() {
return mQuantity;
}

public String getmDate_added() {
return mDate_added;
}

public String getmBarcode() {
return mBarcode;
}

public String getmPrice() {
return mPrice;
}

public String getmWarranty() {
return mWarranty;
}
}
< /code>

Mein Adapter < /p>

public class ItemAdapter extends ArrayAdapter {

public ItemAdapter(Context context, ArrayList items) {
super(context,0, items);

}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

View ListItemView= convertView;
if (ListItemView == null) {

ListItemView = LayoutInflater.from(getContext()).inflate(R.layout.list_item,parent,false);

Item currentItem = getItem(position);

TextView nameText = (TextView) ListItemView.findViewById(R.id.name);
TextView quantityText = (TextView) ListItemView.findViewById(R.id.quantity);
TextView date_addedText = (TextView) ListItemView.findViewById(R.id.date_added);
TextView barcodeText = (TextView) ListItemView.findViewById(R.id.barcode);
TextView priceText = (TextView) ListItemView.findViewById(R.id.price);
TextView warrantyText = (TextView) ListItemView.findViewById(R.id.warranty);

nameText.setText(currentItem.getmName());
quantityText.setText(currentItem.getmQuantity() +" e");
date_addedText.setText(currentItem.getmDate_added());
barcodeText.setText(currentItem.getmBarcode());
priceText.setText(currentItem.getmPrice()+ " pr/e");
warrantyText.setText(currentItem.getmWarranty());

}

return ListItemView;
}

}
< /code>

Ich erhalte die Daten mit httpurlConnection -Methode und verwende dafür einen Asynctaskloader. Dies gibt die Daten in eine Liste einer bestimmten URL zurück. < /p>

public class ItemLoader extends AsyncTaskLoader {

private String mUrl;

public ItemLoader(Context context, String url) {
super(context);
mUrl = url;
}

@Override
protected void onStartLoading() {

forceLoad();
}

@Override
public List loadInBackground() {

if (mUrl == null) {
return null;
}

// Perform the network request, parse the response, and extract a list of items.
List items = QueryUtils.fetchItemData(mUrl);
return items;
}

}
< /code>

Als nächstes implementiere ich in meiner Hauptaktivität Loader -Rückrufe. < /p>

private ItemAdapter mAdapter;

@Override
public android.content.Loader onCreateLoader(int i, Bundle bundle) {

return new ItemLoader(this,API_REQUEST_URL);
}

@Override
public void onLoadFinished(android.content.Loader loader, List items) {
mAdapter.clear();

if (items != null && !items.isEmpty()) {

mAdapter.addAll(items);
}

}

@Override
public void onLoaderReset(android.content.Loader loader) {
Log.e("init loader","Log");

mAdapter.clear();
}
< /code>

In OnCreate < /p>

android.app.LoaderManager loaderManager = getLoaderManager();
loaderManager.initLoader(0, null, MainActivity.this);

listView.setAdapter(mAdapter);
< /code>

Ich möchte nach den Namen der Elemente suchen und das entsprechende in der ListView zurückgeben. Ich habe eine Suchansicht mit einem setonQueryTextListener erstellt: < /p>

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main,menu);

SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView search = (SearchView) menu.findItem(R.id.search).getActionView();
search.setSearchableInfo(manager.getSearchableInfo(getComponentName()));

search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

@Override
public boolean onQueryTextSubmit(String s) {

return false;
}

@Override
public boolean onQueryTextChange(String s) {

return false;
}

});

return true;
}
< /code>

aaand... Jetzt stecke ich ein bisschen fest. Ich weiß, ich sollte "filterbar" in der Adapterklasse implementieren, einige Methoden überschreiben, einen Filter usw. erstellen usw., und es ist nicht so schwierig, wenn ich eine hartcodierte Liste habe, die ich nur ändern muss, aber diese Netzwerkanfragen, Hintergrund -Threads, holen Sie Daten von den Server -Dingen, die mich so sehr verwirrt, was zu tun ist. < /p>

Halp! : c

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post