首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我在我的项目中需要帮助,如何在我的RecyclerView中改变意图,这是我的代码

我在我的项目中需要帮助,如何在我的RecyclerView中改变意图,这是我的代码
EN

Stack Overflow用户
提问于 2016-09-04 08:20:43
回答 2查看 85关注 0票数 1

这是我的MainActivity,在这里我使用了Recylcer视图,当我按下RecyclerView中使用的封面图片时,我想改变它的意图。

代码语言:javascript
运行
复制
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 {

代码语言:javascript
运行
复制
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();
}

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-04 08:51:36

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

Passing data to another Activity when clicking on RecyclerView

基本上,你需要做以下三件事:

步骤1您需要定义一个将在RecyclerView.AdapteronCreateViewHolder回调中膨胀的布局。

代码语言:javascript
运行
复制
<Some Root Layout>
    <CardView
         android:id="give it an id so you can refer it in your code">
    </CardView>
</Some Root Layout>

步骤2在您的ViewHolder中,获取具有给定id的CardView的引用。

代码语言:javascript
运行
复制
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);
        }
    }

步骤3适配器的onBindViewHolder方法中的执行以下操作:

代码语言:javascript
运行
复制
    @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);
            }
        });
    }

然后在SecondActivityonCreate方法中做

代码语言:javascript
运行
复制
public static final String SELECTED_POSITION_KEY = "select_position";

private int mSelectedPosition;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mSelectedPosition = getIntent().getIntExtra(SELECTED_POSITION_KEY, default_value);

}
票数 0
EN

Stack Overflow用户

发布于 2016-09-04 09:00:50

onBindViewHolder中的AlbumsAdapter中,您可以设置单击侦听器,就像为showPopupMenu所做的一样。只需在RecycleView的自定义原始xml中为覆盖流分配一个id,并将其添加到适配器中的MyViewHolder类中。然后,在onBindViewHolder内部,您可以访问该视图引用,并将OnClickListener设置为该引用。

代码语言:javascript
运行
复制
holder.yourCoverFlowId.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // do your intent stuffs here
    }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39314922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档