Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RecyclerView适配器未在片段中更新_Android_Android Fragments - Fatal编程技术网

Android RecyclerView适配器未在片段中更新

Android 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

所以我一直在摆弄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.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);