在Android中以编程方式了解设备屏幕尺寸?

时间:2015-10-26 14:46:53

标签: java android android-layout android-recyclerview

请查看相关的Question。我从评论中得到了一些暗示,现在又用一种新的方式。

我正在使用RecyclerViewStaggeredGridView适配器来显示数据。如何知道当前设备需要加载多少项才能适合整个屏幕?

过程

  • 确定屏幕尺寸
  • 确定需要加载多少项才能适合全屏
  • 从具有项目数的服务器获取数据
  • 显示它们
  • 当用户向下滚动设备获取相同数量的项目时,等等。

问题

我无法理解如何完成前两点。

适配器代码

public class StaggeredGridAdapter extends RecyclerView.Adapter<StaggeredGridAdapter.StaggeredGridView> {

private Context context;
private String INTENT_VALUE = "warehouse";
private List<Warehouse> warehouses = new ArrayList<Warehouse>();
private AppDelegate app;
int size;

public StaggeredGridAdapter(Context context) {
    this.context = context;
    app = (AppDelegate) context;
}

public void addItems(List<Warehouse> response) {
    size = response.size();
    warehouses = response;
}

@Override
public StaggeredGridView onCreateViewHolder(ViewGroup parent, int viewType) {
    View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_item, parent, false);
    StaggeredGridView staggeredGridView = new StaggeredGridView(layoutView);
    return staggeredGridView;
}

@Override
public void onBindViewHolder(StaggeredGridView holder, int position) {
    holder.textView.setText(warehouses.get(position).getFace());
}

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

class StaggeredGridView extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView textView;

    public StaggeredGridView(View itemView) {
        super(itemView);
        textView = (TextView) itemView.findViewById(R.id.img_name);
        itemView.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(context, WareHouseDetailActivity.class);
        intent.putExtra(INTENT_VALUE, warehouses.get(getAdapterPosition()));
        v.getContext().startActivity(intent);
    }
}
}

将数据填入适配器

的代码
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);

2 个答案:

答案 0 :(得分:1)

要找到高度和宽度,您可以使用DisplayMetrics

final DisplayMetrics displayMetrics = this.getApplicationContext().getResources().getDisplayMetrics();

displayMetrics将提供高度,宽度和密度。使用单View(或行)的高度和总高度来计算项目数。

为什么您需要Exact个项目,如果是您正在进行的服务器调用,您可以根据设备大小粗略估计项目数量。另外,我认为最好保持the number of items sent by server不变并且不依赖于设备高度。如果您收到的项目数量超过了您可以放入屏幕的项目数量,那么用户可以滚动查看它们。

答案 1 :(得分:0)

您可以将其设置为在您接近列表末尾时自动加载更多内容,而不是尝试确定您需要加载多少内容。

考虑这种方法:

@Override
public void onBindViewHolder(StaggeredGridView holder, int position) {
    holder.textView.setText(warehouses.get(position).getFace());
}

当项目准备好在屏幕上显示时调用。通过执行if(position > getItemCount() - 5{ // load more }之类的操作,您可以在需要时自动加载更多内容。