2016-11-18 29 views
0

我有一個MainActivity和三個碎片與recyclerViews三個片段內,recyclerview包含兩個textviews,我希望用戶點擊recyclerview和應該將文本傳遞給新的活動,我有點新,所以如果你能給我詳細的代碼和一些解釋,我將不勝感激。點擊RecyclerView中的項目包含在片段中以打開通過數據的新活動

我想單擊recyclerview中的一個項目,並打開一個新的活動,數據(文本)應該從recyclerview傳遞到新的活動。

這裏是我的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; 
} 
} 

下面的代碼爲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()); 

} 


} 

下面的代碼是我Adapter類

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

} 

這裏是代碼爲我的片段

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

} 

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

} 


} 

而且最後我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); 
    } 
} 

謝謝。

+0

確實title_textview..setOnClickListener(新View.OnClickListener());在活頁夾功能工作? (來自ItemViewHolder) – cokceken

回答

1

你好首先你總是想從活動或片段開始你的活動。 切勿從適配器啓動它。

所以在適配器構造函數添加此

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

背景那裏。

,比這個方法裏面

public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 

view.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     if(mContext instanceof YourActivityName){ 
      ((YourActivityName)mContext).yourDesiredMethod(); 
     } 
    } 
}); 
1
  1. 創建界面

    public interface OnHymnClickListener { 
        void onHymnClick(HymnModel hymnModel); 
    } 
    
  2. 傳遞聽者適配器

    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. 讓你的片段執行它

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

我應該在哪裏創建接口? –

+0

我創建了界面並添加了必要的代碼,但是我想單擊以打開一個新的活動,如SingleHymnViewActivity.java –

+0

@winfredadrah 請參閱此答案http://stackoverflow.com/a/15478302/3123335,將這些代碼放入片段中的方法'onHymnClick'。 如果你想發送HymnModel到SingleHymnViewActivity,那麼HymnModel需要實現'Parcelable',請參閱http://stackoverflow.com/a/26757130/3123335 –

相關問題