如何更改Recycler项目颜色?

问题描述:

OUTPUT...如何更改Recycler项目颜色?

我有RecyclerView,我正在充气数据。我的要求是我必须以黑色显示第一个项目文本,其余项目应该是灰色的。而当用户滚动时,那个灰色的颜色应该是黑色的,而它的追随者会再次变成灰色。我在想这个使用位置,但我很困惑。

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> 
    implements RecyclerViewFastScroller.BubbleTextGetter { 

    private List<String> mDataArray; 

    public RecyclerViewAdapter(List<String> dataset) { 
     mDataArray = dataset; 
    } 

    @Override 
    public int getItemCount() { 
     if (mDataArray == null) 
      return 0; 
     return mDataArray.size(); 
    } 

    @Override 
    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler_view_layout, parent, false); 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     holder.mTextView.setText(mDataArray.get(position)); 

    } 

    @Override 
    public String getTextToShowInBubble(int pos) { 
     if (pos < 0 || pos >= mDataArray.size()) 
      return null; 

     String name = mDataArray.get(pos); 
     if (name == null || name.length() < 1) 
      return null; 
     return mDataArray.get(pos).substring(0, 1); 

    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     @Bind(R.id.tv_alphabet) 
     public TextView mTextView; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      ButterKnife.bind(this, itemView); 
     } 
    } 

} 

我更新的onScrollIng码和动态变化

@Override 
public void onBindViewHolder(MessageAdapter.ViewHolder holder, int position) { 

    /*Tuesday, April 10, 2001 3:51 PM*/ 

    msgModels = msgList.get(position); 
    if (msgList.get(position) != null) { 

      holder.msgTitle.setText(msgModels.getMessageTitle()); 
      holder.msgDescription.setText(msgModels.getMessageDescription()); 
      holder.msgDate.setText(msgModels.getMessageDate()); 
    } 

    if (position == firstVisible) { 
     holder.msgTitle.setTextColor(Color.RED); 
     holder.msgDescription.setTextColor(Color.RED); 
     holder.msgDate.setTextColor(Color.RED); 
    }else{ 
     holder.msgTitle.setTextColor(Color.BLUE); 
     holder.msgDescription.setTextColor(Color.BLUE); 
     holder.msgDate.setTextColor(Color.BLUE); 
    } 


} 

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

private int firstVisible = 0; 

public void changeItem(int position){ 
    firstVisible = position; 
    notifyItemChanged(firstVisible); 
    notifyDataSetChanged(); 
} 


public class ViewHolder extends RecyclerView.ViewHolder { 
    public TextView msgTitle, msgDescription,msgDate; 

    public ViewHolder(View view) { 
     super(view); 
     msgTitle = (TextView)view.findViewById(R.id.msgTitle); 
     msgDescription = (TextView)view.findViewById(R.id.msgDescription); 
     msgDate = (TextView)view.findViewById(R.id.msgDate); 
    } 
} 
} 

我的活动,我特意打电话回收站onScroll

private ProgressDialog mProgressDialog = null; 
private static final String API_MSG_CALL = "API_MSG_CALL"; 
private Map<String, String> mapobject; 
private LinearLayoutManager linearLayoutManager; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_message, null); 
    mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_viewLaws); 
    mRecyclerView.setAdapter(msgAdapter); 
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
    msgAdapter = new MessageAdapter(msgList, getActivity(), this); 

    linearLayoutManager = new LinearLayoutManager(getActivity()); 

    //msgAdapter.notifyDataSetChanged(); 
    mProgressDialog = new ProgressDialog(getActivity()); 

    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 
      int firstVisible = linearLayoutManager.findFirstCompletelyVisibleItemPosition(); 
      msgAdapter.changeItem(firstVisible); 
     } 
    }); 

使用holder.itemView.setBackgroundColor(...);

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    holder.itemView.setBackgroundColor(yourcolor); 
    holder.mTextView.setText(mDataArray.get(position)); 

} 

更新:

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    if(position==0){ 
     holder.itemView.setBackgroundColor(Color.BLACK); 
    }else{ 
     holder.itemView.setBackgroundColor(Color.GREY); 

    } 
    holder.mTextView.setText(mDataArray.get(position)); 

} 
+0

Thnxx你的答复,但我已经把只有第一项为黑色。休息会在灰色 –

+1

更新我的回答请检查 – SaravInfern

+0

谢谢,但一个更多的帮助,我需要先生..对于0位置我的数据是变化和其他是在不同的颜色。现在我滚动页面,然后0位置消失。并假设第10名现在位居榜首。那么我该如何再次将第10个位置变成黑色并在灰色中保持可见部分? –

首先在主活动中使用此代码,找到第一个可见项:

 recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() { 
     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 
      int firstVisible = linearLayoutManager.findFirstCompletelyVisibleItemPosition(); 
      RecyclerViewAdapter.changeItem(firstVisible); 
     } 
    }); 

然后在适配器中添加这个方法:

private int firstVisible = 0; 

    public void changeItem(int position){ 
    firstVisible = position; 
    notifyItemChanged(firstVisible); 
    notifyDataSetChanged(); 
    } 

和在onBindViewHolder添加以下代码:

if (position == firstVisible) { 
     holder.txtNumber.setBackgroundColor(mContext.getResources().getColor(R.color.black)); 
    } 

我只使用文本作为一个例子,但你可以改变cardview的背景太

+0

Thnxx先生,但1毫秒其变化的颜色,然后整个RecyclerView数据是黑色.. :( –

+1

你可以把你的改变代码请 –

+0

是的分钟先生 –