【问题标题】:Change background color effect in a item viewholder更改项目视图中的背景颜色效果
【发布时间】:2018-11-18 19:30:41
【问题描述】:

我有一个查看器来显示项目列表。因此,当我单击一个项目时,我想更改该项目的背景颜色。当我取消点击这个元素时,我想回到默认的背景颜色(白色)。

我尝试了以下代码,但有两个问题:

1- 当我取消单击某个项目时,它保持相同的颜色(灰色)。

2- 当我单击一个项目并进行另外两个活动时,当我返回该项目时,该项目保持相同的颜色(灰色),我不希望那样。它应该是白色(默认颜色)。

public class ArtistListAdapter extends RecyclerView.Adapter<ArtistListAdapter.ItemViewHolder> {

    // Vars
    private List<Artist> artists;
    private SearchArtistListener artistListenerAdapter;

    /************** Members **************/
    public ArtistListAdapter(List<Artist> artists, SearchArtistListener adapterListener) {
        this.artists = artists;
        this.artistListenerAdapter = adapterListener;
    }

    /************** Callbacks **************/
    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        LayoutInflater layoutInflater = LayoutInflater.from(viewGroup.getContext());
        View view = layoutInflater.inflate(R.layout.item_lista_busca, viewGroup, false);
        return (new ItemViewHolder(view, artistListenerAdapter));
    }

    @Override
    public void onBindViewHolder(@NonNull ItemViewHolder itemViewHolder, int i) {
        itemViewHolder.fillFields(artists.get(i));
    }

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

    /************** Interfaces/Classes **************/
    public final static class ItemViewHolder extends RecyclerView.ViewHolder
            implements View.OnClickListener, View.OnTouchListener {

        // Vars
        private SearchArtistListener viewHolderListener;

        // Views
        private ImageView    imgImageView;
        private LinearLayout lnLinearLayout;
        private TextView     subtitleTextView, titleTextView;

        /************** Members **************/
        public ItemViewHolder(@NonNull View itemView, SearchArtistListener viewHolderListener) {
            super(itemView);

            this.viewHolderListener = viewHolderListener;

            imgImageView   = itemView.findViewById(R.id.item_lista_busca_iv_imagem);
            subtitleTextView = itemView.findViewById(R.id.item_lista_busca_tv_subtitulo);
            titleTextView    = itemView.findViewById(R.id.item_lista_busca_tv_titulo);
            lnLinearLayout = itemView.findViewById(R.id.item_lista_busca_ll);

            itemView.setOnClickListener(this);
            lnLinearLayout.setOnTouchListener(this);
        }

        private void fillFields(Artist artist) {
            lnLinearLayout.setBackgroundColor(Color.WHITE);

            Picasso.with(itemView.getContext()).load(artist.getPictureSmall()).into(imgImageView);
            titleTextView.setText(artist.getName());
            subtitleTextView.setText("Artist");
        }

        /************** Callbacks **************/
        @Override
        public void onClick(View v) {
            if(viewHolderListener != null){
                viewHolderListener.onArtistaItemClick(getAdapterPosition());
            }
        }

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if((event.getAction()) == (MotionEvent.ACTION_DOWN))
                v.setBackgroundColor(Color.GRAY);
            else if((event.getAction()) == (MotionEvent.ACTION_UP))
                v.setBackgroundColor(Color.WHITE);

            return false;
        }
    }

    /**************** Classes - Interfaces ****************/
    public interface SearchArtistListener {
        void onArtistaItemClick(int position);
    }
}

【问题讨论】:

    标签: java android android-adapter android-viewholder


    【解决方案1】:

    使用以下代码来解决您的两个问题。我使用了虚拟代码来解释这种方法。

    这是带有您的 recyclerview 的活动。只需创建一个接口并在简历上实现其方法,然后在您的视图中使用该接口, 因此,当活动恢复时,它将实现该功能并将颜色恢复为默认值。

    public class TestActivity extends AppCompatActivity {
    
        private RecyclerViewAdapter recyclerViewAdapter;
    
        private OnActivityRefresh onActivityRefresh;
    
        public void setOnActivityRefresh(OnActivityRefresh onActivityRefresh) {
            this.onActivityRefresh = onActivityRefresh;
        }
    
        @Override
        protected void onResume() {
            super.onResume();
    
            if(onActivityRefresh != null){
                onActivityRefresh.onRefresh();
            }
    
        }
    
        private void refreshRecyclerview() {
    
        }
    
        public interface OnActivityRefresh{
            void onRefresh();
        }
    
    }
    

    现在这里是典型的视图持有者。这里我在构造函数中使用了相同的activity作为参数,并设置了接口,最终在activity resume时运行刷新函数

    此外,我仅通过在母布局上使用简单的单击侦听器来制作切换效果。这里的母亲布局是孩子的母亲布局:

    public class TestViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    
        private LinearLayout mother_layout;
        private boolean isViewSelected = false;
    
        public TestViewHolder(View itemView) {
            super(itemView);
            initViews(itemView);
        }
    
        private void initViews(View v){
            mother_layout = (LinearLayout)v.findViewById(R.id.mother_layout);
        }
    
        public void init(Activity activity){
            ((TestActivity)activity).setOnActivityRefresh(new TestActivity.OnActivityRefresh() {
                @Override
                public void onRefresh() {
                    isViewSelected = false;
                    setDefaultColor();
                }
            });
        }
    
        @Override
        public void onClick(View view) {
            if(view == mother_layout){
                if(isViewSelected){
                    isViewSelected = false;
                    setDefaultColor();
                }else{
                    isViewSelected = true;
                    setActiveColor();
                }
            }
        }
    
        private void setActiveColor() {
    
        }
    
        private void setDefaultColor() {
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      相关资源
      最近更新 更多