Android RecyclerView适配器未在片段中更新
所以我一直在摆弄RecyclerView,我让它在活动中正常工作;但只要我在片段中尝试,它就不会更新UI MainActivity.javaAndroid RecyclerView适配器未在片段中更新,android,android-fragments,Android,Android Fragments,所以我一直在摆弄RecyclerView,我让它在活动中正常工作;但只要我在片段中尝试,它就不会更新UI MainActivity.java import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.support.design.widget.FloatingActionButton; import android.support
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());
}
}
导入android.support.v7.widget.RecyclerView;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.TextView;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
/**
*由jfelt于2016年4月15日创建。
*/
公共类FragmentAdapter扩展了RecyclerView.Adapter{
private List testEntries=Collections.emptyList();
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
文本视图文本视图;
ViewHolder(视图项视图){
超级(项目视图);
textView=(textView)itemView.findViewById(R.id.rv_项);
}
}
@凌驾
public int getItemCount(){
返回testEntries.size();
}
@凌驾
公共视图持有者onCreateViewHolder(视图组vg,int i){
视图v=LayoutInflater.from(vg.getContext()).flate(R.layout.entry,vg,false);
视窗支架vh=新视窗支架(v);
返回vh;
}
@凌驾
BindViewHolder上的公共无效(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);
}
});
}
}
导入android.os.Bundle;
导入android.os.Handler;
导入android.os.Looper;
导入android.support.annotation.Nullable;
导入android.support.annotation.UiThread;
导入android.support.v4.app.Fragment;
导入android.support.v4.app.FragmentTransaction;
导入android.support.v7.widget.LinearLayoutManager;
导入android.support.v7.widget.RecyclerView;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入java.util.ArrayList;
导入java.util.List;
/**
*由jfelt于2016年4月14日创建。
*/
公共类RecyclerFragment扩展了片段{
List testEntries=new ArrayList();
私人回收站;
专用循环视图适配器;
私人RecyclerView.LayoutManager;
公共RecyclerFragment(){}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Bundle args=getArguments();
如果(args!=null){
Log.d(“RecyclerFragment”,String.valueOf(args));
}
}
@凌驾
已创建视图上的公共void(视图,@Nullable Bundle savedInstanceState){
recyclerView=(recyclerView)view.findViewById(R.id.recycler);
manager=新的LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(管理器);
适配器=新的碎片适配器();
recyclerView.setAdapter(适配器);
}
@凌驾
创建视图上的公共视图(LayoutFlater inf、ViewGroup vg、Bundle savedInstanceState){
视图rv=inf.充气(R.layout.rv_布局,空);
返回rv;
}
公共数据(字符串条目){
Log.d(“标签”,条目);
添加(新的TestEntry(条目));
Log.d(“TAG”,String.valueOf(testEntries));
getActivity().runOnUiThread(新的Runnable()){
@凌驾
公开募捐{
adapter.notifyItemInserted(testEntries.size()-1);
}
});
}
}
日志记录显示refreshData从对话框侦听器接收输入。调用adapter.notifyItemInserted时出现问题,因为它似乎没有被正确调用。我可能错过了一些显而易见的东西,但我已经盯着这段代码看了好几个小时,就是想不出来。非常感谢您的帮助。碎片适配器和
回收碎片
引用了不同的列表,因此当您将一个项目添加到一个项目时,它不会添加到另一个项目
使用当前代码结构的一个选项是向FragmentAdapter
添加一个构造函数,该构造函数采用列表
,以便它们都具有相同的列表
引用:
public FragmentAdapter(List<TestEntry testEntries) {
this.testEntries = testEntries;
}
此外,您不需要getActivity().runOnUiThread
,因为此时您已经在UI线程上。您只需拨打电话添加项目即可
testEntries.add(new TestEntry(entry));
adapter.notifyItemInserted(testEntries.size() - 1);
FragmentAdapter
和RecyclerFragment
引用了不同的列表,因此当您将一个项目添加到一个项目中时,它不会添加到另一个项目中
使用当前代码结构的一个选项是向FragmentAdapter
添加一个构造函数,该构造函数采用列表
,以便它们都具有相同的列表
引用:
public FragmentAdapter(List<TestEntry testEntries) {
this.testEntries = testEntries;
}
此外,您不需要getActivity().runOnUiThread
,因为此时您已经在UI线程上。您只需拨打电话添加项目即可
testEntries.add(new TestEntry(entry));
adapter.notifyItemInserted(testEntries.size() - 1);
如何将片段内的testEntries引用到适配器内的testEntries?我认为问题在于你没有告诉你适配器更新的数据。我建议在适配器中创建一个函数,将条目添加到其中,然后notifyItemsInserted 内部碎片适配器:
public void addItem(String entry){
this.testEntries.add(entry);
notifyItemInserted(testEntries.size() - 1);
}
内部碎片:
((FragmentAdapter) getAdapter()).addItem(entry);
如何将片段内的testEntries引用到适配器内的testEntries?我认为问题在于你没有告诉你适配器更新的数据。我建议在适配器中创建一个函数,将条目添加到其中,然后notifyItemsInserted 内部碎片适配器:
public void addItem(String entry){
this.testEntries.add(entry);
notifyItemInserted(testEntries.size() - 1);
}
内部碎片:
((FragmentAdapter) getAdapter()).addItem(entry);