2017-07-22 2 views
1

コードなしで心からお詫び申し上げます。私は結婚式のために出発します。それはポストコードか自分の状況を説明しています。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); 
      } 
     }); 
    } 
} 

あなたのアダプタからメソッドを呼び出している、MyRecyclerAdapterインスタンスまたはクラスですか? someMethodOnAdpater(speechData)に電話するには、インスタンスを使用する必要があります。 Xiaはインスタンスを使用しています。

作成されたフラグメント内からアダプタメソッドを呼び出す必要がある場合は、このような変数にアダプタメソッドを格納できます。

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

、なぜあなたは新しいアダプタを作成していますか? –

+1

checkingSpeech()では、新しいフラグメントをインスタンス化しますが、元のフラグメントを置き換えません。そのフラグメントは作成されますが、コンテナには追加されません。元のフラグメントを置き換える場合は、別のトランザクションを作成し、コンテナを 'transaction.replace(containerID、newFragment) 'に置き換えなければなりません –

+0

同じフラグメントを使いたい場合は、' VersesList fragment =(VersesList)FragmentManager.findFragmentById(containerId)。 " –

答えて

0

作成されたフラグメント内からアダプタメソッドを呼び出す必要がある場合は、そのフラグメント内の変数にアダプタメソッドを格納できます。

MyRecyclerAdapter adapter; 

@Override 
public View onCreateView(...) { 
    ... 
    adapter = new MyRecyclerAdapter(); 
    myRecyclerView.setAdapter(adapter); 
    ... 
} 

public void takeSpeechData(String data) { 
    adapter.someMethodAdapter(data); 
} 

次に、そのメソッドを別のフラグメントから直接呼び出すことができます。 `checkSpeech()`で(link to accessing fragments)

VersesList versesList = (VersesList) getActivity().getSupportFragmentManager.findFragmentById(containerId); 
versesList.takeSpeechData("data"); 

gif of example

+0

あなたの応答に感謝アダム。私はインスタンスを呼び出しています。あなたと同じように設定されています。イベントの連鎖は今のようなものです。 Mic Fragment、speech(この時点でVerse Fragmentが既に存在し、リサイクラビューがアクティブで機能しています)、音声データはMainActivityに渡され、そこでInterfaceメソッドがVerseのメソッド呼び出しをトリガします断片。詩には今のデータがあります。 Verse Fragmentでは、マイクを使用する前に、アダプタがすでにインスタンス化され、変数に設定されていて、recyclerviewビューに設定されていました。 – Xia

+0

アダプタを持つフラグメントにコードを投稿しました。 – Xia

+0

'checkSpeech()'では、なぜ新しいアダプタを作成していますか? –

関連する問題