在项目查看器中更改背景颜色效果

时间:2018-11-18 19:30:42

标签: java android android-adapter android-viewholder

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

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

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);
    }
}

1 个答案:

答案 0 :(得分:0)

使用以下代码来解决您的两个问题

我用伪代码来解释这种方法

以下是与您的回收者意见相关的活动 只需创建一个接口并在简历上实现其方法 并在您的视口中使用该界面 这样,当活动恢复时,它将实现该功能并将颜色恢复为默认值

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();
}

}

现在这是典型的视图持有人 在这里,我使用了与构造函数中的参数相同的活动,并设置了接口 最终在活动恢复上运行刷新功能

此外,我仅通过在Moter布局上使用简单的点击侦听器就获得了太棒的效果

这里的母亲布局是孩子的母亲布局

希望您能理解

我急着想念我的拼写错误;)

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() {

}

}

希望有帮助

快乐编码;)

我知道是否有问题