2016-11-23 109 views
0

我建立一個RecyclerView,以顯示我的數組列表中的項目,我也取得了上點擊監聽器,但是當我實現了onClick方法我不能更新從那裏我的觀點|。這裏是我RecyclerView適配器的Android回收站查看適配器

public class FeedRecyclerAdapter extends RecyclerView.Adapter<FeedRecyclerAdapter.ViewHolder> { 
    public static ArrayList<FeedObject> feedObjectArrayList; 

    @Override 
    public FeedRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.feeditemlayout, parent, false); 
     ViewHolder viewHolder = new ViewHolder(v); 
     v.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
     return viewHolder; 
    } 


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

     final FeedObject feedObject = feedObjectArrayList.get(position); 


     holder.likeFeedItemTV.setText(feedObject.getNumAgree() + ""); 
     holder.dislikeFeedItemTV.setText(feedObject.getNumDisAgree() + ""); 
     holder.commentFeedItemTV.setText(feedObject.getNumComments() + ""); 
     holder.mediaFeedItemTV.setText(feedObject.getMediaSize() + ""); 


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

    public FeedRecyclerAdapter(ArrayList<FeedObject> feedObjectArrayList) { 
     this.feedObjectArrayList = feedObjectArrayList; 
    } 


    public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener { 
     private ImageView likeFeedItem, profileImageView, likeFeedItemIV, dislikeFeedItem, commentFeedItem, mediaFeedItem; 
     private TextView personName, personDetails, cat_Info_Feed_Item, descriptionFeedItemTV, likeFeedItemTV, dislikeFeedItemTV, commentFeedItemTV, mediaFeedItemTV, agreeFeed, disagreeFeed, commentFeed, mediaFeed; 
     private ImageButton moreOption; 
     private Button seeMore; 

     public ViewHolder(View itemView) { 
      super(itemView); 

      likeFeedItemTV = (TextView) itemView.findViewById(R.id.likeFeedItemTV); 
      dislikeFeedItemTV = (TextView) itemView.findViewById(R.id.dislikeFeedItemTV); 
      commentFeedItemTV = (TextView) itemView.findViewById(R.id.commnetFeedItemTV); 
      mediaFeedItemTV = (TextView) itemView.findViewById(R.id.mediaFeedItemTV); 

      likeFeedItem = (ImageView) itemView.findViewById(likeFeedItemIB); 
      dislikeFeedItem = (ImageView) itemView.findViewById(dislikeFeedItemIV); 
      commentFeedItem = (ImageView) itemView.findViewById(commentFeedItemIV); 
      mediaFeedItem = (ImageView) itemView.findViewById(mediaFeedItemIV); 
      agreeFeed = (TextView) itemView.findViewById(agreeFeedTV); 
      disagreeFeed = (TextView) itemView.findViewById(disagreeFeedTV); 
      commentFeed = (TextView) itemView.findViewById(commentFeedTV); 
      mediaFeed = (TextView) itemView.findViewById(commentFeedTV); 


      likeFeedItem.setOnClickListener(this); 
      dislikeFeedItem.setOnClickListener(this); 
      commentFeedItem.setOnClickListener(this); 
      mediaFeedItem.setOnClickListener(this); 
      agreeFeed.setOnClickListener(this); 
      disagreeFeed.setOnClickListener(this); 
      commentFeed.setOnClickListener(this); 
      mediaFeed.setOnClickListener(this); 

      seeMore = (Button) itemView.findViewById(seeMoreFeedItemTV); 
      moreOption = (ImageButton) itemView.findViewById(moreFeedItemIB); 
      seeMore.setOnClickListener(this); 
      moreOption.setOnClickListener(this); 
      itemView.setOnClickListener(this); 


     } 

     public boolean onMenuItemClick(MenuItem item) { 
      switch (item.getItemId()) { 


       default: 
        return false; 
      } 
     } 

     @Override 
     public void onClick(View v) { 
      final FeedObject feedObject = feedObjectArrayList.get(getAdapterPosition()); 

      switch (v.getId()) { 
       case moreFeedItemIB: 
        PopupMenu popupMenu = new PopupMenu(v.getContext(), v); 
        MenuInflater menuInflater = popupMenu.getMenuInflater(); 
        menuInflater.inflate(R.menu.feeditemmenu, popupMenu.getMenu()); 
        popupMenu.show(); 
        break; 
       case likeFeedItemIB: 
       case agreeFeedTV: 
        new AsyncTask() { 
         @Override 
         protected Object doInBackground(Object[] params) { 
          Boolean b=feedObject.isAgree(); 
          if (b != null) { 
           if (b) { 
            feedObject.setAgree(null); 
            feedObject.setNumAgree(feedObject.getNumAgree() - 1); 
           } else { 
            feedObject.setAgree(true); 
            feedObject.setNumAgree(feedObject.getNumAgree() + 1); 
            feedObject.setNumDisAgree(feedObject.getNumDisAgree() - 1); 
           } 
          } else { 
           feedObject.setAgree(true); 
           feedObject.setNumAgree(feedObject.getNumAgree() + 1); 
          } 

          return null; 
         } 


        }.execute(); 

        //here is my problem i can't update my view 
        break; 
       case dislikeFeedItemIV: 
       case disagreeFeedTV: 
        new AsyncTask() { 
         @Override 
         protected Object doInBackground(Object[] params) { 
          Boolean c=feedObject.isAgree(); 
          if (c != null) { 
           if (c) { 
            feedObject.setAgree(false); 

            feedObject.setNumAgree(feedObject.getNumAgree() - 1); 
            feedObject.setNumDisAgree(feedObject.getNumDisAgree()+ 1); 
           } else { 
            feedObject.setAgree(null); 
            feedObject.setNumAgree(feedObject.getNumAgree() - 1); 

           } 
          } else { 
           feedObject.setAgree(false); 
           feedObject.setNumDisAgree(feedObject.getNumDisAgree() + 1); 
          } 
          return null; 
         } 
        }.execute(); 

        break; 
       case seeMoreFeedItemTV: 
       case commentFeedItemIV: 
       case commentFeedTV: 
        v.getContext().startActivity(new Intent(v.getContext(),DetailedFeed.class)); 

        break; 
       case mediaFeedItemIV: 
       case mediaFeedTV: 
        break; 


      } 


     } 




    } 
} 
+0

嘗試在'onBindViewHolder'方法中設置'onClick'偵聽器。 –

回答

1

有沒有讓ViewHolder變爲靜態的原因?如果您刪除靜態,您可以從適配器notifyItemChanged(getAdapterPosition());內調用以更新您的視圖。然後通過刪除ViewHolder上的靜態,您也可以將其從feedObjectArrayList中刪除。

如果您想保持靜態,您可以創建一個新類,在適配器中實現OnClickListener並將其傳遞給onBindViewHolder中的ViewHolder。

作爲一個方面說明,我不得不說,onClick方法是一個可讀性的噩夢,我個人將它分解爲單獨的類,爲您在那裏的每個案例。

+0

我用一個靜態viewHolder在內存中加載一次。 正如你在上面的代碼中看到的,我想在適配器內部使用onclick,所以如果有什麼辦法可以做到這一點 –

+0

這不是它是如何工作的,你仍然在創建類的多個實例,每個實例都佔用內存。視圖持有者是靜態的,意味着它不包含對其父類的引用,在這種情況下,適配器 – Dom

+0

我希望你能幫我重做我的工作 –

相關問題