有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在单击项时更改列表项的外观。

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

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

共 (2) 个答案

  1. # 1 楼答案

    你的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
    
  2. # 2 楼答案

    基本上,您希望充分利用int标志previousSelectedPosition,跟踪单击的列表项的位置,调用notifyDataSetChanged(),然后将该标志设置为onBindViewHolder()内条件语句的一部分,以便在视图持有者的视图不断绑定时相应地更新视图持有者的视图。尝试以下更改:

    视图持有者的onClick():

    @Override
    public void onClick(View v) {
        if (itemClickListener!=null) {
            previousSelectedPosition = getAdapterPosition();
    
            notifyDataSetChanged();
    
            itemClickListener.onItemClick(v,this.getLayoutPosition(),dataType,getOldPosition());
        }
    }
    

    回收视图。适配器的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()中的条件在标志更新之前(即在单击列表项之后)不会有任何影响