【问题标题】:How to work with RecyclerView in Android?如何在 Android 中使用 RecyclerView?
【发布时间】:2015-10-25 07:36:07
【问题描述】:

我在main_activity.xml 中使用了以下代码来添加Floating Button

<android.support.design.widget.FloatingActionButton
  android:id="@+id/fab"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="bottom|right"
  android:layout_margin="16dp"
  android:clickable="true"
  android:src="@drawable/ic_refresh" />

我正在使用以下方法在RecyclerView中加载数据:

 public void getWarehouse(){
  .....
    //Some retrofit calls 
  .....
    mRecyclerView = (RecyclerView) mActivity.findViewById(R.id.staggering_grid);
    mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
    mAdapter = new StaggeredGridAdapter(mContext);
    mAdapter.addItems(response);
    mRecyclerView.setAdapter(mAdapter);
    GridItemSpaces decoration = new GridItemSpaces(10);
    mRecyclerView.addItemDecoration(decoration);
}

getWareHouse() 方法的目的: 正在加载RecyclerView Staggered Grid View 中的数据。

FloatingButton的目的: 从API calls 刷新数据。简而言之,我从OnClickListnerFloatingActionButton 打电话给getWareHouse()

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   // this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    setContentView(R.layout.activity_main);
    wareHousAPIWrapper = new WareHousAPIWrapper(getApplicationContext(), MainActivity.this);

    mToolbar = (Toolbar) findViewById(R.id.tool_bar);
    FloatingActionButton mFab = (FloatingActionButton) findViewById(R.id.fab);

    mFab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            wareHousAPIWrapper.getWarehouse();
        }
    });

    if (mToolbar != null) {
        setSupportActionBar(mToolbar);
        getSupportActionBar().setTitle("sample");
    }
    wareHousAPIWrapper.getWarehouse();

}

单击FloatingButton 时,我可以看到RecyclerView 中加载的数据,但每次单击Staggered 的刷新长度都会增加。

为什么会这样?

看截图:

第一次点击刷新按钮:

10-20次后:

Edit-1 getWarehouse 方法定义

 //Making request to API
    adapter.create(WarehouseAPI.class).getWarehouse()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<List<Warehouse>>() {
                @Override
                public void onCompleted() {
                    Log.d(this.getClass().getName(), "OnCompleted ()");
                }

                @Override
                public void onError(Throwable e) {
                    Log.d(this.getClass().getName(), "Error:" + e.toString());
                }

                @Override
                public void onNext(List<Warehouse> response) {
                    // code for `RecyclerView` I have posted above
                }

            });

【问题讨论】:

  • 为什么每次都在getWarehouse() 中创建RecyclerView 的新引用对象?您只需要add 并致电notifyDataSetChanged()
  • 现在我没有创建一个新的RecyclerView 并传递相同但仍然面临一些情况
  • 你能发布更多代码吗?
  • @kishorejethava 所以,我添加了MainActivity.onCreate 方法,我在其中调用wareHousAPIWrapper.getWarehouse(); 将数据加载到recyclerview 中,您还可以看到Fab 按钮onclick 列表和其余处理的代码是用getWarehouse方法写的。

标签: java android android-layout android-button android-recyclerview


【解决方案1】:

每次调用wareHouseAPIWrapper.getWarehouse(),您都会向mRecyclerView 添加另一个项目装饰器。这导致每次单击刷新按钮时RecyclerView 中的项目都会变小。您应该只在初始化活动时添加一个项目装饰器,如下所示:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   // this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    setContentView(R.layout.activity_main);
    wareHousAPIWrapper = new WareHousAPIWrapper(getApplicationContext(), MainActivity.this);

    mToolbar = (Toolbar) findViewById(R.id.tool_bar);
    FloatingActionButton mFab = (FloatingActionButton) findViewById(R.id.fab);

    mFab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            wareHousAPIWrapper.getWarehouse();
        }
    });

    if (mToolbar != null) {
        setSupportActionBar(mToolbar);
        getSupportActionBar().setTitle("sample");
    }

    wareHousAPIWrapper.getWarehouse();
    RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.staggering_grid);
    GridItemSpaces decoration = new GridItemSpaces(10);
    mRecyclerView.addItemDecoration(decoration);
}

getWarehouse()中不再需要添加物品装饰器:

public void getWarehouse(){
  .....
    //Some retrofit calls 
  .....
    mRecyclerView = (RecyclerView) mActivity.findViewById(R.id.staggering_grid);
    mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
    mAdapter = new StaggeredGridAdapter(mContext);
    mAdapter.addItems(response);
    mRecyclerView.setAdapter(mAdapter);
}

【讨论】:

  • 感谢您的回答,但mAdapter.addItems(response); 中的“响应”在改造电话后得到。无法访问 onCreate 方法中的响应。我正在粘贴代码如何使用 RetrofitRx-java 获得响应
  • 另外,根据上面的代码,您只在FloatingButton onCLickListner 上调用getResponse。我还想在加载活动时发出请求(您可以在有问题的帖子中签出 onCreate 方法)
  • 感谢您的澄清,我移动了一些代码来解决问题。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多