简体   繁体   English

单击RecyclerView中包含在片段中的项目以打开带有传递数据的新活动

[英]Click On An Item In RecyclerView Contained In A Fragment To Open New Activity With Passed Data

I have a MainActivity and Three Fragments with recyclerViews inside the three fragments, the recyclerview contain two textviews, i want the user to click on the recyclerview and the text in should be passed on to the new activity, i am a little bit new so i would appreciate it if you can give me detailed code and some explanation. 我在三个片段中都有一个MainActivity和三个带有recyclerViews的片段,recyclerview包含两个textview,我希望用户单击recyclerview并将其中的文本传递给新活动,我有点新,所以我如果您能给我详细的代码和一些解释,将不胜感激。

I want to click on an item in the recyclerview and that should open a new activity, data(text) should be passed from the recyclerview to the new activity. 我想在recyclerview中单击一个项目,这应该打开一个新活动,数据(文本)应该从recyclerview传递到新活动。

Here is my code for the HymnModel.java 这是我的HymnModel.java代码

public class HymnModel {

String title;
String song;


HymnModel(String title, String song){
    this.title=title;
    this.song=song;
}

public String getTitle() {return title;
}

public String getSong() {
    return song;
}
}

Here is the code for ItemVeiwHolder.java 这是ItemVeiwHolder.java的代码

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;
import com.tutorialsbuzz.recyclerview.R;

public class ItemViewHolder extends RecyclerView.ViewHolder {

public TextView title_textview;
public TextView song_textview;



public ItemViewHolder(View itemView) {
    super(itemView);
    itemView.setClickable(true);
    title_textview = (TextView) itemView.findViewById(R.id.song_title);
    song_textview = (TextView) itemView.findViewById(R.id.song);

}

public void bind(HymnModel hymnModel) {
    title_textview.setText(hymnModel.getTitle());
    song_textview.setText(hymnModel.getSong());

}


}

Here is my Adapter class 这是我的适配器类

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.tutorialsbuzz.recyclerview.R;
import java.util.ArrayList;
import java.util.List;

public class RVAdapter extends RecyclerView.Adapter<ItemViewHolder> {

private List<HymnModel> mCountryModel;
private List<HymnModel> mOriginalCountryModel;

public RVAdapter(List<HymnModel> mCountryModel) {
    this.mCountryModel = mCountryModel;
    this.mOriginalCountryModel = mCountryModel;
}

@Override
public void onBindViewHolder(ItemViewHolder itemViewHolder, int i) {
    final HymnModel model = mCountryModel.get(i);
    itemViewHolder.bind(model);
}

@Override
public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_row, viewGroup, false);
    return new ItemViewHolder(view);
}

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

public void setFilter(List<HymnModel> countryModels){
    mCountryModel = new ArrayList<>();
    mCountryModel.addAll(countryModels);
    notifyDataSetChanged();
}

 }

Here is the code for one my fragments 这是我的一个片段的代码

public class TabOneFragment extends Fragment implements SearchView.OnQueryTextListener {

private RecyclerView recyclerview;
private List<HymnModel> mHymnModel;
private RVAdapter adapter;

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.tab_one_fragment, container, false);

    recyclerview = (RecyclerView) view.findViewById(R.id.recyclerview);
    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    recyclerview.setLayoutManager(layoutManager);

    return view;
}


@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    setHasOptionsMenu(true);
    int numOfSongs = 32;


    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);

    int height = metrics.heightPixels;
    int width = metrics.widthPixels;

    String [] titles = {HymnTitles.hymnTitle1, HymnTitles.hymnTitle2, HymnTitles.hymnTitle3, HymnTitles.hymnTitle4, HymnTitles.hymnTitle5,
            HymnTitles.hymnTitle6, HymnTitles.hymnTitle7, HymnTitles.hymnTitle8, HymnTitles.hymnTitle9, HymnTitles.hymnTitle10, HymnTitles.hymnTitle11,
            HymnTitles.hymnTitle12};

    String [] songs = {Hymns.hymn1.substring(width/5), Hymns.hymn2, Hymns.hymn3, Hymns.hymn4, Hymns.hymn5, Hymns.hymn6, Hymns.hymn7, Hymns.hymn8, Hymns.hymn9, Hymns.hymn10, Hymns.hymn11, Hymns.hymn12};

    mHymnModel = new ArrayList<>();



    for (int i = 0; i < titles.length; i++) {
        mHymnModel.add(new HymnModel(i + "." + " " + titles[i], "  " + songs[i]));
    }

    adapter = new RVAdapter(mHymnModel);
    recyclerview.setAdapter(adapter);
}


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_main, menu);

    final MenuItem item = menu.findItem(R.id.action_search);
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
    searchView.setOnQueryTextListener(this);

    MenuItemCompat.setOnActionExpandListener(item,
            new MenuItemCompat.OnActionExpandListener() {
                @Override
                public boolean onMenuItemActionCollapse(MenuItem item) {
                    // Do something when collapsed
                    adapter.setFilter(mHymnModel);
                    return true; // Return true to collapse action view
                }

                @Override
                public boolean onMenuItemActionExpand(MenuItem item) {
                    // Do something when expanded
                    return true; // Return true to expand action view
                }
            });
}

@Override
public boolean onQueryTextChange(String newText) {
    final List<HymnModel> filteredModelList = filter(mHymnModel, newText);
    adapter.setFilter(filteredModelList);
    return true;
}

@Override
public boolean onQueryTextSubmit(String query) {
    return false;
}


private List<HymnModel> filter(List<HymnModel> models, String query) {
    query = query.toLowerCase();

    final List<HymnModel> filteredModelList = new ArrayList<>();
    for (HymnModel model : models) {
        final String text = model.getSong().toLowerCase();
        if (text.contains(query)) {
            filteredModelList.add(model);
        }
    }
    return filteredModelList;
}

 }

My MainActivity 我的主要活动

public class MainActivity extends AppCompatActivity {

private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;

private int[] tabIcons = {
        R.drawable.ic_action_person,
        R.drawable.ic_action_group,
        R.drawable.ic_action_call
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    ActionBar actionBar = getSupportActionBar();

    actionBar.setDisplayHomeAsUpEnabled(true);


    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tablayout);
    tabLayout.setupWithViewPager(viewPager);

}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new TabOneFragment(), "Tab 1");
    adapter.addFragment(new TabTwoFragment(), "Tab 2");
    adapter.addFragment(new TabThreeFragment(), "Tab 3");
    viewPager.setAdapter(adapter);

}


}

And lastly my ViewPageAdapter 最后是我的ViewPageAdapter

   public class ViewPagerAdapter extends FragmentStatePagerAdapter {

    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }
}

Thank You. 谢谢。

  1. Create an interface 创建一个界面

     public interface OnHymnClickListener { void onHymnClick(HymnModel hymnModel); } 
  2. Pass the listener to the adapter 将监听器传递给适配器

     public class RVAdapter extends RecyclerView.Adapter<ItemViewHolder> { private OnHymnClickListener listener; public void setListener(OnHymnClickListener listener) { this.listener = listener; } @Override public void onBindViewHolder(ItemViewHolder itemViewHolder, int i) { final HymnModel model = mCountryModel.get(i); itemViewHolder.bind(model); itemViewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(listener != null) { listener.onHymnClick(model); } } }); } } 
  3. Let your fragment implement it 让您的片段实现它

     public class TabOneFragment extends Fragment implements SearchView.OnQueryTextListener, OnHymnClickListener { @Override public void onHymnClick(HymnModel hymnModel) { //put data to bundle and startActivity } @Override public void onViewCreated(View view, Bundle savedInstanceState) { adapter = new RVAdapter(mHymnModel); adapter.setListener(this); recyclerview.setAdapter(adapter); } } 

Hello first of all you always want to start your activity from activity or fragment. 您好,首先,您始终想从活动或片段开始活动。 Never start it from adapter. 切勿从适配器启动它。

So in your adapter constructor add this 因此,在您的适配器构造函数中添加此代码

public AdapterName(......,Context context){
...your code.
this.mContext=context;
}

pass context there. 在那里传递上下文

and than inside this method 比这个方法里面

public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

view.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        if(mContext instanceof YourActivityName){
            ((YourActivityName)mContext).yourDesiredMethod();
        }
    }
});

暂无
暂无

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

相关问题 如何在RecyclerView中使用不同的数据和照片在项目单击上打开新的活动 - How to open new Activity on item click with different data and photo in RecyclerView 如何在传递单击的自定义列表项的数据时单击带有RecyclerView的片段项时打开新活动? - How to open a new activity when an item of a fragment with RecyclerView is clicked while passing the data of the clicked custom list item? 如何根据RecyclerView中的单击项在新活动中打开特定片段 - How to open specific Fragment in new Activity depending on clicked item in RecyclerView 将 recyclerview 项目的文本视图中的字符串发送到新片段并在单击时启动该片段活动 - Send strings in recyclerview item's text views to new fragment and start that fragment activity on click 在 RecyclerView 的新活动中打开项目(来自 json 的数据) - Open item in new activity from RecyclerView (data from json) 片段不会在 RecyclerView 项目单击时打开 - Fragment won't open on RecyclerView item click 将片段列表项单击中的解析数据传递到新活动 - Passing parse data from fragment list item click to new activity 带有单击项上的导航栏的recyclerview打开活动 - recyclerview open activity with navbar on click item Recyclerview item onClick 从 Main Activity Fragment 打开一个片段 - Recyclerview item onClick to open a fragment from Main Activity Fragment 单击项目时具有ListView打开片段的Android活动 - Android activity with ListView open fragment on item click
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM