将RecyclerView CardView点击项目数据传递给活动

时间:2015-12-22 01:19:08

标签: java android android-fragments android-recyclerview android-cardview

我有一个关于将点击的cardview数据传递给活动的问题,这里有完整的故事:

  1. 我有一个名为“详细信息”的活动,其中包含2个TextViews的布局,标题&说明。

  2. 我设置了一个片段(tab_1),其中包含recyclerview代码和项目数据,每个项目包含:title&说明。

  3. 我想要的是什么:

    当用户点击该项目时,它将打开详细信息活动,并更改详细信息布局标题,单击项目标题,以及相同的描述。

    我已经创建了另一个活动作为一个例子,并且意图启动它,再加上“addOnTouchlistener”,感谢Stackoverflow,我找到了实现它的方法。

    那么,如何让它活着?我已经在Stackoverflow上尝试了许多可用答案的方法,但所有这些方法都不起作用,或与我的请求无关。

    以下是我的文件:

    itemsdata.java:

    public class itemsdata {
    int CatPic;
    String title;
    String Descr;
    int Exapnd;
    int expand_no;
    

    tab_1.java(片段)

    public class tab_1 extends Fragment implements SearchView.OnQueryTextListener {
    
    private RecyclerView mRecyclerView;
    public RecyclingViewAdapter adapter;
    private Activity context;
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View layout = inflater.inflate(R.layout.tab_1, container, false);
        mRecyclerView = (RecyclerView)layout.findViewById(R.id.recycler_view);
        mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener
                (getContext(), new RecyclerItemClickListener.OnItemClickListener() {
    
                    @Override
                    public void onItemClick(View view, int position) {
                        Intent i = new Intent(view.getContext(), DetailsActivity.class);
                        view.getContext().startActivity(i);
                    }
                }));
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        adapter = new RecyclingViewAdapter(getActivity(),Listed());
        mRecyclerView.setAdapter(adapter);
        return layout;
    
    }
    
    
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.main, menu);
    
        final MenuItem item = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
        searchView.setOnQueryTextListener(this);
    }
    
    @Override
    public boolean onQueryTextChange(String query) {
        final List<itemsdata> filteredModelList = filter(Listed(), query);
        adapter.animateTo(filteredModelList);
        mRecyclerView.scrollToPosition(0);
        return true;
    }
    
    @Override
    public boolean onQueryTextSubmit(String query) {
        return true;
    }
    
    private List<itemsdata> filter(List<itemsdata> models, String query) {
        query = query.toLowerCase();
    
        final List<itemsdata> filteredModelList = new ArrayList<>();
        for (itemsdata model : models) {
            final String text = model.title.toLowerCase();
            if (text.contains(query)) {
                filteredModelList.add(model);
            }
        }
        return filteredModelList;
    }
    
    public List<itemsdata> Listed()
    {
        //Titles Strings
        String sys_title1 = getString(R.string.system_item_title_1);
        String sys_title2 = getString(R.string.system_item_title_2);
        String sys_title3 = getString(R.string.system_item_title_3);
    
        //Description Strings
        String sys_descr1 = getString(R.string.system_item_desc_1);
        String sys_descr2 = getString(R.string.system_item_desc_2);
        String sys_descr3 = getString(R.string.system_item_desc_3);
    
        //Adding New Cards
        List<itemsdata> data = new ArrayList<>();
    
        //Categories Icons New Items ** Make It The Same
        int[] icons = {
                R.drawable.facebook_icon ,
                R.drawable.twitter_icon ,
                R.drawable.twitter_icon
        };
    
        //Expand Button New Items
        int[] expandbutton = {
                R.drawable.expanded ,
                R.drawable.expanded ,
                R.drawable.expanded
        };
    
        //UnExpand Button New Items
        int[] unexpandbutton = {
                R.drawable.ca_expand ,
                R.drawable.ca_expand ,
                R.drawable.ca_expand
        };
    
        //Titles New Items
        String[] titles = {
                sys_title1 ,
                sys_title2 ,
                sys_title3
        };
    
        //Description New Items
        String[] Description = {
                sys_descr1 ,
                sys_descr2 ,
                sys_descr3
        };
    
    
        for(int i = 0;i<titles.length && i < icons.length  && i < Description.length && i < unexpandbutton.length && i < expandbutton.length  ; i++)
        {
            itemsdata current = new itemsdata();
            current.CatPic = icons[i];
            current.title = titles[i];
            current.Descr = Description[i];
            current.expand_no = unexpandbutton[i];
            current.Exapnd = expandbutton[i];
            data.add(current);
        }
        return data;
    }
    
    }
    

    详情活动:

    public class DetailsActivity extends AppCompatActivity{
    
    TextView title;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.details);
        title = (TextView)findViewById(R.id.details_title);
    }
    
    编辑:我已经做到了,我已经添加了一个打开片段的按钮,并在适配器中传递数据,但我想通过tab_1.java,而不是适配器,我的意思是我想点击打开片段的项目,而不是按钮,这里是我的适配器代码的快照(我在OnBindViewHolder中添加了它)

    我已经设置了OnClick并实现了Vew.setOnClick ..etc,但是当我点击该项目时,没有任何反应。

     @Override
    public void onBindViewHolder(final MyRecycleViewHolder holder, int position) {
    
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(v.getContext(),DetailsActivity.class);
                v.getContext().startActivity(i);
            }
        });
    
        //Referencing Data
        final itemsdata currentobject = mdata.get(position);
        //Referencing Items
        holder.ProbTitle.setText(currentobject.title);
        holder.ProbDescr.setText(currentobject.Descr);
        holder.CategoryPic.setImageResource(currentobject.CatPic);
        holder.ExpandButton.setImageResource(currentobject.Exapnd);
        holder.ExpandNoButton.setImageResource(currentobject.expand_no);
            //What Happen When You Click Expand Button .
        holder.ExpandButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(v.getContext(), DetailsActivity.class);
                i.putExtra("TitleKey",holder.ProbTitle.getText().toString());
                v.getContext().startActivity(i);
                }
            }
        );
    
    public static class MyRecycleViewHolder extends RecyclerView.ViewHolder
    {
    
    
    
        SwipeLayout swipeLayout;
        //Defining Items .
        TextView ProbTitle;
        ImageButton ExpandButton;
        TextView ProbDescr;
        ImageButton ExpandNoButton;
        ImageView CategoryPic;
        /*
        TextView Card_Star;
        TextView Card_UnStar;
        */
        TextView Card_Share;
    
        //Referencing Resources
        public MyRecycleViewHolder(final View itemView) {
            super(itemView);
            ProbTitle = (TextView) itemView.findViewById(R.id.prob_title);
            CategoryPic = (ImageView) itemView.findViewById(R.id.cat_pic);
            ProbDescr = (TextView) itemView.findViewById(R.id.prob_descr);
            ExpandButton = (ImageButton) itemView.findViewById(R.id.expand_button);
            ExpandNoButton = (ImageButton) itemView.findViewById(R.id.expand_no_button);
            /*
            Card_Star = (TextView) itemView.findViewById(R.id.card_star);
            Card_UnStar = (TextView) itemView.findViewById(R.id.card_unstar);
            */
            Card_Share = (TextView) itemView.findViewById(R.id.card_share);
            swipeLayout = (SwipeLayout) itemView.findViewById(R.id.swipe);
    
        }
    

5 个答案:

答案 0 :(得分:3)

在包含Interface的适配器中创建methods。在实现适配器时,这些方法将在您的活动中实现,您可以执行您想要的任何操作。

    public class Adapter extends RecyclerView.Adapter<MyRecycleViewHolder> {

    public interface Callbacks {
        public void onButtonClicked(String titleKey);
    }

    private Callbacks mCallbacks;

    public Adapter() {

    }

    @Override
    public MyRecycleViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_details, null);
        return new MyRecycleViewHolder(v);
    }

    @Override
    public void onBindViewHolder(final MyRecycleViewHolder holder, final int i) {

        holder.ExpandButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mCallbacks != null) {
                    mCallbacks.onButtonClicked(holder.ProbTitle.getText().toString());
                }
            }
        });

    }


    @Override
    public int getItemCount() {
        return;
    }

    public void setCallbacks(Callbacks callbacks) {
        this.mCallbacks = callbacks;
    }
}   

答案 1 :(得分:1)

您可以尝试在onItemClick()

上执行此操作

Intent i = new Intent(view.getContext(), DetailsActivity.class); i.putExtra("title", yourTitle); i.putExtra("description", yourDescription); view.getContext().startActivity(i);

当您在DetailActivity中创建oncreate时,请执行此操作

String title = getIntent().getStringExtra("title"); String description = getIntent().getStringExtra("description");

因此您可以将标题和说明传递给DetailActivity

答案 2 :(得分:1)

首先使你的“itemsdata”对象实现Parcelable。你可以查看它here。在onItemClick方法中,使用intent.putExtra(“key”,listOfDataItems.get(position))将对象传递给Details活动。 在您的DetailsActivity中,您可以使用getParcelable(“key”)

获取自定义对象

答案 3 :(得分:1)

以上所有方法都有效,但有点长,所以这个方法对我有用:

Cardview cardview;
            cardView = (CardView)itemView.findViewById(R.id.cv);

        cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent (view.getContext(), DetailsActivity.class);
                i.putExtra("TitleKey",ProbTitle.getText().toString());
                i.putExtra("DescrKey",ProbDescr.getText().toString());
                view.getContext().startActivity(i);
            }
        });

在Details.java中:

    TextView title;
TextView Descr;
        title = (TextView)findViewById(R.id.details_title);
    Descr = (TextView)findViewById(R.id.details_descr);

    String titleresult = result.getExtras().getString("TitleKey");
    String Descrresult = result.getExtras().getString("DescrKey");

    title.setText(titleresult);
    Descr.setText(Descrresult);

答案 4 :(得分:0)

IMO,您在setOnClickListener的{​​{1}}内实施Adapter。您可以参考我的以下示例代码,然后将其逻辑应用于您的代码。希望它有所帮助!

RecyclerView