コードなしで心からお詫び申し上げます。私は結婚式のために出発します。それはポストコードか自分の状況を説明しています。Recycler AdapterでRecycler Fragmentを呼び出す方法はありますか?これも可能ですか?
私はStackを検索し、Recycler Adapter to Fragment(アダプタを作成したもの)インターフェイスの多くの記事を参照しました。
アダプターのポストへのフラグメント(アダプターの作成)のマイナーなものはほとんどありませんが、それほど明確ではありません。
私の状況はこれです:メイン活動に
、アプリケーションが実行されている場合:
1)断片歌詞(リリックリサイクラービューに設定されているRECYCLERアダプタを作成した)
2)フラグメントマイク(音声認識マイク機能とXMLアイコン)。
何が起こるしたいことです:
ユーザーは結果のデータは、アダプタのJavaファイルに渡され、アダプタ上の方法を活性化し、上RecyclerView Viewholderに視覚的な変化を引き起こしていることを、マイクを活性化し、話します画面。
はい、これはおそらくアーキテクチャが悪いことです。それは学校のプロジェクトのため、私は学んでいる、私は時間を使い果たした。私はこれまで*
を行うことができますどのような
*私はそれが発火する、(RecyclerViewためにユーザーがスクロールを既製のOnClickアダプタのlisterner(ユーザーがビューをクリックしたとき)とOnScrollが有効になっています現在のビューを変更させるアダプタ内のメソッド)。
私はマイクの断片から主なアクティビティを通して歌詞の断片に音声データを渡すためのインターフェイスを作っています。
メインでは、単純に歌詞フラグメントのインスタンスを作成し、音声データを取り込む歌詞フラグメントでカスタムメソッドを呼び出します。このようなもの。
LyricsFragment.TakeSpeechData(speech data);
*どのような私の計画はだった... *
音声データは、歌詞フラグメントに到着すると、私はちょうどのようなものを書くことができると思った:
MyRecyclerAdapter.SomeMethodOnAdapter (speech data);
私はこの時点で自宅にいるだろう。
それは
ませ行く動作しません。ここではnullポインタ例外が発生します。メソッド呼び出しのMyRecyclerAdapter部分がnullです。私はそれを見て、それを修正する方法がわからない。
フラグメントがRecyclerViewをレイアウトしてすべてを設定したときに作成された元のアダプタを参照していると仮定しています。これはAdapter on Fragmentの歌詞と同じグローバル変数で、私はそれが "生きている"と仮定しています。
私は根本的なJavaの原則に欠けていると確信していますが、わかりません。
私はこの試み、読書、研究に何時間も費やしました。私は完全に立ち往生している。助けてください。
編集:これは私のVerseFragmentのコードです(私の記事の "Lyrics" Fragmentという意味です)。このフラグメントは、画面上のrecyclerViewで読み込まれ、作成され、機能することに注意してください。ユーザーが画面上にあるmicrphoneフラグメントを使用する前に、これはすでに作成されています。
public class VersesList extends Fragment {
@BindView(R.id.versesRecycleView) RecyclerView versesRecycleView;
@BindView(R.id.songNameTextView) TextView songName;
@BindView(R.id.artistTextView)TextView artistName;
private SharedPreferences mSharedPreferences;
LinearLayoutManager llm;
List verseList;
List finalModVerseList;
public VerseAdapter verseAdapter;
// temporary
private SharedPreferences.Editor editor;
public VersesList() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_verses_list, container, false);
ButterKnife.bind(this, view);
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
editor=mSharedPreferences.edit();
displayArtistAndSongName();
lyricsToVerseList();
setVersesIntoRecyclerView();
setVersesScrollListener();
//temp
storeAllVerseLevels();
return view;
}
public static VersesList newInstance(String lyrics){
VersesList versesListFragment = new VersesList();
Bundle args = new Bundle();
args.putString("lyrics", lyrics);
versesListFragment.setArguments(args);
return versesListFragment;
}
public void lyricsToVerseList(){
String lyrics = getArguments().getString("lyrics", "");
verseList = new ArrayList<String>();
finalModVerseList = new ArrayList<String>();
verseList= Arrays.asList(lyrics.split("\n"));
int endOfFinalList=verseList.indexOf("...");
for (int i = 0; i < endOfFinalList; i++) {
if(!verseList.get(i).toString().equals("")){
String addThisVerse = verseList.get(i).toString();
//check on length of verse, if too short add next, check again
int numberOfWords = addThisVerse.split(" ").length;
while (numberOfWords < 10 && i < endOfFinalList) {
i++;
addThisVerse += " " + verseList.get(i).toString();
numberOfWords = addThisVerse.split(" ").length;
}
finalModVerseList.add(addThisVerse);
}
}
}
public void displayArtistAndSongName(){
String song = '"'+mSharedPreferences.getString(SONG_NAME, null)+'"';
String artist = "by "+mSharedPreferences.getString(ARTIST_NAME, null);
songName.setText(song);
artistName.setText(artist);
}
public void setVersesIntoRecyclerView(){
verseAdapter = new VerseAdapter(finalModVerseList, (MainActivity)getActivity(), versesRecycleView);
versesRecycleView.setAdapter(verseAdapter);
llm = new LinearLayoutManager(getActivity(),LinearLayoutManager.HORIZONTAL, false);
versesRecycleView.setLayoutManager(llm);
PagerSnapHelper helper = new PagerSnapHelper();
helper.attachToRecyclerView(versesRecycleView);
}
private void storeLevel(int indexNumber) {
editor.putInt(String.valueOf(indexNumber), 1).apply();
}
private void storeAllVerseLevels(){
for (int i=0; i< finalModVerseList.size();i++){
storeLevel(i);
}
for (int j=0; j< finalModVerseList.size();j++){
String level = String.valueOf(mSharedPreferences.getInt(String.valueOf(j), -1));
Log.d("In Shared Preferences ", "Verse "+j+" Level "+level);
}
}
public void checkSpeech(String text){
List<String> temp = new ArrayList<>();
temp.add("test");
VerseAdapter adapter = new VerseAdapter(temp, (MainActivity)getActivity(), versesRecycleView);
try {
adapter.resetVerse();
}catch (NullPointerException e){
Log.d("Null", e.toString());
}
}
public void setVersesScrollListener(){
versesRecycleView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == 0) {
verseAdapter.resetVerse();
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
}
}
あなたのアダプタからメソッドを呼び出している、を使用する必要があります。 Xiaはインスタンスを使用しています。MyRecyclerAdapter
インスタンスまたはクラスですか? someMethodOnAdpater(speechData)
に電話するには、インスタンス
作成されたフラグメント内からアダプタメソッドを呼び出す必要がある場合は、このような変数にアダプタメソッドを格納できます。
MyRecyclerAdapter adapter;
@Override
public View onCreateView(...) {
...
adapter = new MyRecyclerAdapter();
myRecyclerView.setAdapter(adapter);
...
}
public void takeSpeechData(String data) {
adapter.someMethodAdapter(data);
}
編集:
あなたrecyclerviewで使用するのと同じアダプタが設定された後にnullである私はなぜわかりません。アダプターの呼び出しは間違いありません(I tested a basic example)。私の例のコードは、あなたが以前に言っていたものと変わりありません。私は可視性のためにあなたの質問をupvotedしています。
**編集:マイクフラグメントを追加し、それはインターフェース**
package com.blueoxgym.javainthedark.Fragments;
/**
* A simple {@link Fragment} subclass.
*/
public class MicFragment extends Fragment implements View.OnClickListener {
@BindView(R.id.progressBarMic)
ProgressBar micLevels;
@BindView(R.id.btn_mic)
ImageButton btnMicrophone;
private SpeechRecognizer speech = null;
private Intent recognizerIntent;
public final static String TAG = "In speech mode";
public FragmentManager fragmentManager;
private SharedPreferences mSharedPreferences;
private SharedPreferences.Editor mEditor;
private String trackName;
private String artistName;
private CallMainLoadVerseFragment loadVerseFragment;
private CheckSpeech checkSpeechOnVerse;
public MicFragment() {
// Required empty public constructor
}
public static MicFragment newInstance(){
MicFragment micFragment = new MicFragment();
return micFragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_mic, container, false);
ButterKnife.bind(this, view);
this.loadVerseFragment = (CallMainLoadVerseFragment) getActivity();
this.checkSpeechOnVerse = (CheckSpeech) getActivity();
btnMicrophone.setOnClickListener(this);
fragmentManager = getFragmentManager();
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
mEditor = mSharedPreferences.edit();
return view;
}
@Override
public void onClick(View v) {
if (v == btnMicrophone) {
startSpeechToText();
}
}
class listener implements RecognitionListener {
...
@Override
public void onResults(Bundle results) {
String str = new String();
Log.d(TAG, "onResults " + results);
ArrayList<String> data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
String text = data.get(0).toLowerCase().replace("by","");
Fragment currentFragment = fragmentManager.findFragmentById(R.id.content_frame);
if (currentFragment.toString().contains("LyricSearch")){
searchForSong(text);
} else if (currentFragment.toString().contains("VersesList")){
-----------> Here it is called checkSpeechOnVerse.checkingSpeech(text);
}
}
}
public void startSpeechToText(){
btnMicrophone.setBackgroundResource(R.drawable.circle_green);
speech=SpeechRecognizer.createSpeechRecognizer(getContext());
speech.setRecognitionListener(new listener());
recognizerIntent= new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en-US");
recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getActivity().getPackageName());
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 5);
speech.startListening(recognizerIntent);
}
...
...
public interface CheckSpeech {
void checkingSpeech (String text);
}
}
MainActivityを持って、CheckSpeechインタフェースを実装して
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, MicFragment.CallMainLoadVerseFragment, MicFragment.CheckSpeech {
....
...
@Override
public void checkingSpeech(String text) {
VersesList versesList = new VersesList();
--------> Now, I'm pass data from Main to VersesList Fragment(it has the original Adapter)
versesList.checkSpeech(text);
}
私はアダプタを呼び出そう
VersesListフラグメント、
public class VersesList extends Fragment {
....
private VerseAdapter verseAdapter;
setVersesIntoRecyclerView();
....
<---ADAPTER IS MADE AND SET HERE----.
public void setVersesIntoRecyclerView(){
verseAdapter = new VerseAdapter(finalModVerseList, (MainActivity)getActivity(), versesRecycleView);
versesRecycleView.setAdapter(verseAdapter);
llm = new LinearLayoutManager(getActivity(),LinearLayoutManager.HORIZONTAL, false);
versesRecycleView.setLayoutManager(llm);
PagerSnapHelper helper = new PagerSnapHelper();
helper.attachToRecyclerView(versesRecycleView);
}
public void checkSpeech(String text){
-------> NPE NPE
versesAdapter.someMethodOnAdapter(text);
}
public void setVersesScrollListener(){
versesRecycleView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == 0) {
BUT THIS WORKS!!! No NPE. --------> verseAdapter.resetVerse();
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
// VerseAdapter.VerseViewHolder view = versesRecycleView.findViewHolderForAdapterPosition(llm.findFirstVisibleItemPosition());
}
});
}
、なぜあなたは新しいアダプタを作成していますか? –
checkingSpeech()では、新しいフラグメントをインスタンス化しますが、元のフラグメントを置き換えません。そのフラグメントは作成されますが、コンテナには追加されません。元のフラグメントを置き換える場合は、別のトランザクションを作成し、コンテナを 'transaction.replace(containerID、newFragment) 'に置き換えなければなりません –
同じフラグメントを使いたい場合は、' VersesList fragment =(VersesList)FragmentManager.findFragmentById(containerId)。 " –