2017-08-11 34 views
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(); 
     } 
    }); 
} 

}

希望你能帮助我。

回答

0

删除从下面的代码行;

tableAdapter.notifyItemRangeChanged(0,tables.size()); 
+0

它没有工作。 –