ViewPager
hat vier Fragmente. Im ersten Fragment verwende ich RecyclerView
für die Liste der Produkte. Im zweiten Fragment manipuliere ich Daten, die im ersten Fragment erscheinen (zum Beispiel kann ich einige Daten löschen oder hinzufügen, es muss im ersten Fragment gezeigt werden RecyclerView
). Und wenn ich zum ersten Fragment wische, muss ich Veränderungen sehen. Dazu verwende ich notifyDataSetChanged
in OnResumeFragment
Methode. Aber das führt zu seltsamen Verhalten von ViewPager
Streichen. Wenn ich die notifyDataSetChanged
lösche. ViewPager
Swipe funktioniert ordnungsgemäß. Wie kann ich dieses Problem lösen? Jede Hilfe wird geschätzt.Verwenden von RecyclerView adapter.notifyDataSetChanged in ViewPager Fragment
Adapter:
public class FavoriteAdapter extends RecyclerView.Adapter<FavoriteAdapter.PrudactViewHolder> {
List<PrudactModel> prudactsList;
public Context mContext;
public static EditPlayerAdapterCallback callback;
ArrayList<PrudactBusketModel> busketList = new ArrayList<>();
DBHelper dbHelper;
ImageLoader imageLoader = AppController.getInstance().getImageLoader();
public ArrayList<Integer> tableBasket = new ArrayList<Integer>();
public ArrayList<Integer> tableFavorite = new ArrayList<>();
String LOG_TAG = "myLogs";
public FavoriteAdapter(List<PrudactModel> persons, Context context){
this.prudactsList = persons;
this.mContext = context;
}
@Override
public PrudactViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_of_pruduct, parent, false);
PrudactViewHolder pvh = new PrudactViewHolder(v,mContext);
return pvh;
}
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
@Override
public void onBindViewHolder(final PrudactViewHolder prudactViewHolder, final int i) {
if (imageLoader == null)
imageLoader = AppController.getInstance().getImageLoader();
final PrudactModel p = prudactsList.get(i);
prudactViewHolder.catalogName.setText(p.name);
prudactViewHolder.catalogPrice.setText(Integer.toString(p.price)+" тг");
prudactViewHolder.catalogPriceOld.setText(Integer.toString(p.oldPrice)+" тг");
prudactViewHolder.thumbNail.setImageUrl(p.imgId,imageLoader);
//// TODO Cheking PRICE
if (p.oldPrice==0){
prudactViewHolder.catalogPriceOld.setVisibility(View.INVISIBLE);
prudactViewHolder.aksia.setVisibility(View.INVISIBLE);
prudactViewHolder.catalogPrice.setTextColor(ContextCompat.getColor(mContext, R.color.black));
}
else {
prudactViewHolder.catalogPrice.setTextColor(ContextCompat.getColor(mContext, R.color.colorPrimary));
prudactViewHolder.catalogPriceOld.setVisibility(View.VISIBLE);
prudactViewHolder.aksia.setVisibility(View.VISIBLE);
}
//// TODO Cheking DB
tableBasket = getTableBasket();
tableFavorite = getTableFavorite();
if (tableBasket.contains(p.id))
prudactViewHolder.btn_buy.setBackgroundResource(R.drawable.tool);
else
prudactViewHolder.btn_buy.setBackgroundResource(R.drawable.tool1);
if (tableFavorite.contains(p.id))
prudactViewHolder.btn_favorite.setBackgroundResource(R.drawable.favorite_d);
else
prudactViewHolder.btn_favorite.setBackgroundResource(R.drawable.favorite_c);
//// TODO: 02.05.2016 BUY BUTTON CLICK
prudactViewHolder.ll_buy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbHelper = new DBHelper(mContext);
final ContentValues cv = new ContentValues();
final SQLiteDatabase db = dbHelper.getWritableDatabase();
if (prudactViewHolder.btn_buy.getBackground().getConstantState()== ContextCompat.getDrawable(mContext,R.drawable.tool1).getConstantState()){
updateBuyButton(prudactViewHolder, true);
Log.d(LOG_TAG, "--- Insert in mytable: ---");
cv.put("id_prudact", p.id);
cv.put("name",p.name);
cv.put("id_image",p.imgId);
cv.put("count",1);
cv.put("price",p.price);
cv.put("priceOld",p.oldPrice);
long rowID = db.insert("basket", null, cv);
Log.d(LOG_TAG, "row to basket inserted, ID = " + rowID);
callback.folderClicked(1);
}
else {
updateBuyButton2(prudactViewHolder, true);
callback.folderClicked(-1);
db.delete("basket","id_prudact=?",new String[]{String.valueOf(p.id)});
}
dbHelper.close();
}
});
prudactViewHolder.btn_buy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbHelper = new DBHelper(mContext);
final ContentValues cv = new ContentValues();
final SQLiteDatabase db = dbHelper.getWritableDatabase();
if (prudactViewHolder.btn_buy.getBackground().getConstantState()== ContextCompat.getDrawable(mContext,R.drawable.tool1).getConstantState()){
updateBuyButton(prudactViewHolder, true);
Log.d(LOG_TAG, "--- Insert in mytable: ---");
cv.put("id_prudact", p.id);
cv.put("name",p.name);
cv.put("id_image",p.imgId);
cv.put("count",1);
cv.put("price",p.price);
cv.put("priceOld",p.oldPrice);
long rowID = db.insert("basket", null, cv);
Log.d(LOG_TAG, "row to basket inserted, ID = " + rowID);
callback.folderClicked(1);
}
else {
updateBuyButton2(prudactViewHolder, true);
callback.folderClicked(-1);
db.delete("basket","id_prudact=?",new String[]{String.valueOf(p.id)});
}
dbHelper.close();
}
});
//// TODO: 02.05.2016 FAVORITE BUTTON CLICK
prudactViewHolder.ll_favorite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbHelper = new DBHelper(mContext);
final ContentValues cv2 = new ContentValues();
final SQLiteDatabase db = dbHelper.getWritableDatabase();
if (prudactViewHolder.btn_favorite.getBackground().getConstantState()== ContextCompat.getDrawable(mContext,R.drawable.favorite_c).getConstantState()){
cv2.put("id_prudact", p.id);
cv2.put("name",p.name);
cv2.put("id_image",p.imgId);
cv2.put("count",1);
cv2.put("price",p.price);
cv2.put("priceOld",p.oldPrice);
long rowID = db.insert("favorite", null, cv2);
Log.d(LOG_TAG, "row to favorite inserted, ID = " + rowID);
}
else {
updateHeartButton2(prudactViewHolder, true);
db.delete("favorite","id_prudact=?",new String[]{String.valueOf(p.id)});
delete(i);
}
}
});
prudactViewHolder.btn_favorite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbHelper = new DBHelper(mContext);
final ContentValues cv2 = new ContentValues();
final SQLiteDatabase db = dbHelper.getWritableDatabase();
if (prudactViewHolder.btn_favorite.getBackground().getConstantState()== ContextCompat.getDrawable(mContext,R.drawable.favorite_c).getConstantState()){
cv2.put("id_prudact", p.id);
cv2.put("name",p.name);
cv2.put("id_image",p.imgId);
cv2.put("count",1);
cv2.put("price",p.price);
cv2.put("priceOld",p.oldPrice);
long rowID = db.insert("favorite", null, cv2);
Log.d(LOG_TAG, "row to favorite inserted, ID = " + rowID);
}
else {
updateHeartButton2(prudactViewHolder, true);
db.delete("favorite", "id_prudact=?", new String[]{String.valueOf(p.id)});
delete(i);
}
}
});
//// TODO: 02.05.2016 SHARE BUTTON CLICK
prudactViewHolder.ll_share.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String shareBody = "Мне нравится "+p.name+" за "+p.price+" тенге";
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject Here");
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
mContext.startActivity(Intent.createChooser(sharingIntent,"Elaman"));
}
});
prudactViewHolder.btn_share.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String shareBody = "Мне нравится "+p.name+" за "+p.price+" тенге";
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject Here");
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
mContext.startActivity(Intent.createChooser(sharingIntent,"Elaman"));
}
});
prudactViewHolder.thumbNail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mContext, ImageActivity.class);
intent.putExtra("image",p.imgId);
mContext.startActivity(intent);
}
});
if (p.oldPrice==0){
prudactViewHolder.catalogPriceOld.setVisibility(View.INVISIBLE);
prudactViewHolder.aksia.setVisibility(View.INVISIBLE);
}
dbHelper.close();
}
private static final AccelerateInterpolator ACCELERATE_INTERPOLATOR = new AccelerateInterpolator();
private static final OvershootInterpolator OVERSHOOT_INTERPOLATOR = new OvershootInterpolator(4);
private void updateHeartButton2(final PrudactViewHolder holder, boolean animated) {
if (animated) {
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator rotationAnim = ObjectAnimator.ofFloat(holder.btn_favorite, "rotation", 0f, 360f);
rotationAnim.setDuration(300);
rotationAnim.setInterpolator(ACCELERATE_INTERPOLATOR);
ObjectAnimator bounceAnimX = ObjectAnimator.ofFloat(holder.btn_favorite, "scaleX", 0.2f, 1f);
bounceAnimX.setDuration(300);
bounceAnimX.setInterpolator(OVERSHOOT_INTERPOLATOR);
ObjectAnimator bounceAnimY = ObjectAnimator.ofFloat(holder.btn_favorite, "scaleY", 0.2f, 1f);
bounceAnimY.setDuration(300);
bounceAnimY.setInterpolator(OVERSHOOT_INTERPOLATOR);
bounceAnimY.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
holder.btn_favorite.setBackgroundResource(R.drawable.favorite_c);
}
});
animatorSet.play(rotationAnim);
animatorSet.play(bounceAnimX).with(bounceAnimY).after(rotationAnim);
animatorSet.start();
}
}
private void updateBuyButton(final PrudactViewHolder holder, boolean animated) {
if (animated) {
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator rotationAnim = ObjectAnimator.ofFloat(holder.btn_buy, "rotation", 0f, 360f);
rotationAnim.setDuration(300);
rotationAnim.setInterpolator(ACCELERATE_INTERPOLATOR);
ObjectAnimator bounceAnimX = ObjectAnimator.ofFloat(holder.btn_buy, "scaleX", 0.2f, 1f);
bounceAnimX.setDuration(300);
bounceAnimX.setInterpolator(OVERSHOOT_INTERPOLATOR);
ObjectAnimator bounceAnimY = ObjectAnimator.ofFloat(holder.btn_buy, "scaleY", 0.2f, 1f);
bounceAnimY.setDuration(300);
bounceAnimY.setInterpolator(OVERSHOOT_INTERPOLATOR);
bounceAnimY.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
holder.btn_buy.setBackgroundResource(R.drawable.tool);
}
});
animatorSet.play(rotationAnim);
animatorSet.play(bounceAnimX).with(bounceAnimY).after(rotationAnim);
animatorSet.start();
}
}
private void updateBuyButton2(final PrudactViewHolder holder, boolean animated) {
if (animated) {
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator rotationAnim = ObjectAnimator.ofFloat(holder.btn_buy, "rotation", 0f, 360f);
rotationAnim.setDuration(300);
rotationAnim.setInterpolator(ACCELERATE_INTERPOLATOR);
ObjectAnimator bounceAnimX = ObjectAnimator.ofFloat(holder.btn_buy, "scaleX", 0.2f, 1f);
bounceAnimX.setDuration(300);
bounceAnimX.setInterpolator(OVERSHOOT_INTERPOLATOR);
ObjectAnimator bounceAnimY = ObjectAnimator.ofFloat(holder.btn_buy, "scaleY", 0.2f, 1f);
bounceAnimY.setDuration(300);
bounceAnimY.setInterpolator(OVERSHOOT_INTERPOLATOR);
bounceAnimY.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
holder.btn_buy.setBackgroundResource(R.drawable.tool1);
}
});
animatorSet.play(rotationAnim);
animatorSet.play(bounceAnimX).with(bounceAnimY).after(rotationAnim);
animatorSet.start();
}
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public int getItemCount() {
return prudactsList.size();
}
public void setCallback(EditPlayerAdapterCallback callback2){
callback = callback2;
}
public static class PrudactViewHolder extends RecyclerView.ViewHolder{
CardView cv;
TextView catalogName,catalogPrice,catalogPriceOld;
NetworkImageView thumbNail;
ImageButton btn_favorite,btn_share, btn_buy;
LinearLayout ll_buy,aksia,ll_share,ll_favorite;
public PrudactViewHolder(View itemView,Context context) {
super(itemView);
cv = (CardView)itemView.findViewById(R.id.cv);
catalogName = (TextView)itemView.findViewById(R.id.name_catalog);
catalogPrice = (TextView)itemView.findViewById(R.id.price_catalog);
catalogPriceOld = (TextView)itemView.findViewById(R.id.old_price_catalog);
btn_buy = (ImageButton) itemView.findViewById(R.id.btn_buy);
btn_share = (ImageButton) itemView.findViewById(R.id.btn_share);
btn_favorite = (ImageButton) itemView.findViewById(R.id.izbrannyi);
thumbNail = (NetworkImageView)itemView.findViewById(R.id.image_catalog);
aksia = (LinearLayout) itemView.findViewById(R.id.aksia);
ll_buy = (LinearLayout) itemView.findViewById(R.id.ll_buy);
ll_share = (LinearLayout) itemView.findViewById(R.id.ll_share);
ll_favorite = (LinearLayout) itemView.findViewById(R.id.ll_favorite);
catalogPriceOld.setPaintFlags(catalogPriceOld.getPaintFlags()| Paint.STRIKE_THRU_TEXT_FLAG);
}
}
ArrayList<Integer> getTableBasket(){
ArrayList<Integer> id_list = new ArrayList<>();
dbHelper = new DBHelper(mContext);
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor c = db.query("basket", null, null, null, null, null, null);
if (c.moveToFirst()) {
int id_prudactColIndex = c.getColumnIndex("id_prudact");
do {
id_list.add(c.getInt(id_prudactColIndex));
} while (c.moveToNext());
} else
Log.d(LOG_TAG, "In basket 0 rows");
c.close();
return id_list;
}
ArrayList<Integer> getTableFavorite(){
ArrayList<Integer> id_list = new ArrayList<>();
dbHelper = new DBHelper(mContext);
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor c = db.query("favorite", null, null, null, null, null, null);
if (c.moveToFirst()) {
int id_prudactColIndex = c.getColumnIndex("id_prudact");
do {
id_list.add(c.getInt(id_prudactColIndex));
} while (c.moveToNext());
} else
Log.d(LOG_TAG, "In favorite 0 rows");
c.close();
return id_list;
}
public void delete(int position) { //removes the row
prudactsList.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, prudactsList.size());
}
}
Fragment:
public class C_Fragment extends android.support.v4.app.Fragment implements FragmentLifecycle,EditPlayerAdapterCallback {
PrudactModel prudact = new PrudactModel();
RecyclerView rv;
PrudactAdapter adapter;
MainActivity mainActivity = new MainActivity();
DBHelper dbHelper;
public static BasketListener basketclick;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_c, null);
// mainActivity.setfragmentclick(this);
rv = (RecyclerView) view.findViewById(R.id.rv);
LinearLayoutManager llm = new LinearLayoutManager(rv.getContext());
rv.setLayoutManager(llm);
prudact.initializeData();
adapter = new PrudactAdapter(prudact.prudactList,getActivity());
adapter.setCallback(this);
rv.setAdapter(adapter);
setHasOptionsMenu(true);
return view;
}
@Override
public void onPauseFragment() {
}
@Override
public void onResumeFragment() {
((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("Акции и новинки");
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuItem item = menu.findItem(R.id.ic_menu_basket);
LayerDrawable icon = (LayerDrawable) item.getIcon();
dbHelper = new DBHelper(getContext());
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select *from basket ", null);
int cnt = cursor.getCount();
cursor.close();
Utils.setBadgeCount(getActivity(), icon,cnt);
}
void setBasketclick(BasketListener bl){
basketclick = bl;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId()==android.R.id.home){
((MainActivity) getActivity()).setCurrentItem(0,true);
}
if (item.getItemId()==R.id.ic_menu_basket){
((MainActivity) getActivity()).setCurrentItem(3, true);
basketclick.basketClicked();
}
return super.onOptionsItemSelected(item);
}
@Override
public void onResume() {
super.onResume();
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
backAction();
return true;
}
return false;
}
});
}
public void backAction() {
if (getChildFragmentManager().getBackStackEntryCount() > 0) {
getChildFragmentManager().popBackStack();
}
else {
((MainActivity) getActivity()).setCurrentItem(0, true);
}
}
@Override
public void folderClicked(int position) {
getActivity().invalidateOptionsMenu();
}
Ich lösche 'ViewPager.setOffscopePageLimit (4)' speziell, weil Fragment eins und Fragment zwei beide "nestedchildfragment" haben. Und um das Auffrischen zu manipulieren, verwende ich ein benutzerdefiniertes Interface mit den Methoden 'onResumeFragment()' und 'onPauseFragment()' –