簡體   English   中英

Android-在RecyclerView.Adapter中更改附加到ViewHolder的TextView的textSize

[英]Android - changing textSize of TextView attached to ViewHolder in RecyclerView.Adapter

我在RecyclerView中使用GridLayoutManager來處理三種不同情況(1列,2列,3列),但是我還需要更改RecyclerView.Adapter中附加到ViewHolder的TextView的TextSize。

活動代碼:

mLayoutManager = new GridLayoutManager(this, numberOfColumns);

mRecyclerView = (RecyclerView) findViewById(R.id.grid);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(mLayoutManager);

mAdapter = new CustomGridAdapter(data);
mRecyclerView.setAdapter(mAdapter);

適配器:

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.grid_layout, viewGroup, false);
    return new ViewHolder(itemView);
}

...

public class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener {

    protected TextView vName;
    protected ImageView vImage;
    protected ImageButton vButton;

    protected ProgressBar vProgress;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        vName = (TextView) itemLayoutView.findViewById(R.id.titleTextViewGrid);
        vImage = (ImageView) itemLayoutView.findViewById(R.id.imageView);
        vButton = (ImageButton) itemLayoutView.findViewById(R.id.action_edit_grid);

        vProgress = (ProgressBar) itemLayoutView.findViewById(R.id.loadingProgressBar);

    }
}

當我嘗試時:

TextView text = (TextView) mRecyclerView.findViewById(R.id.titleTextView);
text.setTextSize(12);

編譯器返回空引用。 有什么想法嗎?

看起來您看錯地方了。 您不會要求父級RecyclerView引用每個子視圖中對TextView的引用,您需要從每個子視圖中獲取該引用。

似乎最簡單的方法是在onCreateViewHolder()內部:

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.grid_layout, viewGroup, false);

    TextView text = (TextView) itemView.findViewById(R.id.titleTextViewGrid);
    text.setTextSize(12);
    return new ViewHolder(itemView);
}

...或者在ViewHolder創建期間:

public ViewHolder(View itemLayoutView) {
    super(itemLayoutView);
    vName = (TextView) itemLayoutView.findViewById(R.id.titleTextViewGrid);
    vImage = (ImageView) itemLayoutView.findViewById(R.id.imageView);
    vButton = (ImageButton) itemLayoutView.findViewById(R.id.action_edit_grid);

    vProgress = (ProgressBar) itemLayoutView.findViewById(R.id.loadingProgressBar);

    vName.setTextSize(12);
}

通過這種方式,可以為每個項目視圖進行設置,但只能在視圖的初始創建過程中進行設置。

我找到了一個很好的解決方案,謝謝Devunwired的指導。 當我期待:

https://github.com/lucasr/twoway-view/blob/master/sample/src/main/java/org/lucasr/twowayview/sample/LayoutAdapter.java

他將layoutId傳遞給構造函數,因此我可以調用新的適配器:

CustomAdapter mAdapter = new CustomAdapter(data, numberOfColumns);

然后在CustomAdapter的CustomViewHolder中:

...
public class CustomViewHolder extends RecyclerView.ViewHolder {

    protected TextView vName;

    public CustomViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        vName = (TextView) itemLayoutView.findViewById(R.id.titleTextView);

        if (mLayoutId == 1) {
            vName.setTextSize(33);
        }
        else if (mLayoutId == 2) {
            vName.setTextSize(22);
        }
        else if (mLayoutId == 3) {
            vName.setTextSize(11);
        }
}
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM