1

私はサーバーからデータを取得して表示するためにvolleyライブラリを使用しているアプリケーションを開発しています...ここでは、タブ。データはrecyclerviewには表示されませんが、電源を切ってから電源を入れた後にデータリストが表示されます

問題は、サーバーからデータを取得して表示する要素のリストを最初に実行すると、データがロードされてリストに追加されますが、RecyclerViewには表示されません。ディスプレイを消して戻すとデータが表示されますRecyclerView

誰かお手伝いしてください。

はここMyAdapter.java

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 

private ImageLoader mImageLoader; 
private Context context; 

ArrayList<Coupon> couponArrayList = new ArrayList<>(); 

public MyAdapter(Context context,ArrayList<Coupon> couponArrayList) 
{ 
    this.couponArrayList=couponArrayList; 
    this.context=context; 
} 
@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.offer_row,parent,false); 
    ViewHolder viewHolder = new ViewHolder(view); 

    viewHolder.relativeLayout.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      TextView redUrl = (TextView)view.findViewById(R.id.offer_url); 
      String postUrl = redUrl.getText().toString(); 
      Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(postUrl)); 
      Intent browserChooserIntent = Intent.createChooser(intent , "Choose browser of your choice"); 
      context.startActivity(browserChooserIntent); 
     } 
    }); 

    return viewHolder; 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    Coupon coupon = couponArrayList.get(position); 
    holder.title.setText(coupon.getTitle()); 
    holder.name.setText(coupon.getName()); 
    holder.coupon.setText(coupon.getCoupon()); 
    holder.expiry.setText(coupon.getExpiry()); 
    holder.url.setText(coupon.getLink()); 

    //Image loading using singleton class 
    mImageLoader = MySingleton.getInstance(context).getImageLoader(); 
    holder.image.setImageUrl(coupon.getImage(),mImageLoader); 
    holder.image.setDefaultImageResId(R.drawable.placeholder_image); 
} 

@Override 
public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
    super.onAttachedToRecyclerView(recyclerView); 
} 
public void remove(ContactsContract.Contacts.Data data) { 
    int position = couponArrayList.indexOf(data); 
    couponArrayList.remove(position); 
    notifyItemRemoved(position); 
} 

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

public static class ViewHolder extends RecyclerView.ViewHolder{ 
    NetworkImageView image; 
    RelativeLayout relativeLayout; 
    TextView title,name,coupon,expiry,url; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     this.image = (NetworkImageView)itemView.findViewById(R.id.offer_image); 
     this.title = (TextView)itemView.findViewById(R.id.offer_title); 
     this.name = (TextView)itemView.findViewById(R.id.offer_name); 
     this.coupon = (TextView)itemView.findViewById(R.id.coupon_code); 
     this.expiry = (TextView)itemView.findViewById(R.id.expiry_date); 
     this.url = (TextView)itemView.findViewById(R.id.offer_url); 
     this.relativeLayout = (RelativeLayout)itemView.findViewById(R.id.relLayout); 

     //make sure it is clickable 
     itemView.setClickable(true); 
    } 
} 

ここだのですAllOffers.java(Tab1を)

public class AllOffers extends Fragment { 
    RequestQueue queue; 
    RecyclerView recyclerView; 
    RecyclerView.Adapter adapter; 
    RecyclerView.LayoutManager layoutManager; 
    ArrayList<Coupon> arrayList = new ArrayList<>(); 

    public AllOffers() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.alloffers, container, false); 
     recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); 

     layoutManager = new LinearLayoutManager(getContext()); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setHasFixedSize(true); 

     //creating object of BgT to get arraylist og offers & coupons &&asign to local arrayList 
     BackgroundTask backgroundTask = new BackgroundTask(getActivity()); 
     arrayList = backgroundTask.getList(); 
     adapter = new MyAdapter(getContext(), arrayList); 

     //adding horizontal line b/w rows 
     recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL)); 

     recyclerView.setAdapter(adapter); 
     // adapter.clearAdapter(); 
     arrayList.clear(); 

     return view; 
    } 
} 

最後に Backgroundtask.java

public class BackgroundTask { 
    Context context; 
    RequestQueue queue; 
    public static final String KEY_TITLE="coupon_title"; 
    public static final String KEY_NAME="offer_name"; 
    public static final String KEY_CODE="coupon_code"; 
    public static final String KEY_IMAGE="store_image"; 
    public static final String KEY_EXPIRY="coupon_expiry"; 
    public static final String KEY_POSTURL="store_link"; 

    private ImageLoader mImageLoader; 
    ArrayList<Coupon> arrayList = new ArrayList<>(); 
    public static final String json_url="https://tools.vcommission.com/api/coupons.php?apikey=xxxxxxxxxx"; 

    public BackgroundTask(Context context) { 
     this.context = context; 
    } 

    public ArrayList<Coupon> getList() 
    { 
     final JsonArrayRequest jsonArrayRequest=new JsonArrayRequest(Request.Method.POST, json_url,null, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         int count=0; 
         while (count<response.length()) 
         { 
          try { 
           JSONObject jsonObject= response.getJSONObject(count); 
           Coupon coupon = new Coupon(jsonObject.getString(KEY_TITLE), 
             jsonObject.getString(KEY_NAME), 
             jsonObject.getString(KEY_CODE), 
             jsonObject.getString(KEY_IMAGE), 
             jsonObject.getString(KEY_EXPIRY), 
             jsonObject.getString(KEY_POSTURL)); 

           arrayList.add(coupon); 
           count++; 

          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
         } 
        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Toast.makeText(context,"No internet connection...!!!",Toast.LENGTH_LONG).show(); 
       error.printStackTrace(); 
      } 
     }); 
     MySingleton.getInstance(context).addToRequestQueue(jsonArrayRequest); 

     return arrayList; 
    } 
} 

答えて

0

あなたRecyclerViewが正しく二度目にロードされます。したがって、アダプタには何も問題はありません。

問題は、AdapternotifyDatasetChangedを呼び出していないサーバーからの応答を取得した後です。他にもいくつかの基本的な問題があります。あなたの問題を理解しやすくなるように、あなたのコードを少し修正しようとしています。

AllOffers.javaから必須の部分を追加しています。あなたがここで検討するかもしれない1つのことは、あなたがボレーを使用しているのと同じクラスでネットワークコールを保つことです。サーバーからの応答が届くと、AdapternotifyDatasetChangedと電話するほうが簡単です。

public class AllOffers extends Fragment { 
    RequestQueue queue; 
    RecyclerView recyclerView; 
    RecyclerView.Adapter adapter; 
    RecyclerView.LayoutManager layoutManager; 
    ArrayList<Coupon> arrayList = new ArrayList<>(); 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.alloffers, container, false); 

     // Setup your RecyclerView here 
     recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); 
     layoutManager = new LinearLayoutManager(getContext()); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL)); 

     // Set the adapter before the network call 
     adapter = new MyAdapter(getContext(), arrayList); 
     recyclerView.setAdapter(adapter); 

     // Move network call here 
     final JsonArrayRequest jsonArrayRequest=new JsonArrayRequest(Request.Method.POST, json_url,null, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         int count=0; 
         while (count<response.length()) 
         { 
          try { 
           JSONObject jsonObject= response.getJSONObject(count); 
           Coupon coupon = new Coupon(jsonObject.getString(KEY_TITLE), 
             jsonObject.getString(KEY_NAME), 
             jsonObject.getString(KEY_CODE), 
             jsonObject.getString(KEY_IMAGE), 
             jsonObject.getString(KEY_EXPIRY), 
             jsonObject.getString(KEY_POSTURL)); 

           arrayList.add(coupon); 
           count++; 

          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
         } 

         // Call notifyDatasetChanged on adapter so that the newly added items in the list takes effect in your RecyclerView 
         adapter.notifyDatasetChanged(); 

        } 
       }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
       Toast.makeText(context,"No internet connection...!!!",Toast.LENGTH_LONG).show(); 
       error.printStackTrace(); 
      } 
     }); 

     return view; 
    } 
} 

arrayListをクリアする必要はありません。私もその行を削除しました。

+0

OMG !!それは動作します...あなたの仲間に感謝 –

関連する問題