私は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を呼び出すように見えます。私は恐ろしいことを明らかにしたことがあるかもしれませんが、このコードを何時間も見つめていて、それを理解できません。どんな助けでも大歓迎です。