如何更改列表项目点击的项目外观。

问题描述:

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

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

您应该在代码中指明需要重置背景的位置。 –

+0

对项目点击查看里面'ContentViewHolder'视图持有者类 –

+0

在设置背景和文本颜色之前调用'notifyDataSetChanged' –

你基本上要利用好你的INT标志,previousSelectedPosition,来跟踪被点击的列表项的位置,调用notifyDataSetChanged(),然后设置标志作为条件语句的一部分内onBindViewHolder()到相应地更新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()条件不会影响直到标志更新(在点击一个列表项后,就是这样)。

+0

感谢您的回答。它的工作有点怀疑,当调用'notifyDataSetChanged()'时,它不会重绘整个列表视图?如果是的话,这对性能来说并不是那么糟糕。我认为可能有办法按位置查找列表视图项,并在点击第二项时将其更改为默认设计。 –

+0

@ChathurangaShanJayarathna notifyDataSetChanged()只更新当前屏幕上的列表项,而不是重建整个列表,所以不,它在内存中并不昂贵。至于你的问题,我敢肯定有一种方法,但是最好使用我的方法,因为更新由许多列表项(包括插入新行)组成的列表中的单个行的UI,比如说100行在屏幕外,导致一个错误,其中“每隔一个”列表项目也被更新。本教程视频可能会有所帮助:https://www.youtube.com/watch?v=Ntrf-sWSrNs – DaveNOTDavid

+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