0

私はrecyclerviewの編集テキストの編集を終了したときにnotifydatasetchangedしようとしています(なぜですか?recyclerviewの他のオブジェクトはアクセス可能です。テキストの編集は「テスト」と同じです)。Android - notifyDataSetChanged editTextの編集が終了しました

だから私はここに、多くのビューホルダーにアダプターを持っているが、編集テキストのいずれかになります。

public EditTextViewHolder(View itemView, final Activity activity, final Context context, final String param) { 
    super(itemView); 

    this.activity = activity; 
    this.context = context; 
    this.param  = param; 


    name  = (TextView) itemView.findViewById(R.id.tEditTextName); 
    desc  = (TextView) itemView.findViewById(R.id.tEditTextDescription); 
    details  = (TextView) itemView.findViewById(R.id.tEditTextMoreDetails); 
    editText = (EditText) itemView.findViewById(R.id.eEditTextValue); 
    image  = (ImageView) itemView.findViewById(R.id.iEditTextImage); 
    lMain  = (LinearLayout) itemView.findViewById(R.id.layoutTaskEditText); 
    lOptional = (LinearLayout) itemView.findViewById(R.id.layoutEditTextOptional); 
    lRequired = (LinearLayout) itemView.findViewById(R.id.isRequiredTask); 

} 

public void setLayout(final Content content) { 
    name.setText(content.getTitle()); 

editText.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      content.getAnswers().get(0).setValue(s.toString().trim()); 
     } 
    }); 

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus) 
       TaskActivity.sAdapter.notifyDataSetChanged(); 
     } 
    }); 
} 

しかし、私はエラーが「RecyclerViewは、レイアウトを計算するか、スクロールしている間に、このメソッドを呼び出すことはできません」取得しています私がハンドラまたはUIスレッドで通知しようとしても、それは動作していません。

これは他のすべてのビュー所有者と連携します。編集テキストで何が間違っているのか分かりますか?

答えて

0

アクティビティの代わりにアダプタのnotifyDataSetChangedを呼び出し、UIThreadの内部で呼び出すようにしてください。

activity.runOnUiThread(new Runnable() { 

             @Override 
             public void run() { 

             } 
            }); 

とアダプタの内側には、データ

@Override 
    public int getItemCount() { 
    } 
+0

ねえ、私は確かに再びこのソリューションを試してみたが、それは間違いなく私はまだ「RecyclerViewながら、このメソッドを呼び出すことはできません持って働いていませんレイアウトやスクロールを計算しています "。私はさまざまなファイルに多くのビュー所有者を持っているので、私はアダプタがパブリックな静的なアクティビティで自分のアダプタを取得するのです。 –

+0

あなたのコードをもっと投稿できますか?また、メソッドsetLayoutをどこで呼び出しますか? –

+0

アダプタのonbind関数からsetLayout(名前が適切でない可能性があります)が呼び出されます。私はまたgetetemTypeをuset getetemType –

0

の右の数と、このメソッドを持っていることを確認します。この例外はおそらくあなたが notifyItemInserted(位置);, notifyItemChanged(位置)を呼び出しているときに発生します、または notifyItemRemoved(位置);バックグラウンドスレッド(または、バックグラウンドスレッドで実行される コールバック)から取得します。

UIスレッドでHandlerを使用し、この問題を解決するには、次の

android.os.Handler mHandler = getActivity().getWindow().getDecorView().getHandler(); 
mHandler.post(new Runnable() { 
    public void run(){ 
      //change adapter contents 
      mRecyclerViewAdapter.notifyItemInserted(position); 
    } 
}); 
+0

ちょっと、私はもう一度このソリューションを試みたが、アプリがクラッシュしないが、edittextがフォーカスを失うと、テキストは単に消えます。編集テキストに書いているときに私のオブジェクトの内容をチェックしています。それはうまくコピーされています。または、私が2つの同じオブジェクトをrecyclerview(編集テキスト)に持っていれば、編集してフォーカスを失うと、テキストが他の編集テキストに切り替わります。 –

関連する問題