我在项目中需要帮助,如何在RecyclerView中更改Intent,这是我的代码

时间:2016-09-04 08:20:44

标签: android

这是我的MainActivity,我使用了Recylcer View,我想在我按下RecyclerView中使用的一个封面图片时改变意图

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private AlbumsAdapter adapter;
    private List<Album> albumList;


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

        initCollapsingToolbar();

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

        albumList = new ArrayList<>();
        adapter = new AlbumsAdapter(this, albumList);


        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);

        prepareAlbums();

        try {
            Glide.with(this).load(R.drawable.cover2).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;
                }
            }
        });
    }

    /**
     * Adding few albums for testing
     */
    private void prepareAlbums() {
        int[] covers = new int[]{
                R.drawable.robotics,
                R.drawable.coding,
                R.drawable.gaming,
                R.drawable.civil,
                R.drawable.electronics,
                R.drawable.onspot,
                R.drawable.album11};


        Album a = new Album("Robotics", 4, covers[0]);
        albumList.add(a);

        a = new Album("Coding", 4, covers[1]);
        albumList.add(a);

        a = new Album("Gaming", 4, covers[2]);
        albumList.add(a);

        a = new Album("Civil", 2, covers[3]);
        albumList.add(a);

        a = new Album("Electrical", 3, covers[4]);
        albumList.add(a);

        a = new Album("Miscellaneous", 6, covers[5]);
        albumList.add(a);


        adapter.notifyDataSetChanged();
    }

    @Override
    public void onClick(View view) {
        if(view == recyclerView){
            Intent i = new Intent(getApplicationContext(), SimpleTabsActivity.class);
            startActivity(i);
        }

    }

    /**
     * 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()));
    }
}

这是我的AdapterClass

公共类AlbumsAdapter扩展了RecyclerView.Adapter {

private Context mContext;
private List<Album> albumList;

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 AlbumsAdapter(Context mContext, List<Album> albumList) {
    this.mContext = mContext;
    this.albumList = albumList;
}

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

    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
    Album album = albumList.get(position);
    holder.title.setText(album.getName());
    holder.count.setText(album.getNumOfSongs() + " events");

    // loading album cover using Glide library
    Glide.with(mContext).load(album.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 3 dots
 */
private void showPopupMenu(View view) {
    // inflate menu
    PopupMenu popup = new PopupMenu(mContext, view);
    MenuInflater inflater = popup.getMenuInflater();
    inflater.inflate(R.menu.menu_album, 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_play_next:
                Toast.makeText(mContext, "Go to next", Toast.LENGTH_SHORT).show();
                return true;
            default:
        }
        return false;
    }
}

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

}

2 个答案:

答案 0 :(得分:0)

您需要在RecyclerView上设置onclick侦听器,因此当单击卡片视图时,它将通知您选择了哪个元素。您从适配器获取该元素,并通过intent将其传递给其他活动。这是一个完整的示例代码。

Passing data to another Activity when clicking on RecyclerView

所以基本上你需要做这三件事:

第1步您需要定义一个在RecyclerView.Adapter的{​​{1}}回调中夸大的布局。它需要具有这种布局结构

onCreateViewHolder

第2步:在<Some Root Layout> <CardView android:id="give it an id so you can refer it in your code"> </CardView> </Some Root Layout> 中,获取具有给定ID的ViewHolder的参考。

CardView

第3步在适配器的public static class ViewHolder extends RecyclerView.ViewHolder { public TextView name; public TextView phone; public CardView card; public ViewHolder(View itemView) { super(view); name = (TextView) itemView.findViewById(name_id); phone = (TextView) itemView.findViewById(phone_id); card = (CardView) itemView.findViewById(id of the card view); } } 方法中执行以下操作:

onBindViewHolder

然后在 @Override public void onBindViewHolder(ViewHolder holder, final int position) { // get your object from your adapter at position holder.card.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(mContext, SecondActivity.class); intent.putExtra(SecondActivty.SELECTED_POSITION_KEY, position); startActivity(intent); } }); } 的{​​{1}}方法中执行

SecondActivity

答案 1 :(得分:0)

onBindViewHolder AlbumsAdapter内,您可以像设置showPopupMenu一样设置点击监听器。只需在RecycleView的自定义原始xml中为您的coverflow分配一个id,并将其添加到适配器中的MyViewHolder类中。然后在onBindViewHolder内,您可以访问此视图参考并将OnClickListener设置为该参考。

holder.yourCoverFlowId.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // do your intent stuffs here
    }
});