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

Попробуйте установить слушатели 'onClick' в' onBindViewHolder'. –

ответ

1

Есть ли причина, по которой вы сделали свой ViewHolder статическим? Если вы удалите статическую информацию, вы можете позвонить из адаптера notifyItemChanged(getAdapterPosition());, чтобы обновить представление. Затем, удалив статическую информацию на вашем ViewHolder, вы также можете удалить ее из своего feedObjectArrayList.

Если вы хотите сохранить его в статическом состоянии, вы можете создать новый класс, который реализует OnClickListener в Адаптере и передает его в ViewHolder в onBindViewHolder.

В качестве побочного примечания я должен сказать, что метод onClick - это кошмар для удобочитаемости, и я лично разбил бы его на отдельные классы для каждого случая, который у вас есть.

+0

Я использовал статический viewHolder для его загрузки в памяти. , как вы видите в приведенном выше коде, я хочу использовать onclick внутри адаптера, поэтому, если есть какой-либо способ сделать это –

+0

То, как это не работает, вы все равно создаете несколько экземпляров класса, каждый из которых занимает память. Держатель представления является статическим, это означает, что он не содержит ссылки на его родительский класс, в этом случае адаптер – Dom

+0

Надеюсь, вы сможете помочь мне в повторной работе –

 Смежные вопросы

  • Нет связанных вопросов^_^