Ich entwickle eine Android-Anwendung für Online-Shopping. Ich habe die folgende Ansicht für die Produktliste erstellt RecyclerView
in dem ich die Ansicht ändern möchte bei der Auswahl des Optionsmenüpunkts:
Folgendes habe ich erstellt Adapter genannt ProductAdapter
indem ich Code zum Ändern des Layouts in implementiert habe onCreateViewHolder
zum Auswählen einer Layoutdatei basierend auf einem booleschen Wert.
Code des Adapters ProductAdapter
:
/***
* ADAPTER for Product to binding rows in List
*/
private class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ProductRowHolder> {
private List<Product> productList;
private Context mContext;
public ProductAdapter(Context context, List<Product> feedItemList) {
this.productList = feedItemList;
this.mContext = context;
}
@Override
public ProductRowHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(isProductViewAsList ? R.layout.product_row_layout_list : R.layout.product_row_layout_grid, null);
ProductRowHolder mh = new ProductRowHolder(v);
return mh;
}
@Override
public void onBindViewHolder(ProductRowHolder productRowHolder, int i) {
Product prodItem = productList.get(i);
// Picasso.with(mContext).load(feedItem.getName())
// .error(R.drawable.ic_launcher)
// .placeholder(R.drawable.ic_launcher)
// .into(productRowHolder.thumbnail);
double price = prodItem.getPrice();
double discount = prodItem.getDiscount();
double discountedPrice = price - (price * discount / 100);
String code = "";
if(prodItem.getCode() != null)
code = "[" + prodItem.getCode() + "] ";
productRowHolder.prodIsNewView.setVisibility(prodItem.getIsNew() == 1 ? View.VISIBLE : View.INVISIBLE);
productRowHolder.prodNameView.setText(code + prodItem.getName());
productRowHolder.prodOriginalRateView.setText("Rs." + new BigDecimal(price).setScale(2,RoundingMode.DOWN));
productRowHolder.prodDiscView.setText("" + new BigDecimal(discount).setScale(2,RoundingMode.DOWN) + "% off");
productRowHolder.prodDiscRateView.setText("Rs." + new BigDecimal(discountedPrice).setScale(2,RoundingMode.DOWN));
productRowHolder.prodOriginalRateView.setPaintFlags(productRowHolder.prodOriginalRateView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
}
@Override
public int getItemCount() {
return (null != productList ? productList.size() : 0);
}
public class ProductRowHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
//Declaration of Views
public ProductRowHolder(View view) {
super(view);
view.setOnClickListener(this);
//Find Views
}
@Override
public void onClick(View view) {
//Onclick of row
}
}
}
Danach habe ich Code zum Ändern erstellt RecyclerView
Layout ab List
zu Grid
und umgekehrt in onOptionsItemSelected
hier rufe ich an mAdapter.notifyDataSetChanged();
so wird der Adapter erneut aufgerufen und der Wert geändert.
onOptionsItemSelected:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
switch (id) {
case R.id.action_settings:
return true;
case android.R.id.home:
finish();
break;
case R.id.product_show_as_view:
isProductViewAsList = !isProductViewAsList;
supportInvalidateOptionsMenu();
mRecyclerView.setLayoutManager(isProductViewAsList ? new LinearLayoutManager(this) : new GridLayoutManager(this, 2));
mAdapter.notifyDataSetChanged();
break;
}
return super.onOptionsItemSelected(item);
}
Ich habe wenig Erfolg wie:
Bild von Grid
Layout:
Bild von List
Layout:
ABER JETZT, WENN ICH SCROLLE und dann ANSICHT ÄNDERN wird angezeigt wie:
Grid
Layout:
List
Layout:
Ich weiß nicht, warum es nach dem Scrollen passiert. Gibt es eine andere Möglichkeit, die Ansicht so zu ändern?
Heute habe ich gerade gesehen, dass dieses Problem daran liegt
ImageView
ohne dass es perfekt funktioniert.
Helfen Sie bitte, Ihre Hilfe wird geschätzt.
Diese Antwort könnte helfen: stackoverflow.com/a/24933117/2649012
– Phantômaxx
18. Februar 2015 um 11:03 Uhr
Verwenden Sie diese RecyclerView.setHasFixedSize(true);
– Amrut Bidri
26. Februar 2015 um 6:52 Uhr
es ist
mRecyclerView.setHasFixedSize(true);
aber funktioniert bei mir nicht. eine andere Lösung?– Pratik Butani
26. Februar 2015 um 7:03 Uhr
Ich denke, dieser Repost kann Ihnen helfen: RecyclerView: How to clear cached/recycled views?
– Luciano
14. März 2015 um 20:27 Uhr
hast du das schon gelöst?
– Bojan Kseneman
25. April 2015 um 19:32 Uhr