2016-11-23 111 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

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

相关问题