2017-01-24 23 views
1

Я пытаюсь передать положение карты в действие SlideView, в котором onMenuItemClick использовался для получения правильной информации об этой конкретной карте. В настоящее время я использую getAdapterPosition в onMenuItemClick в своем адаптере, но это приводит к тому, что последний элемент, нарисованный на экране, сохраняется на моем адаптере. Я понимаю, почему он дает последнюю позицию, но не уверен, как установить правильную позицию. Должен ли я попытаться сохранить и передать позицию через showPopupMenu или что-то еще? Ниже мой адаптер & MainActivity.Сохранение позиции карты в адаптере

адаптер:

public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> { 
private Context mContext; 
private List<Properties> dogList; 
private MyViewHolder holder; 


public class MyViewHolder extends RecyclerView.ViewHolder { 
    public TextView title, count; 
    public ImageView thumbnail, overflow; 

    public MyViewHolder(View view) { 
     super(view); 
     title = (TextView) view.findViewById(R.id.title); 
     count = (TextView) view.findViewById(R.id.count); 
     thumbnail = (ImageView) view.findViewById(R.id.thumbnail); 
     overflow = (ImageView) view.findViewById(R.id.overflow); 

    } 
} 


public Adapter(Context mContext, List<Properties> dogList) { 
    this.mContext = mContext; 
    this.dogList = dogList; 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card, parent, false); 

    return new MyViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(final MyViewHolder holder, int position) { 
    this.holder=holder; 
    Properties dog = dogList.get(position); 
    holder.title.setText(dog.getName()); 

    // loading dog cover using Glide library 
    Glide.with(mContext).load(dog.getThumbnail()).into(holder.thumbnail); 

    holder.overflow.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      showPopupMenu(holder.overflow); 
     } 
    }); 
} 

/** 
* Showing popup menu when tapping on icon 
*/ 
private void showPopupMenu(View view) { 
    // inflate menu 
    PopupMenu popup = new PopupMenu(mContext, view); 
    MenuInflater inflater = popup.getMenuInflater(); 
    inflater.inflate(R.menu.menu, popup.getMenu()); 
    popup.setOnMenuItemClickListener(new MyMenuItemClickListener()); 
    popup.show(); 
} 

/** 
* Click listener for popup menu items 
*/ 
class MyMenuItemClickListener implements PopupMenu.OnMenuItemClickListener { 

    public MyMenuItemClickListener() { 
    } 

    @Override 
    public boolean onMenuItemClick(MenuItem menuItem) { 
     switch (menuItem.getItemId()) { 
      case R.id.action_add_favourite: 
       Toast.makeText(mContext, "Add to favourite", Toast.LENGTH_SHORT).show(); 
       return true; 
      case R.id.action_more_info: 
       Intent slideStart = new Intent(mContext, SlideViewActivity.class); 

       super.getClass(); 

       int adapterPosition = holder.getAdapterPosition(); 
       slideStart.putExtra("position", adapterPosition); 

       slideStart.putExtra("list", (Serializable) dogList); 

       mContext.startActivity(slideStart); 
       return true; 
      default: 
     } 
     return false; 
    } 
} 

@Override 
public int getItemCount() { 
    return dogList.size(); 
} 
} 

MainActivity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

private RecyclerView recyclerView; 
private Adapter adapter; 
private List<Properties> dogList; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    initCollapsingToolbar(); 

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 

    dogList = new ArrayList<>(); 
    adapter = new Adapter(this, dogList); 

    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 2); 
    recyclerView.setLayoutManager(mLayoutManager); 
    recyclerView.addItemDecoration(new GridSpacingItemDecoration(2, dpToPx(10), true)); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerView.setAdapter(adapter); 

    prepareCards(); 

    try { 
     Glide.with(this).load(R.drawable.austrailian_shepherd).into((ImageView) findViewById(R.id.backdrop)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

/** 
* Initializing collapsing toolbar 
* Will show and hide the toolbar title on scroll 
*/ 
private void initCollapsingToolbar() { 
    final CollapsingToolbarLayout collapsingToolbar = 
      (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar); 
    collapsingToolbar.setTitle(" "); 
    AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.appbar); 
    appBarLayout.setExpanded(true); 

    // hiding & showing the title when toolbar expanded & collapsed 
    appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { 
     boolean isShow = false; 
     int scrollRange = -1; 

     @Override 
     public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
      if (scrollRange == -1) { 
       scrollRange = appBarLayout.getTotalScrollRange(); 
      } 
      if (scrollRange + verticalOffset == 0) { 
       collapsingToolbar.setTitle(getString(R.string.app_name)); 
       isShow = true; 
      } else if (isShow) { 
       collapsingToolbar.setTitle(" "); 
       isShow = false; 
      } 
     } 
    }); 
} 

private void prepareCards() { 
    int librarySize = getResources().getStringArray(R.array.titles).length; 

    for(int i=0;i<librarySize;i++) { 
     String dognames = getResources().getStringArray(R.array.titles)[i]; 
     String doginfo = getResources().getStringArray(R.array.info)[i]; 
     int imageId = getResources().getIdentifier(dognames.toLowerCase(Locale.getDefault()), "drawable", this.getPackageName()); 

     Properties a = new Properties(dognames, doginfo, imageId); 
     dogList.add(a); 

    } 

    adapter.notifyDataSetChanged(); 
} 

@Override 
public void onClick(View v) { 

} 

/** 
* RecyclerView item decoration - give equal margin around grid item 
*/ 
public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration { 

    private int spanCount; 
    private int spacing; 
    private boolean includeEdge; 

    public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) { 
     this.spanCount = spanCount; 
     this.spacing = spacing; 
     this.includeEdge = includeEdge; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
     int position = parent.getChildAdapterPosition(view); // item position 
     int column = position % spanCount; // item column 

     if (includeEdge) { 
      outRect.left = spacing - column * spacing/spanCount; // spacing - column * ((1f/spanCount) * spacing) 
      outRect.right = (column + 1) * spacing/spanCount; // (column + 1) * ((1f/spanCount) * spacing) 

      if (position < spanCount) { // top edge 
       outRect.top = spacing; 
      } 
      outRect.bottom = spacing; // item bottom 
     } else { 
      outRect.left = column * spacing/spanCount; // column * ((1f/spanCount) * spacing) 
      outRect.right = spacing - (column + 1) * spacing/spanCount; // spacing - (column + 1) * ((1f/ spanCount) * spacing) 
      if (position >= spanCount) { 
       outRect.top = spacing; // item top 
      } 
     } 
    } 
} 

/** 
* Converting dp to pixel 
*/ 
private int dpToPx(int dp) { 
    Resources r = getResources(); 
    return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics())); 
} 
} 
+0

Вместо 'getAdapterPosition' попробуйте использовать' getLayoutPosition' который является абсолютным положением элемента в списке на основе представления. –

+0

При изменении на ** int adapterPosition = holder.getLayoutPosition(); ** результат тот же - мне нужно настроить его по-другому? – lexalenka

+0

Еще одно решение - добавить ссылку на держатель в свой 'MyMenuItemClickListener', также сделать этот класс' public static', чтобы сделать его полностью квалифицированным классом. –

ответ

1

Попробуйте эти модификации:

holder.overflow.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      showPopupMenu(holder.overflow, position); 
     } 
    }); 


private void showPopupMenu(View view, int pos) { 
    // inflate menu 
    PopupMenu popup = new PopupMenu(mContext, view); 
    MenuInflater inflater = popup.getMenuInflater(); 
    inflater.inflate(R.menu.menu, popup.getMenu()); 
    popup.setOnMenuItemClickListener(new MyMenuItemClickListener(pos)); 
    popup.show(); 
} 


class MyMenuItemClickListener implements PopupMenu.OnMenuItemClickListener { 

    int pos; 

    public MyMenuItemClickListener(int pos) { 
     this.pos = pos; 
    } 

    @Override 
    public boolean onMenuItemClick(MenuItem menuItem) { 
     switch (menuItem.getItemId()) { 
      case R.id.action_add_favourite: 
       Toast.makeText(mContext, "Add to favourite", Toast.LENGTH_SHORT).show(); 
       return true; 
      case R.id.action_more_info: 
       Intent slideStart = new Intent(mContext, SlideViewActivity.class); 

       super.getClass(); 

       slideStart.putExtra("position", pos); 

       slideStart.putExtra("list", (Serializable) dogList); 

       mContext.startActivity(slideStart); 
       return true; 
      default: 
     } 
     return false; 
    } 
} 
Смежные вопросы