简体   繁体   English

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

[英]Passing RecyclerView CardView Clicked Item Data To Activity

I have a question about passing clicked cardview data to activity, and here the full story : 我有一个关于将点击的cardview数据传递给活动的问题,这里有完整的故事:

  1. I have an Activity called "Details", which contains 2 TextViews in it's layout, Title & Description . 我有一个名为“详细信息”的活动,其中包含2个TextViews的布局,标题和描述。

  2. I have setup a fragment ( tab_1 ) which contain the recyclerview codes and the the items data, each item of those contain : title & description . 我已经设置了一个片段(tab_1),其中包含recyclerview代码和items数据,每个项目包含:标题和描述。

What i want : 我想要的是 :

When the user click the item, it will open the Details Activity, and change Details layout title, with clicked item title, and the same for description . 当用户单击该项目时,它将打开详细信息活动,并更改详细信息布局标题,单击项目标题,以及相同的描述。

I've manged to create the other activity as an example, and made intent to start it, plus adding "addOnTouchlistener" thanks to Stackoverflow, i've found the way to make it . 我已经创建了另一个活动作为一个例子,并且意图启动它,再加上“addOnTouchlistener”,感谢Stackoverflow,我找到了实现它的方法。

So, how to make this alive? 那么,如何使这个活着? I've tried many ways of the available answers on Stackoverflow, but all of them not working, or not related to my request . 我已经在Stackoverflow上尝试了许多可用答案的方法,但所有这些方法都不起作用,或者与我的请求无关。

Here are my files : 这是我的文件:

itemsdata.java : itemsdata.java:

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

tab_1.java ( fragment ) 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;
}

}

Details Activity : 详情活动:

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

EDIT : I've made it, i have added a button which open the fragment, and passed the data, in the Adapter, but i want it via tab_1.java, not the Adapter, i mean i want to click on the item to open the fragment, not on a button, here a snap from my Adapter code ( i've added it in OnBindViewHolder ) 编辑:我已经做到了,我已经添加了一个打开片段的按钮,并在适配器中传递数据,但我希望它通过tab_1.java,而不是适配器,我的意思是我想点击项目到打开片段,而不是按钮,这里是我的适配器代码的快照(我已经在OnBindViewHolder中添加了它)

I've setup a OnClick and implemented the Vew.setOnClick ..etc, but when i click the item, nothing happen. 我已经设置了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);

    }

create an Interface inside your adapter containing methods . 在包含methods的适配器中创建一个Interface And while implementing your Adapter, those methods will be implemented in your activity and you can perform whatever action you want. 在实现适配器时,这些方法将在您的活动中实现,您可以执行您想要的任何操作。

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

you may try do this on your onItemClick() 您可以尝试在onItemClick()上执行此操作

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

and when oncreate in your DetailActivity,do this 当您在DetailActivity中创建oncreate时,请执行此操作

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

so you can pass title and description to DetailActivity 所以你可以将标题和描述传递给DetailActivity

First of all make your "itemsdata" object to implement Parcelable. 首先使你的“itemsdata”对象实现Parcelable。 You can check it here . 你可以在这里查看 In your onItemClick method you pass the object to your Details activity using intent.putExtra("key",listOfDataItems.get(position)); 在onItemClick方法中,使用intent.putExtra(“key”,listOfDataItems.get(position))将对象传递给Details活动。 In your DetailsActivity you can get your custom object with getParcelable("key") 在您的DetailsActivity中,您可以使用getParcelable(“key”)获取自定义对象

All above methods worked, but kinda long, so this one worked for me : 所有上述方法都有效,但有点长,所以这个方法对我有用:

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

And in Details.java : 在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);

IMO, you implement setOnClickListener inside Adapter of RecyclerView . IMO,您在RecyclerView Adapter中实现了setOnClickListener You can refer to my following sample code, then apply its logic to your code. 您可以参考我的以下示例代码,然后将其逻辑应用于您的代码。 Hope it helps! 希望能帮助到你!

public class MyRVAdapter extends RecyclerView.Adapter<MyRVAdapter.ViewHolder> {

    Context mContext;
    List<String> mStringList;

    public MyRVAdapter(Context mContext, List<String> mStringList) {
        this.mContext = mContext;
        this.mStringList = mStringList;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, parent, false);
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView textView1 = (TextView) v.findViewById(R.id.textView1);
                TextView textView2 = (TextView) v.findViewById(R.id.textView2);
                Bundle bundle = new Bundle();
                bundle.putString("key1", textView1.getText().toString());
                bundle.putString("key2", textView2.getText().toString());

                passToAnotherActivity(bundle);
            }
        });
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        // do something...
    }

    @Override
    public int getItemCount() {
        if (mStringList != null) {
            return mStringList.size();
        }
        return 0;
    }

    private void passToAnotherActivity(Bundle bundle) {
        if (mContext == null)
            return;
        if (mContext instanceof MainActivity) {
            MainActivity activity = (MainActivity) mContext;
            activity.passToAnotherActivity(bundle); // this method must be implemented inside `MainActivity`
        }
    }

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public ViewHolder(View itemView) {
            super(itemView);
            // do something...
        }

        @Override
        public void onClick(View v) {
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在Firebase RecyclerView Cardview中单击项目时如何打开详细信息活动 - How to open a details activity when an item is clicked in Firebase RecyclerView Cardview 单击recyclerView Item时如何将数据获取到webView活动中 - how to get data into webView activity when recyclerView Item is clicked 单击项目时将数据从 RecyclerView 传递到 Fragment - Passing Data from RecyclerView to Fragment when Item is Clicked 将数据从listview中的单击项传递到另一个活动时出错 - Error while passing data from clicked item in listview to another activity 单击recyclerview上的项目时的多个数据 - Multiple data when clicked item on recyclerview 在recyclerview中单击项目时获取数据 - get the data when an Item is clicked in recyclerview 单击时将数据RecyclerView数据传递到另一个活动 - Passing data RecyclerView data to another activity on click 如何根据RecyclerView中的单击项在新活动中打开特定片段 - How to open specific Fragment in new Activity depending on clicked item in RecyclerView 将在 RecyclerView 中单击的正确项目 position 返回到另一个活动 - Return the correct item position clicked in RecyclerView to another activity RecyclerView + CardView:填充错误数据 - RecyclerView + CardView: Inflating Wrong Data
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM