2016-04-15 10 views
0

私はRecyclerViewを使いこなしていました。ただし、フラグメントで試してみるとすぐにUIは更新されません。フラグメント内でRecyclerViewアダプタが更新されない

MainActivity.java

import android.Manifest; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.design.widget.TextInputEditText; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.List; 

    public class MainActivity extends AppCompatActivity implements AddItemDialog.OnItemAddedListener { 

    private FloatingActionButton fab; 

    private FragmentManager manager; 

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

     RecyclerFragment rvf = new RecyclerFragment(); 
     manager = getSupportFragmentManager(); 
     FragmentTransaction ft = manager.beginTransaction(); 
     ft.add(R.id.frag_container, rvf, "TAG"); 
     ft.commit(); 

     fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
      AddItemDialog dialog = new AddItemDialog(); 
       dialog.show(getSupportFragmentManager(), "DIALOG"); 
      } 
     }); 
     fab.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View view) { 
       Intent intent = new Intent(getBaseContext(), _3DTouch.class); 
       startActivity(intent); 
       return true; 
      } 
     }); 

     if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1); 
     } 

     if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) 
       != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 2); 
     } 
    } 

    @Override 
    public void onDialogPositiveClick(String entry) { 
     RecyclerFragment rvfFrag = (RecyclerFragment) getSupportFragmentManager().findFragmentByTag("TAG"); 
     rvfFrag.refreshData(entry); 
    } 

    @Override 
    public void onDialogNegativeClick() {} 
} 

FragmentAdapter.java

import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

/** 
* Created by jfelt on 15/04/2016. 
*/ 
public class FragmentAdapter extends RecyclerView.Adapter<FragmentAdapter.ViewHolder> { 

    private List<TestEntry> testEntries = Collections.emptyList(); 

    public static class ViewHolder extends RecyclerView.ViewHolder { 

     TextView textView; 

     ViewHolder(View itemView) { 
      super(itemView); 
      textView = (TextView) itemView.findViewById(R.id.rv_item); 
     } 
    } 

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

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup vg, int i) { 
     View v = LayoutInflater.from(vg.getContext()).inflate(R.layout.entry, vg, false); 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder vh, int i) { 
     vh.textView.setText(testEntries.get(i).getItem()); 
    } 
} 

RecyclerFragment.java

import android.os.Bundle; 
import android.os.Handler; 
import android.os.Looper; 
import android.support.annotation.Nullable; 
import android.support.annotation.UiThread; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by jfelt on 14/04/2016. 
*/ 
public class RecyclerFragment extends Fragment { 

    List<TestEntry> testEntries = new ArrayList<>(); 

    private RecyclerView recyclerView; 
    private RecyclerView.Adapter adapter; 
    private RecyclerView.LayoutManager manager; 

    public RecyclerFragment() {} 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Bundle args = getArguments(); 
     if (args != null) { 
      Log.d("RecyclerFragment", String.valueOf(args)); 
     } 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     recyclerView = (RecyclerView) view.findViewById(R.id.recycler); 
     manager = new LinearLayoutManager(getActivity()); 
     recyclerView.setLayoutManager(manager); 
     adapter = new FragmentAdapter(); 
     recyclerView.setAdapter(adapter); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inf, ViewGroup vg, Bundle savedInstanceState) { 
     View rv = inf.inflate(R.layout.rv_layout, null); 
     return rv; 
    } 

    public void refreshData(String entry) { 
     Log.d("TAG", entry); 
     testEntries.add(new TestEntry(entry)); 
     Log.d("TAG", String.valueOf(testEntries)); 
     getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       adapter.notifyItemInserted(testEntries.size() - 1); 
      } 
     }); 
    } 
} 

ロギングrefreshdataをダイアログがリスナーからの入力を受けることを示しています。この問題は、適切に呼び出されないように見えるという点で、adapter.notifyItemInsertedを呼び出すように見えます。私は恐ろしいことを明らかにしたことがあるかもしれませんが、このコードを何時間も見つめていて、それを理解できません。どんな助けでも大歓迎です。

答えて

2

フラグメント内のtestEntriesをアダプタ内のtestEntriesにどのように参照しますか?私は問題は、あなたはあなたにアダプターの更新データを教えてはいけないと思います。私はそれをエントリに追加してからnotifyItemsInsertedにするために、アダプタ内で関数を作ることをお勧めします。

インサイドFragmentAdapter:

public void addItem(String entry){ 
    this.testEntries.add(entry); 
    notifyItemInserted(testEntries.size() - 1); 
} 

内部フラグメント:

((FragmentAdapter) getAdapter()).addItem(entry); 
0

FragmentAdapterRecyclerFragment私たちが参照している別のリストなので、あるアイテムを追加するときには追加されません。あなたの現在のコード構造で動作します

1つのオプションはどちらも同じListの参照を持つようにListを取るFragmentAdapterにコンストラクタを追加することです:

あなたのフラグメントパスの onViewCreated()
public FragmentAdapter(List<TestEntry testEntries) { 
    this.testEntries = testEntries; 
} 

、その後、そのリストにはFragmentAdapterコンストラクタのパラメータとして格納されます。あなたはその時点でUIスレッド上に既にあるので、

adapter = new FragmentAdapter(testEntries); 

また、あなたはgetActivity().runOnUiThreadは必要ありません。アイテムを追加するための呼び出しを行うことができます。

testEntries.add(new TestEntry(entry)); 
adapter.notifyItemInserted(testEntries.size() - 1); 
関連する問題