2017-07-02 107 views
1

在我的應用程序中,我有水平列表視圖。在項目選擇我想要更改選定的項目背景顏色和它的文本視圖顏色。我已經想出了那部分。但是如何重置先前選擇的項目的背景顏色和文本視圖顏色。這是我的適配器類。如何更改列表項目點擊的項目外觀。

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' –

回答

0

你基本上要利用好你的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

感謝您的幫助。 –

0

您的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