2017-01-17 8 views
1

私は、JSONを使用してサーバーからrecyclerviewにアイテムをロードし、ハッシュマップメソッドでデータを設定するためのAdapterクラスを維持しています。私はrecyclerViewのページネーションを使用しています。各ページには10個のアイテムが含まれ、10個のアイテムに到達するとページが増分されます。RecyclerViewは位置を持つアイテムを更新しません

ロードした後、ユーザーがアイテムをクリックしたときに更新されないという問題があります。

HomeClassは、ランチャーの活動です:

public class HomeClass extends AppCompatActivity { 

    protected void onCreate(Bundle savedInstanceState) { 
     sendID(url); 
    } 

     public void sendID(final String url){ 
     if (progress == null) { 
      progress = new ProgressDialog(this); 
      progress.show(); 
     } 
     Constant.Home_Posts.clear(); 
     new Thread(new Runnable(){ 
      @Override 
      public void run() { 
      ///pagecount is 1 in HomeClass by default 
       JSONObject responseObj = new JSONObject(arg0); 

      HashMap<String, String> map = new HashMap<String, String>(); 
       map.put(key,value); 
       Constant.Home_Posts.add(map); 
       } 
      } 
       if (progress!=null) { 
        if (progress.isShowing()) { 
        progress.dismiss(); 
        progress = null; 
       Intent intent = new Intent(HomeClass.this, Home.class); 
        startActivity(intent); 
        finish(); 
        } 
     } 

第二のクラス、ホーム、唯一

 public class Home extends AppCompatActivity { 
     protected void onCreate(Bundle savedInstanceState) { 
     } 

     private void getPostCount(final String URl) { 
     if (progress == null) { 
      progress = new ProgressDialog(this); 
      progress.show(); 
     } 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 

       viewposition = viewposition + 10; 
       getPostUrl = "url+userid="+ userID+ "&page="+ page_count; 

      //pagecount is 2 in 'Home' by default and then icrements 
      JSONObject responseObj = new JSONObject(arg0); 

       HashMap<String, String> map = new HashMap<String, String>(); 
       map.put(key,value); 
       Constant.Home_Posts.add(map); 
        ' 
        ' 
       } 
      } 
      } 
      page_count++; 

アダプタクラスonBindViewHolder contais:

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

    public void onBindViewHolder(RecyclerView.ViewHolder holder,final int i) { 
      if (Constant.Home_Posts.size() - 1 == i) { 
       Constant.Home_Posts.clear(); 
       getPostCount("url+ userID + "&page=" + page_count); 
      } 

     //set value using hashmap method from server 
     viewHolder.imgComment.setText(value) //with integer values 


     //OmCLick to update datas from user  
     viewHolder.imgComment.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 

       //get layout view by LayoutIflater and load data from server 

       // create alert dialog 
       final AlertDialog alertDialog = alertDialogBuilder.create(); 
       //user can comment anyhting,if success comment value in count 
       //should increment or comments should not change     

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

          if (commentStatus == 0) { 
          } else { 
           alertDialog.cancel(); 


      String putLikesValue=(Integer.toString(Integer.parseInt(
       Constant.Home_Posts.get(i).get("comments_count"))+1)); 

      viewHolder.txtComment.setText(putLikesValue+"Comments"); 

       notifyDataSetChanged(); 
        notifyItemChanged(i); 
       }); 
       } 

結果は同様で、 古いアイテムは更新されたアイテム(新しく挿入されたアイテム)でリストされます。

アイテムを適切に挿入するにはどうすればよいですか?

+1

私はあなたがやろうとしていることを得ていません –

+0

データは10項目/ページをロードしています。私はAPIのページを増やす場合、私はrecyclerView(ページネーションのような)の残りのデータを読み込むことができます、これはうまくいきます。 RecylerViewにロードされた項目の後、ユーザーがコメントのためにEditTextでレイアウトを取得するとクリックすると。コンテンツがサーバーに更新され、応答が成功した場合は増分する必要があります。そうでない場合はレイアウトビューを閉じます。問題は、私は挿入のようなカウントを更新しようとしているが、カウントは新しいアイテムとして挿入されています。 – user7427213

答えて

1

こんにちは、これを使用してすべてのデータを読み込みます。

public FriendsAdapterSwipe(List<FriendListModel> alFriendListModel,RecyclerView recyclerView,Context context) 
{ 
    this.alFriendListModel = alFriendListModel; 
    this.context=context; 

    if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) { 

     final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); 
     recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
       super.onScrolled(recyclerView, dx, dy); 

       totalItemCount = linearLayoutManager.getItemCount(); 
       lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); 
       if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) { 
        if (onLoadMoreListener != null) { 
         onLoadMoreListener.onLoadMore(); 
        } 
        loading = true; 
       } 
      } 
     }); 
    } 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    RecyclerView.ViewHolder vh; 
    if (viewType == VIEW_ITEM) 
    { 
     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.raw_friends_swipe, parent, false); 
     vh = new CustomViewHolder(itemView); 
    } else 
    { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.progressbar_item, parent, false); 
     vh = new ProgressViewHolder(v); 
    } 
    return vh; 
} 

@Override 
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 

    if (holder instanceof CustomViewHolder) 
    { 
     Typeface AvenirNextRegular = Fonts.AvenirNextRegular(context); 
     holder.setIsRecyclable(false); 
     FriendListModel model = alFriendListModel.get(position); 
     ((CustomViewHolder) holder).txtUname.setText(model.getFullName()); 
     ((CustomViewHolder) holder).txtUname.setTypeface(AvenirNextRegular); 

     if (alFriendListModel.get(position).getIsImageAvaible().equalsIgnoreCase("1")) 
     { 
      Glide.clear(((CustomViewHolder) holder).imgProfile); 
      Glide.with(context).load(WebField.PROFILE_URL + alFriendListModel.get(position).getFriendId() 
        + "_small.png").asBitmap() 
        .placeholder(R.drawable.user_pic).skipMemoryCache(true) 
        .diskCacheStrategy(DiskCacheStrategy.ALL). 
        fitCenter().into(new BitmapImageViewTarget(((CustomViewHolder) holder).imgProfile) 
      { 
       @Override 
       protected void setResource(Bitmap resource) 
       { 
        Drawable d = new BitmapDrawable(context.getResources(), resource); 
        ((CustomViewHolder) holder).imgProfile.setImageDrawable(d); 
       } 
      }); 
     } 
    } 
    else 
    { 
     ((CustomViewHolder) holder).imgProfile.setImageResource(R.drawable.user_pic); 
    } 
} 

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

@Override 
public int getItemViewType(int position) { 
    return alFriendListModel.get(position) != null ? VIEW_ITEM : VIEW_PROG; 
} 

public interface OnLoadMoreListener { 
    void onLoadMore(); 
} 

public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) { 
    this.onLoadMoreListener = onLoadMoreListener; 
} 

public static class CustomViewHolder extends RecyclerView.ViewHolder 
{ 
    TextView txtUname; 
    CircularImageView imgProfile;; 

    public CustomViewHolder(View itemView) { 
     super(itemView); 
     txtUname = (TextView) itemView.findViewById(R.id.txtUname); 
     imgProfile = (CircularImageView) itemView.findViewById(R.id.imgProfile); 
    } 
} 

public static class ProgressViewHolder extends RecyclerView.ViewHolder { 
    public ProgressBar progressBar; 

    public ProgressViewHolder(View v) { 
     super(v); 
     progressBar = (ProgressBar) v.findViewById(R.id.progressBar); 
    } 
} 
public void setLoaded() { 
    loading = false; 
} 
+0

投稿ありがとう、これはget、setメソッドのように見えますが、私はすでにこれを試しました。それはrecyclerviewのアイテムを更新していません。 – user7427213

+0

あなたが望むタイプは –

+0

です。タイプは関係ありません。ユーザーが画像/動画を投稿できるようなアイテムがあります。他のユーザーがコメントすることができます。サーバーのすべての投稿を読み込んでいます。成功すればサーバーに接続し、コメント項目だけでカウント(+1)を更新する必要があります。 – user7427213

0

ローダーをページに基づいて設定することができます。

public EventAdapter(final List<EventsModel> myDataSet, RecyclerView recyclerView, Context context) { 
    mDataset = myDataSet; 
    this.context = context; 

    if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) { 

     final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); 
     recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
       super.onScrolled(recyclerView, dx, dy); 


       totalItemCount = linearLayoutManager.getItemCount(); 
       lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); 
       if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) { 
        // End has been reached 
        // Do something 
        if (onLoadMoreListener != null) { 
         onLoadMoreListener.onLoadMore(); 
        } 
        loading = true; 
       } 
      } 
     }); 
    } 
} 

@Override 
public int getItemViewType(int position) { 
    return mDataset.get(position) != null ? VIEW_ITEM : VIEW_PROG; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    RecyclerView.ViewHolder vh; 


    if (viewType == VIEW_ITEM) { 


     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.raw_eventlist, parent, false); 

     itemView.setOnClickListener(EventFragment.myOnClickListener); 

     vh = new TextViewHolder(itemView); 

    } else { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.progressbar_item, parent, false); 
     vh = new ProgressViewHolder(v); 
    } 
    return vh; 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    if (holder instanceof TextViewHolder) { 

     Typeface AvenirNextRegular = Fonts.AvenirNextRegular(context); 
     ((TextViewHolder) holder).txtEventName.setTypeface(AvenirNextRegular); 
     ((TextViewHolder) holder).txtEventDescription.setTypeface(AvenirNextRegular); 
     ((TextViewHolder) holder).txtDate.setTypeface(AvenirNextRegular); 
     ((TextViewHolder) holder).txtTime.setTypeface(AvenirNextRegular); 

     ((TextViewHolder) holder).txtEventName.setText(mDataset.get(position).getStrEventName()); 
     ((TextViewHolder) holder).txtEventDescription.setText(mDataset.get(position).getStrDescription()); 
     ((TextViewHolder) holder).txtDate.setText(mDataset.get(position).getStrStartDate()); 
     ((TextViewHolder) holder).txtTime.setText(mDataset.get(position).getStrStartTime()); 


     final RecyclerView.ViewHolder tempHolder = holder; 
     String eventId = mDataset.get(position).getStrEventId(); 


      if (mDataset.get(position).getIsImageAvailable().equalsIgnoreCase("1")) 
      { 
       Glide.clear(((TextViewHolder) holder).imgProfile); 
       Glide.with(context).load(WebField.EVENT_URL + eventId + "_small.png").asBitmap() 
         .placeholder(R.drawable.event_img).skipMemoryCache(true). 
         diskCacheStrategy(DiskCacheStrategy.ALL).fitCenter() 
         .into(new BitmapImageViewTarget(((TextViewHolder) holder).imgProfile) { 
          @Override 
          protected void setResource(Bitmap resource) { 

           Drawable d = new BitmapDrawable(context.getResources(), resource); 
           ((TextViewHolder) tempHolder).imgProfile.setImageDrawable(d); 
          } 

         }); 
      } 
      else 
      { 
       ((TextViewHolder) holder).imgProfile.setImageResource(R.drawable.event_img); 
      } 
    } 
} 

public void setLoaded() { 
    loading = false; 
} 

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

public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) { 
    this.onLoadMoreListener = onLoadMoreListener; 
} 

public interface OnLoadMoreListener { 
    void onLoadMore(); 
} 

public static class TextViewHolder extends RecyclerView.ViewHolder { 

    CircularImageView imgProfile; 
    TextView txtEventName; 
    TextView txtEventDescription; 
    TextView txtDate; 
    TextView txtTime; 
    ImageView btnNext; 

    public TextViewHolder(View view) { 
     super(view); 
     this.imgProfile = (CircularImageView) view.findViewById(R.id.imgProfile); 
     this.txtEventName = (TextView) view.findViewById(R.id.txtEventName); 
     this.txtEventDescription = (TextView) view.findViewById(R.id.txtEventDescription); 
     this.txtDate = (TextView) view.findViewById(R.id.txtDate); 
     this.txtTime = (TextView) view.findViewById(R.id.txtTime); 
     this.btnNext = (ImageView) view.findViewById(R.id.btnNext); 
    } 
} 

public static class ProgressViewHolder extends RecyclerView.ViewHolder { 
    public ProgressBar progressBar; 

    public ProgressViewHolder(View v) { 
     super(v); 
     progressBar = (ProgressBar) v.findViewById(R.id.progressBar); 
     progressBar.getIndeterminateDrawable().setColorFilter(Color.BLUE, PorterDuff.Mode.MULTIPLY); 
    } 
} 
+0

あなたの貴重な時間のおかげで、Sachin。私はまた、コメント項目を更新するためにページを読み込もうとしましたが、スクロールしたページを保持するのは難しいです。たとえば、最初のページと2ページ目は保持されていますが、3ページ目以降は中断された場所のように読み込まれません。 Thats'y私はレイアウトビューとしてコメントボックスを膨らませることを選択しました。私は問題が今exacltyであることを説明しました – user7427213

+0

hmmm。もしあなたが好きなら、受け入れてください。 –

+0

私は期待した答えが得られていません。私は予想される答えを得るときに少なくとも受け入れます – user7427213

関連する問題