gpt4 book ai didi

java - 适配器不会更新

转载 作者:行者123 更新时间:2023-12-02 02:31:58 24 4
gpt4 key购买 nike

我正在尝试在 fragment 内的 recycleView 上显示一些项目。这些元素来自另一个 fragment 。我首先使用空 arrayList 创建 recycleView,但是当按下按钮时,数据将通过接口(interface)发送,并且方法会填充 ArrayList。我已经调试了一整天并且工作完美,当我按下按钮时,它记录 ArrayList 的大小已增加到 1。

我读到当列表更改时我必须通知我的适配器,因此我尝试使用notifyDataSetChange()、notifyItemInserted(dataReceived.size() -1),但似乎都不起作用。每当我检查adapter.getItemCount()时,它都会抛出0,即使arraylist说抛出1。

这是我在接收数据的 fragment 中的代码:

public class FavoriteFragment extends Fragment {
private OnFragmentInteractionListener mListener;

RecyclerView myRecyclerView;
public ArrayList<RecycleViewItem> dataReceived;


public MyFavoriteAdapter adapter;
public FavoriteFragment() {

}

public void setDataReceived(ArrayList<RecycleViewItem> dataReceived){
this.dataReceived = dataReceived;
Log.d("INTERFACE", "Data received by the FavoriteFragment!!!!" + " " + this.dataReceived.get(0).getCardName());
for(int i = 0; i < dataReceived.size(); i++) {
//THIS LINE RETURNS A 1
Log.d("INTERFACE", "Items inside the dataReceived: " + dataReceived.size());
//NEITHER WORKED
//adapter.notifyItemInserted(dataReceived.size() -1);
//adapter.notifyDataSetChanged();
//THIS LINE WILL KEEP ON RETURNING 0
Log.d("INTERFACE", "Items inside the list inside the adapter: " + adapter.getItemCount());
}
}

public static FavoriteFragment newInstance() {
FavoriteFragment fragment = new FavoriteFragment();
return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

}



@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
dataReceived = new ArrayList<>();
adapter = new MyFavoriteAdapter(dataReceived);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_favorite, container, false);

myRecyclerView = (RecyclerView) view.findViewById(R.id.recycleView);
myRecyclerView.setHasFixedSize(true);
LinearLayoutManager myLayoutManager = new LinearLayoutManager(getActivity());
myLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
if (myRecyclerView != null) {
myRecyclerView.setAdapter(adapter);
}
myRecyclerView.setLayoutManager(myLayoutManager);
return view;
}

public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}

@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}

@Override
public void onDetach() {
super.onDetach();
mListener = null;
}

public interface OnFragmentInteractionListener {
void onFragmentInteraction(Uri uri);
}
}

这是适配器:

public class MyFavoriteAdapter extends RecyclerView.Adapter<MyViewHolder>{
private ArrayList<RecycleViewItem> list = new ArrayList<RecycleViewItem>();

InterfaceListItemClickListener sender = null;


public MyFavoriteAdapter(ArrayList<RecycleViewItem> list) {
this.list = list;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// create a new view
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle_item_favorite, parent, false);
MyViewHolder holder = new MyViewHolder(view, sender);
return holder;
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
if(list.size() >= 1) {
holder.favoriteImageView.setImageResource(list.get(position).getImageResourceID());
holder.favoriteTextView.setText(list.get(position).getCardName());
}
}

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

最佳答案

您的适配器有一个私有(private)变量list,必须修改它才能使adapter.notifyDataSetChanged()生效。

这是你的方法:

public void setDataReceived(ArrayList<RecycleViewItem> dataReceived){
this.dataReceived = dataReceived;
...
}

将参数 dataReceived 分配给 fragment 的 this.dataReceived 不会以任何方式影响适配器的 list。相反,你可以这样做:

public void setDataReceived(ArrayList<RecycleViewItem> dataReceived){
adapter.list.addAll(dataReceived);
...
}

您可能必须将适配器的 list 变量公开,或通过 getter 公开它:

public ArrayList<RecycleViewItem> getList() {
return list
}

或者甚至添加一个可以向其中添加项目的方法:

public void addAll(ArrayList<RecycleViewItem> items) {
list.addAll(items);
}

关于java - 适配器不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46944837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com