2014-12-21 130 views
1

我有一個關於RecyclerView的問題。我試圖學習RecyclerView,但我堅持一個問題。我正在動態創建所有視圖。所以,假設我有一個ContentLinearLayout。我的問題始於「refreshContent」方法。我打了幾次電話。但是,即使在第一次調用時,RecyclerView的內部視圖仍保留在它們的背景圖像大小中(我猜在某處有一些隱式的WRAP_CONTENT)。我無法找到將按鈕的高度和寬度均衡到RecyclerView高度的方法。我試着迭代RecyclerView併爲每個孩子設置佈局參數,但它沒有奏效。此外,我試圖在「onBindViewHolder」內設置佈局參數,但這也不起作用。RecyclerView內視圖的正確大小

任何幫助將不勝感激。

public class ContentLinearLayout extends LinearLayout { 

    private RecyclerView rvCon; 
    private LinearLayout llCon; 

    public ContentLinearLayout(Context context) { 
     super(context); 
     this.init(context); 
    } 

    public ContentLinearLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.init(context); 
    } 

    private void init(Context c){ 
     this.setOrientation(LinearLayout.VERTICAL); 
     this.setBaselineAligned(false); 

     rvCon = new RecyclerView(c); 
     LinearLayout.LayoutParams recyclerPrms = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, 1f); 
     recyclerPrms.setMargins(0, 0, 0, 0); 
     rvCon.setLayoutParams(recyclerPrms); 
     LinearLayoutManager manager = new LinearLayoutManager(c, LinearLayoutManager.HORIZONTAL, false); 
     rvCon.setLayoutManager(manager); 
     addView(rvCon); 

     rvCon.setPadding(0, 0, 0, 0); 

     LinearLayout llCon = new LinearLayout(c); 
     llCon.setOrientation(LinearLayout.HORIZONTAL); 
     llCon.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, 3f)); 
     llCon.setBaselineAligned(false); 
     addView(container); 

     ... 
    } 

    private void refreshContent(Context ctx, Content content){ 
     rvCon.setAdapter(new ContentAdapter(ctx, content)); 
    } 
} 

public class ContentAdapter extends RecyclerView.Adapter<ImageButtonHolder>{ 

    private Context mContext; 
    private Content mContent; 

    public ContentAdapter(Context c, Content content){ 
     mContext = c; 
     mContent = content 
    } 

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

    @Override 
    public void onBindViewHolder(ImageButtonHolder buttonHolder, int pos) { 

    } 

    @Override 
    public ImageButtonHolder onCreateViewHolder(ViewGroup arg0, int arg1) { 
     ImageButton b = new ImageButton(mContext); 
     b.setBackgroundColor(Color.RED); 
     ImageButtonHolder holder = new ImageButtonHolder(b); 
     return holder; 
    } 
} 

public class ImageButtonHolder extends RecyclerView.ViewHolder { 

    public final ImageButton imageButton; 

    public ImageButtonHolder(ImageButton button) { 
     super(button); 
     imageButton = button; 
    } 

} 
+0

......在您的ContentAdapter中是非常錯誤的。 每次RV需要一個新的視圖,你增加'num',並且當調用getItemCount()時,你將返回'num.get()'。這是兩件無關的事情。 'onCreateViewHolder(ViewGroup parent,int type)',這裏的第二個參數是視圖的類型。創建一個新的視圖不應該改變適配器的大小。你可以檢查[這裏](https://developer.android.com/training/material/lists-cards.html)例如房車的使用情況。 – yigit

+0

好吧,我沒有想到它會在第一時間有關。所以,我編輯了。 –

回答

4

我有同樣的問題:View in RecyclerView does not match parent width

嘗試根據設備的寬度設置寬度:

適配器代碼:

private Activity activity; 
private int imageWidth = 0; 

public RecommendedVendorsAdapter(Activity activity) { 
    recommendedVendors = VendorListingManager.getInstance().getRecommended(); 
    this.activity = activity; 
    imageWidth = activity.getWindow().getDecorView().getWidth(); 
} 

@Override 
public RecommendedVendorsViewHolder onCreateViewHolder(ViewGroup vg, int viewType) { 
    View v = LayoutInflater.from(vg.getContext()).inflate(R.layout.item_recommended_list, vg, false); 
    RecyclerView.LayoutParams params= (RecyclerView.LayoutParams)v.getLayoutParams(); 
    params.width=imageWidth; 
    v.setLayoutParams(params); 

    RecommendedVendorsViewHolder vh = new RecommendedVendorsViewHolder(v); 
    return vh; 
} 

我希望它可以幫助你。

+1

也可以使用vg.getWidth()(如果它的匹配父項)。 – sagits

相關問題