0
我已經固定我的最後一個問題,關於如何刷新recyclerview而不復位適配器只需要再次調用notifyDatasetChanged()
。現在我看到了另一個問題。問題是我的物品在撥打notifyDatasetChanged()
時沒有顯示動畫。如果我重置適配器項目顯示動畫。 當我致電notifyDatasetChanged()
時,我做錯了什麼?項目沒有顯示動畫時,DataSet的更改
這裏是我的適配器代碼:
public class TableAdapter extends RecyclerView.Adapter<TableAdapter.ViewHolder>
{
private int lastPosition = -1;
private List<Table> tables;
private Context context;
public TableAdapter(Context context, List<Table> tables)
{
this.tables = tables;
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.table_layout, parent, false));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position)
{
holder.tvTableName.setText(tables.get(holder.getAdapterPosition()).getName());
setAnimation(holder.itemView, holder.getAdapterPosition());
}
@Override
public int getItemCount()
{
return tables == null ? 0 : tables.size();
}
class ViewHolder extends RecyclerView.ViewHolder
{
private TextView tvTableName;
ViewHolder(View itemView)
{
super(itemView);
tvTableName = (TextView) itemView.findViewById(R.id.tvTableName);
}
}
private void setAnimation(View viewToAnimate, int position)
{
// If the bound view wasn't previously displayed on screen, it's animated
if (position > lastPosition)
{
Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.fade_in);
animation.setDuration(500);
viewToAnimate.startAnimation(animation);
lastPosition = position;
}
}
}
和我所說的notifyDatasetChanged()
這樣的:
public class TableFragment extends Fragment
{
private RecyclerView rvTable;
private ListView lvFloor;
private TableState state;
private List<Table> tables= new ArrayList<>();
private TableAdapter tableAdapter;
public TableFragment()
{
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.fragment_table, container, false);
initializeComponents(v);
return v;
}
private void initializeComponents(View v)
{
lvFloor = (ListView) v.findViewById(R.id.lvFloor);
rvTable = (RecyclerView) v.findViewById(R.id.rvTable);
tableAdapter= new TableAdapter(getActivity(),tables);
rvTable.setAdapter(tableAdapter);
setFloor();
}
private void setFloor()
{
IFloorApi api = ApiClient.getClientWithAuthorization(App.getContext()).create(IFloorApi.class);
Call<List<Floor>> call = api.getFloors();
call.enqueue(new Callback<List<Floor>>()
{
@Override
public void onResponse(@NonNull Call<List<Floor>> call, @NonNull Response<List<Floor>> response)
{
if (response.isSuccessful())
{
lvFloor.setAdapter(new FloorListAdapter(getActivity(), response.body()));
lvFloor.setOnItemClickListener(this::floorClicked);
//noinspection ConstantConditions
setTable(response.body().get(0));
}
}
private void floorClicked(AdapterView<?> adapterView, View view, int i, long l)
{
Floor floor = ((FloorListAdapter) adapterView.getAdapter()).getItem(i);
setTable(floor);
}
@Override
public void onFailure(@NonNull Call<List<Floor>> call, @NonNull Throwable t)
{
call.cancel();
}
});
}
private void setTable(Floor floor)
{
ITableApi api = ApiClient.getClientWithAuthorization(App.getContext()).create(ITableApi.class);
rvTable.setLayoutManager(new GridLayoutManager(getActivity(), 5));
Call<List<Table>> call = api.getTables(floor.getId());
call.enqueue(new Callback<List<Table>>()
{
@Override
public void onResponse(@NonNull Call<List<Table>> call, @NonNull Response<List<Table>> response)
{
if (response.isSuccessful())
{
tables.clear();
//noinspection ConstantConditions
tables.addAll(response.body());
tableAdapter.notifyItemRangeChanged(0,tables.size());
tableAdapter.notifyDataSetChanged();
}
else
{
tables.clear();
tableAdapter.notifyDataSetChanged();
}
}
@Override
public void onFailure(@NonNull Call<List<Table>> call, @NonNull Throwable t)
{
call.cancel();
}
});
}
}
希望你能幫助我。
它沒有工作。 –