2016-12-21 6 views
0

(リサイクルビューの終わり)二レイアウトで整数JSON値を取得できます。どのようにこれは私のJSONある

{ 
    "status": "ok", 
    "count": 10, 
    "count_total": 65, 
    "pages": 7, 
    "posts": [ 
    { 
     "id": 3115, 
     "type": "post", 
. 
. 
. 
}]} 

は私のリサイクルビューのページ値の末尾を取得したい: enter image description here

これは私のAsyncTaskですJSONを取得するための機能:

if (jsonStr != null) { 
        try { 

         JSONObject jsonObj = new JSONObject(jsonStr); 


         int id=jsonObj.getInt("pages"); 


         JSONArray posts = jsonObj.getJSONArray("posts"); 
         for (int i = 0; i < posts.length(); i++) { 
          JSONObject c = posts.getJSONObject(i); 

          jsonContent jsonContent=new jsonContent(); 

          jsonContent.title=c.getString("title"); 

          //img 
          JSONObject post_img=c.getJSONObject("thumbnail_images"); 
          for (int j=0;j<post_img.length();j++) 
          { 
           JSONObject v=post_img.getJSONObject("mom-portfolio-two"); 
           jsonContent.imgurl=v.getString("url"); 
          } 
          jsonContent.pages=id; 
          listcontent.add(jsonContent); 

         } 

と、これは私のアダプタです:

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> { 
     private Context context; 
     List<jsonContent> jcontent; 



     public DataAdapter(Context context,List<jsonContent> jcontent) { 

      this.context=context; 
      this.jcontent=jcontent; 

     } 



     @Override 
     public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 

      View view ; 
      if(i == R.layout.card_row) { 
       view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_row, viewGroup, false); 
      }else { 
       view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.button_card, viewGroup, false); 
      } 
      return new ViewHolder(view); 
     } 

     @Override 
     public void onBindViewHolder(final DataAdapter.ViewHolder viewHolder,int i) { 


      if(i == jcontent.size()) { 
       viewHolder.buttonnext.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         Toast.makeText(context, "next", Toast.LENGTH_SHORT).show(); 
        } 
       }); 
       viewHolder.buttonprev.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         Toast.makeText(context, "pre", Toast.LENGTH_SHORT).show(); 
        } 
       }); 

       viewHolder.cardView.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 

        } 
       }); 

       viewHolder.pages.setText(Integer.toString(jcontent.get(i).pages)); 

      } 
      else { 

       viewHolder.title.setText(jcontent.get(i).title); 

       Picasso.with(context).load(jcontent.get(i).imgurl).resize(300, 400).into(viewHolder.imageView); 

      } 
     } 

     @Override 
     public int getItemCount() { 
       return jcontent.size()+1; 
     } 

     @Override 
     public int getItemViewType(int position) { 
      return (position == jcontent.size()) ? R.layout.button_card : R.layout.card_row; 
     } 


     public class ViewHolder extends RecyclerView.ViewHolder{ 

      private TextView title,pages; 

      private ImageView imageView; 

      private Button buttonnext,buttonprev; 

      private CardView cardView; 


      public ViewHolder(final View view) { 
       super(view); 


       title = (TextView)view.findViewById(R.id.post_title); 
       imageView=(ImageView)view.findViewById(R.id.img); 
       buttonnext =(Button)view.findViewById(R.id.next); 
       buttonprev=(Button)view.findViewById(R.id.prev); 
       cardView=(CardView)view.findViewById(R.id.cvv); 

       pages=(TextView)view.findViewById(R.id.number_pages); 
    } 
    } 
    } 

が、とき起動アプリとには、リサイクルアプリのクラッシュの最後になって、このエラーを得たときにリサイクルビューの最後までスクロール:

FATAL EXCEPTION: main 
java.lang.IndexOutOfBoundsException: Invalid index 10, size is 10 

このラインから:

viewHolder.pages.setText(Integer.toString(jcontent.get(i).pages)); 

とページショーページのテキストビューです。セカンダリーレイアウトの値です。リサイクラービューの最後です。

答えて

0

あなたのリストjcontentサイズは10(0〜9)です。
チェックonBindViewHolder

if(i == jcontent.size()){ //here i == 10 

....... 
....... 
viewHolder.pages.setText(Integer.toString(jcontent.get(i).pages)); 
//here you are accessing the 10 element of jcontent. 
} 
+0

どうすればいいですか? – erfan

+1

i == 10の場合、単純にjcontent.get(i-1).pagesを実行してページ数を取得したい場合 –

+0

i-1を実行して問題を解決します – erfan

2

コードからスニペットを見つけました

@Override 
    public int getItemCount() { 
      return jcontent.size()+1; 
    } 

変更することをからではない

からそのリストbeacouseカウント開始

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

へあなたは10サイズのリストからを取得しようとしている場合。それは配列外の例外をスローします。

10番目の要素を取得するには9を取得する必要があります。このコードで

if(i == jcontent.size()) { 
      viewHolder.buttonnext.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Toast.makeText(context, "next", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
      viewHolder.buttonprev.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Toast.makeText(context, "pre", Toast.LENGTH_SHORT).show(); 
       } 
      }); 

      viewHolder.cardView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

       } 
      }); 

      viewHolder.pages.setText(Integer.toString(jcontent.get(i).pages)); 

     } 
     else { 

      viewHolder.title.setText(jcontent.get(i).title); 

      Picasso.with(context).load(jcontent.get(i).imgurl).resize(300, 400).into(viewHolder.imageView); 

     } 
    } 

あなたはjcontent.get(I)を取得している、これは問題


EDIT 2


ようになりますページはすべてのために一定であると思われますリサイクラーアイテムを作成し、メインのJSONオブジェクトから抽出して別のものとして渡したり、他のオブジェクトから取り出したりする

よう
if(jcontent.size()>0){ 
     pages =jcontent.get(0).pages; 
     viewHolder.pages.setText 
    } 

おかげ

+0

にこの行は、あなたが正しく私のポイントを理解していないと思います。もし私がそうするなら、私のリサイクラビューはリサイクラの二次レイアウト終了を表示しません。私のポイントではありません – erfan

+0

私はいくつかの編集を行った、遅く再生のために申し訳ありません – Godwin

+0

何のような変更?私はこれを行う:viewHolder.pages.setText(Integer.toString(jcontent.pages));あなたが達成しようとしているものは実際に何かを得ますか? – erfan

関連する問題