2016-12-23 3 views
0

두 개의 액티비티가 각각 동일한 어댑터에 묶여 있습니다. 두 번째 액티비티를 열면 모든 데이터가있는 두 번째 액티비티가 열리고, cardview 너비는 첫 번째 액티비티에서 잘 작동합니다 그러나 초에 나는 폭이 내가 setLayoutParams() 을 시도하지만setLayouParams가 cardView에서 작동하지 않았습니다.

public AzkaarViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    CardView cardView=(CardView)parent.findViewById(R.id.cardview); 

    CardView.LayoutParams layoutParams = (CardView.LayoutParams)cardView.getLayoutParams(); 
    layoutParams.height = CardView.LayoutParams.MATCH_PARENT; 
    cardView.setLayoutParams(layoutParams); 
    ... 

를 작동하지 않았다 레이아웃 수평을 match_parent되고 싶어요 그리고 나는 이것이 적응의 코드

java.lang.NullPointerException 
at com.nourabosily.aa.azkaar.AzkaarAdapter.onCreateViewHolder(AzkaarAdapter.java:37) 
at com.nourabosily.aa.azkaar.AzkaarAdapter.onCreateViewHolder(AzkaarAdapter.java:23) 

이 오류가 어

public class AzkaarAdapter extends RecyclerView.Adapter<AzkaarAdapter.AzkaarViewHolder> { 
    ArrayList<AzkarForm> azkarForms=new ArrayList<AzkarForm>(); 
    Context ctx; 

public AzkaarAdapter (ArrayList<AzkarForm> azkarForms,Context ctx){ 
    this.azkarForms=azkarForms; 
    this.ctx=ctx; 
} 
@Override 
public AzkaarViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {  CardView cardView=(CardView)parent.findViewById(R.id.cardview); 
    CardView.LayoutParams layoutParams = (CardView.LayoutParams)cardView.getLayoutParams(); 
    layoutParams.height = CardView.LayoutParams.MATCH_PARENT; 
    cardView.setLayoutParams(layoutParams); 
    View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_layout,parent,false); 
    AzkaarViewHolder azkaarViewHolder=new AzkaarViewHolder(view,ctx,azkarForms); 
    ViewGroup viewGroup=(ViewGroup)parent.getParent(); 
    CardView.LayoutParams params=(CardView.LayoutParams)(viewGroup.getLayoutParams()); 
    params.height=800; 
    return azkaarViewHolder; 

} 


@Override 
public void onBindViewHolder(AzkaarViewHolder holder, int position) { 


    AzkarForm azkarForm=azkarForms.get(position); 
    if(ctx instanceof MainActivity) { 
     holder.sample.setText(azkarForm.getSample()); 
     holder.number.setText(String.valueOf(azkarForm.getNumber())); 
    }else{ 
     holder.sample.setText(azkarForm.getComplete_morning()); 
     holder.number.setText(String.valueOf(azkarForm.getNumber())); 
    } 
    int width =holder.itemView.getWidth(); 
    ViewGroup.LayoutParams params=holder.itemView.getLayoutParams(); 
    params.height= RelativeLayout.LayoutParams.MATCH_PARENT; 
    holder.itemView.setLayoutParams(params); 

} 

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

public static class AzkaarViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 

    TextView sample, number; 
    Context ctx; 
    ArrayList<AzkarForm> azkarForms = new ArrayList<AzkarForm>(); 

    public AzkaarViewHolder(View itemView, Context ctx, ArrayList<AzkarForm> azkarForms) { 
     super(itemView); 
     this.ctx = ctx; 
     if(this.ctx instanceof MainActivity) 
      itemView.setOnClickListener(this); 
     this.azkarForms = azkarForms; 
     sample = (TextView) itemView.findViewById(R.id.sample); 
     number = (TextView) itemView.findViewById(R.id.number); 

    } 


    @Override 
    public void onClick(View v) { 
     int position=getAdapterPosition(); 
     AzkarForm azkarForm=azkarForms.get(position); 
     Intent intent=new Intent(this.ctx,DetailsActivity.class); 
     intent.putExtra("numbers",azkarForm.getNumber()); 
     intent.putExtra("sample",azkarForm.getSample()); 
     intent.putExtra("complete",azkarForm.getComplete_morning()); 
     intent.putExtra("position",position); 
     this.ctx.startActivity(intent); 

    } 
} 

} 

이 레이아웃의 코드

LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
holder.cardView.setLayoutParams(params); 

그것을 할

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:id="@+id/linearlayout"> 
<android.support.v7.widget.CardView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/cardview"> 
    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="10dp" 
     android:id="@+id/relative"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/sample" 
      android:text="Noura Ali Bosily" 
      android:textSize="20dp" 
      android:textStyle="bold" 
      android:gravity="center" 
      android:layout_alignParentTop="true" 
      android:layout_marginTop="15dp" 
      android:layout_marginLeft="20dp" 
      android:layout_alignParentRight="true" 
      /> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/number" 
      android:text="5" 
      android:textSize="20dp" 
      android:textStyle="bold" 
      android:gravity="center" 
      android:layout_marginTop="5dp" 
      android:layout_marginLeft="20dp" 
      android:layout_alignParentLeft="true"/> 

    </RelativeLayout> 
</android.support.v7.widget.CardView> 

대신
+0

해당 페이지에 전체 코드를 게시 할 수 있습니까? –

+0

게시물을 편집했습니다. –

답변

0
  @Override 
     public AzkaarViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {   
      View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_layout,parent,false); 
      AzkaarViewHolder azkaarViewHolder=new AzkaarViewHolder(view,ctx,azkarForms); 

      return azkaarViewHolder; 

     } 


     @Override 
     public void onBindViewHolder(AzkaarViewHolder holder, int position) { 


      CardView.LayoutParams layoutParams = (CardView.LayoutParams)holder.cardView.getLayoutParams(); 
      layoutParams.height = CardView.LayoutParams.MATCH_PARENT; 
     holder.cardView.setLayoutParams(layoutParams); 
      AzkarForm azkarForm=azkarForms.get(position); 
    ViewGroup viewGroup=(ViewGroup)holder.cardview.getParent(); 
      CardView.LayoutParams params=(CardView.LayoutParams)(viewGroup.getLayoutParams()); 
      params.height=800; 

      if(ctx instanceof MainActivity) { 
       holder.sample.setText(azkarForm.getSample()); 
       holder.number.setText(String.valueOf(azkarForm.getNumber())); 
      }else{ 
       holder.sample.setText(azkarForm.getComplete_morning()); 
       holder.number.setText(String.valueOf(azkarForm.getNumber())); 
      } 
      int width =holder.itemView.getWidth(); 
      ViewGroup.LayoutParams params=holder.itemView.getLayoutParams(); 
      params.height= RelativeLayout.LayoutParams.MATCH_PARENT; 
      holder.itemView.setLayoutParams(params); 

     } 

public static class AzkaarViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 

    TextView sample, number; 
    Context ctx; 
    CardView cardView 
    ArrayList<AzkarForm> azkarForms = new ArrayList<AzkarForm>(); 

    public AzkaarViewHolder(View itemView, Context ctx, ArrayList<AzkarForm> azkarForms) { 
     super(itemView); 
     this.ctx = ctx; 
     if(this.ctx instanceof MainActivity) 
      itemView.setOnClickListener(this); 
     this.azkarForms = azkarForms; 
     sample = (TextView) itemView.findViewById(R.id.sample); 
     number = (TextView) itemView.findViewById(R.id.number); 
     cardView=(CardView)parent.findViewById(R.id.cardview); 

    } 


    @Override 
    public void onClick(View v) { 
     int position=getAdapterPosition(); 
     AzkarForm azkarForm=azkarForms.get(position); 
     Intent intent=new Intent(this.ctx,DetailsActivity.class); 
     intent.putExtra("numbers",azkarForm.getNumber()); 
     intent.putExtra("sample",azkarForm.getSample()); 
     intent.putExtra("complete",azkarForm.getComplete_morning()); 
     intent.putExtra("position",position); 
     this.ctx.startActivity(intent); 

    } 
+0

문제를 해결해 주셔서 감사합니다. OP가 왜 앞으로해야할 일을 알 수 있도록 작동하는지에 대한 설명을 추가 할 수 있습니까? –

+0

대답은 간단합니다. 뷰 또는 변수에 대한 값이 없을 때 NPE (NullPointerException)를 얻습니다. 이 경우 View 값이 null이므로 뷰를 사용하기 전에 값을 가져와야합니다. onCreateViewHolder()에서는 뷰에 값을주지 않습니다. onBindViewHolder()에서이 작업을 수행 할 수 있습니다. 그게 전부 야. –

+0

난이 오류가 발생했습니다 java.lang.ClassCastException : android.widget.LinearLayout $ LayoutParams는 android.widget.FrameLayout $ LayoutParams로 캐스팅 될 수 없습니다. FrameLayout –

0
CardView.LayoutParams layoutParams = (CardView.LayoutParams)cardView.getLayoutParams(); 
layoutParams.height = CardView.LayoutParams.MATCH_PARENT; 
cardView.setLayoutParams(layoutParams); 

사용해보십시오입니다 in

@Override 
public void onBindViewHolder(AzkaarViewHolder holder, int position) { 

cardView는 ViewHolder에 있어야합니다.

+0

나는 그것을 사용했지만 동일 –

+0

cardView는 ViewHolder에 있어야합니다. CardView는 레이아웃의 부모입니다. 그렇다면 정확히 당신의 요구 사항은 무엇입니까? 무엇을 변경하려고합니까? xml 파일에서 layout_height = "match_parent"를 사용하지 않는 이유는 무엇입니까? –

+0

업데이트 된 답변을 확인하십시오 !! –