2016-12-23 6 views
0

私は2つのアクティビティをそれぞれ同じアダプタにバインドしていますが、アイテムをクリックすると2番目のアクティビティがすべてのデータで開き、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); 

    } 
} 

} 

、これは、レイアウトのコード

<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なので、Viewを使用する前に値を取得する必要があります。 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); 

代わり

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

はそれを行う、使用してみていますin

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

cardViewはViewHolderにする必要があります。

+0

私はそれを使用しましたが、同じ –

+0

cardViewはViewHolderになければなりません。CardViewはあなたのレイアウトのあなたの親です。何を変更しようとしていますか?xmlファイルでlayout_height = "match_parent"を使用してください。 –

+0

更新された回答を確認してください! –

関連する問題