(回收)listview - 计算高度

时间:2015-06-05 20:11:08

标签: android android-listview android-adapter android-recyclerview measure

我的Android应用中有多个列表,包含这些(回收)列表视图的活动也包含其他内容。将listview放在内容下方可以正常工作而无需任何自定义建模。但是,当在列表中滚动时,它只滚动列表,因此显示大约1或2个项目,而我们想要滚动整个活动,以便内容向上移动并显示完整列表。

为了使活动可滚动,我们需要一个ScrollView,这有点违背设计指南,我知道,但我需要它。

为了完成这项工作,我使用了这个解决方案: https://stackoverflow.com/a/13796159/2901207

只要列表视图的高度设置为列表视图中项目所需的高度,它就可以完美地工作。所以出现了我的问题,如何计算这个高度。

现在我有点幸运,列表中的项目具有相同的高度,所以通过一些试验和错误,我可以实现这一点:

recyclerView.setMinimumHeight(posts.size() * 190);
然而,这并不是真的有效,因为我们有不同的分辨率和屏幕尺寸。在xhdpi上这可以工作,但在xxhdpi上我还需要4个空间的空间。

一个solution I found

int totalHeight = 0;

for (int i = 0; i < mAdapter.getCount(); i++) {
    View mView = mAdapter.getView(i, null, listView);

    mView.measure(
            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),

            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

    totalHeight += mView.getMeasuredHeight();
    Log.w("HEIGHT" + i, String.valueOf(totalHeight));

}

ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
        + (listView.getDividerHeight() * (mAdapter.getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();

但是,这不适用于RecyclerView.Adapter<myAdpater.MyViewHolder>,因为它不包含getView()方法。 (而不是getDividerHeight()方法)。

这是我的一个适配器的样子:

public class ResponsesAdpater extends RecyclerView.Adapter<ResponsesAdpater.MyViewHolder> {

private LayoutInflater inflrater;
List<Post> posts = Collections.emptyList();
Context context;
private ClickListenerResponseList listener;

public ResponsesAdpater(Context context, List<Post> posts) {
    this.context = context;
    inflrater = LayoutInflater.from(context);
    this.posts = posts;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflrater.inflate(R.layout.responses_row, parent, false);
    MyViewHolder holder = new MyViewHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    Post post = posts.get(position);
    holder.lblMainText.setText(post.text);
}

public void setClickListener(ClickListenerResponseList listener)
{
    this.listener = listener;
}

@Override
public int getItemCount() {

    return posts.size();
}

class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    TextView lblMainText;
    ImageView imgIcon;

    public MyViewHolder(View itemView) {
        super(itemView);
        lblMainText = (TextView) itemView.findViewById(R.id.lblPostMainText);
        imgIcon = (ImageView) itemView.findViewById(R.id.imgIcon);
    }


    @Override
    public void onClick(View v) {
        if(listener != null)
        {
            listener.ResponseClicked(v, getAdapterPosition());
        }
    }
}

public interface ClickListenerResponseList{
    void ResponseClicked(View view, int position);
}

}

另一个解决方案是something like this,但是当从RecyclerView扩展时,我们没有一个onDraw方法来覆盖。

非常感谢帮助!

0 个答案:

没有答案