【问题标题】:How to change list Item appearance on item click.如何在项目单击时更改列表项目外观。
【发布时间】:2017-07-02 03:53:03
【问题描述】:

在我的应用程序中,我有水平列表视图。在项目选择上,我想更改选定的项目背景颜色及其文本视图颜色。我已经弄清楚了那部分。但是如何重置先前选定项目的背景颜色和文本视图颜色。这是我的适配器类。

public class DateRangeListViewAdapter extends RecyclerView.Adapter<DateRangeListViewAdapter.ContentViewHolder>  {

private ItemClickListener itemClickListener;
private LayoutInflater inflater;
private ArrayList<String> data;
private Context context;
private int dataType;
private int previousSelectedPosition;
private static final int DATE_TYPE = 1;
private static final int STATUS_TYPE = 2;

public DateRangeListViewAdapter(ArrayList<String> data, Context context,int dataType) {
    this.data = data;
    this.context = context;
    this.dataType = dataType;
    inflater  = LayoutInflater.from(context);
    previousSelectedPosition = -1;
}

public void setItemClickListener(ItemClickListener itemClickListener) {
    this.itemClickListener = itemClickListener;
}

@Override
public ContentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.custom_date_range_list_item,parent,false);
    return new ContentViewHolder(view);
}

@Override
public void onBindViewHolder(ContentViewHolder holder, int position) {
    String name = data.get(position);
    holder.dateText.setText(name);
}

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


public class ContentViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    private FrameLayout main;
    private TextView dateText;

    public ContentViewHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
        main = (FrameLayout) itemView.findViewById(R.id.main_layout);
        dateText = (TextView) itemView.findViewById(R.id.date_name);
    }

    @Override
    public void onClick(View v) {

        //Selected item color change
        main.setBackground(ContextCompat.getDrawable(context,R.drawable.date_range_selected_item_background));
        dateText.setTextColor(ContextCompat.getColor(context,R.color.colorPrimary));

        if(itemClickListener!=null){
            itemClickListener.onItemClick(v,this.getLayoutPosition(),dataType,getOldPosition());
        }
    }
}

public interface ItemClickListener{
    public void onItemClick(View v, int position,int dataType,int oldPosition);
    }
}

【问题讨论】:

  • 您应该在代码中指出需要重置背景的位置。
  • 在项目上点击查看ContentViewHolder视图持有者类
  • 在设置背景和文字颜色之前调用notifyDataSetChanged
  • 那不行。我认为您没有正确回答问题,我发布的代码正在运行。我想在第二次选择项目时将项目外观重置为正常。
  • 使用可绘制状态列表作为custom_date_range_list_item .Check this的背景。

标签: java android xml


【解决方案1】:

您基本上想充分利用您的 int 标志 previousSelectedPosition 来跟踪被单击的列表项的位置,调用 notifyDataSetChanged(),然后将该标志设置为 @987654324 中条件语句的一部分@ 在 ViewHolder 的视图不断被绑定时相应地更新它们。尝试以下更改:

ViewHolder 的 onClick():

@Override
public void onClick(View v) {
    if (itemClickListener!=null) {
        previousSelectedPosition = getAdapterPosition();

        notifyDataSetChanged();

        itemClickListener.onItemClick(v,this.getLayoutPosition(),dataType,getOldPosition());
    }
}

RecyclerView.Adapter 的 onBindViewHolder():

@Override
public void onBindViewHolder(ContentViewHolder holder, int position) {
    String name = data.get(position);
    holder.dateText.setText(name);

    if (previousSelectedPosition == position) {
        main.setBackground(ContextCompat.getDrawable(context,R.drawable.date_range_selected_item_background));
        dateText.setTextColor(ContextCompat.getColor(context,R.color.colorPrimary));
    } else {
        // TODO: Configure the FrameLayout and TextView here for initial runtime as well as back to default
    }
}

... 是的,确保在初始运行时将 previousSelectedPosition 初始化为 -1,这样onBindViewHolder() 中的条件就无关紧要直到标志更新(经过列表项被点击,即)。

【讨论】:

  • 感谢您的回答。它的工作有点怀疑,当调用notifyDataSetChanged() 时它不会重新绘制整个列表视图吗?如果是的话,这对性能来说还不错。我认为可能有一种方法可以按位置查找列表视图项,并在单击第二项时仅将其更改为默认设计。
  • @ChathurangaShanJayarathna notifyDataSetChanged() 仅更新当前屏幕上的列表项,而不是重建整个列表,所以不,它在内存中并不昂贵。至于您的问题,我确信有办法,但使用我的方法是一种很好的做法,因为更新由许多列表项(尤其是插入新行时)组成的列表的单个行的 UI,例如 100 行屏幕外,会导致“所有其他”列表项也被更新的错误。本教程视频可能会有所帮助:youtube.com/watch?v=Ntrf-sWSrNs
【解决方案2】:

您的OnClickListener 无法正常工作。你只需要从你的“ItemClickListener”接口实现你的ViewHolder。并在onCreateViewHolder 中添加这一行:

View view = inflater.inflate(R.layout.custom_date_range_list_item,parent,false);
ContentViewHolder cVh =  ContentViewHolder(view);view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            cVh.onItemClick(v,this.getLayoutPosition(),cVh .dataType,cVh .getOldPosition());

        }
    });return cVh

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多