我希望选择并高亮显示recyclerview
的行,并在单击日期时显示当前时间。我可以在单击星期数上显示行。但不能高亮显示或setBackground
到具有当前时间的行。一旦我将position
与onBindHolder()
方法中的位置进行比较,行数就是highlighted
。
请帮我一把。谢谢
这一行代码setAdapter()
和平滑滚动到当前的时间位置:
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
int onEpgDaysPosition = calendar.get(Calendar.DAY_OF_WEEK);
int onAirEpgPosition = getpositionofOnAir(epgHash.get(new SimpleDateFormat("EE", Locale.ENGLISH).format(date.getTime())));
daysRecyclerView.setLayoutManager(new LinearLayoutManager(PlayerNewActivity.this, LinearLayoutManager.VERTICAL, false));
EpgDaysRecyclerViewAdapter epgDaysListAdapter = new EpgDaysRecyclerViewAdapter(PlayerNewActivity.this, epgHash, epgKey, epgRecyclerView);
daysRecyclerView.setAdapter(epgDaysListAdapter);
epgRecyclerView.setLayoutManager(new LinearLayoutManager(PlayerNewActivity.this, LinearLayoutManager.VERTICAL, false));
EpgDvrRecyclerViewAdapter epgListAdapter = new EpgDvrRecyclerViewAdapter(PlayerNewActivity.this, epgHash, epgKey, new SimpleDateFormat("EE", Locale.ENGLISH).format(date.getTime()));
epgRecyclerView.setAdapter(epgListAdapter);
daysRecyclerView.setLayoutManager(new LinearLayoutManagerWithSmoothScroller(PlayerNewActivity.this));
daysRecyclerView.smoothScrollToPosition(onEpgDaysPosition);
epgRecyclerView.setLayoutManager(new LinearLayoutManagerWithSmoothScroller(PlayerNewActivity.this));
epgRecyclerView.smoothScrollToPosition(onAirEpgPosition);
这是RecyclerViewAdapter
public class EpgDvrRecyclerViewAdapter extends RecyclerView.Adapter<EpgDvrRecyclerViewAdapter.ViewHolder> {
private Context context;
private HashMap<String, ArrayList<Epg>> epgHash;
private ArrayList<String> epgKey;
private ArrayList<Epg> individualDayEpg;
private String key;
public EpgDvrRecyclerViewAdapter(Context context,
HashMap<String, ArrayList<Epg>> epgHash, ArrayList<String> epgKey, String key) {
this.context = context;
this.epgHash = epgHash;
this.epgKey = epgKey;
this.key = key;
individualDayEpg = epgHash.get(key);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.epg_individual_dvr, null);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
Epg epg = individualDayEpg.get(position);
holder.programName.setText(epg.getProgramName());
holder.programTime.setText(epg.getProgramStartTime() + " - " + epg.getProgramEndTime());
SimpleDateFormat sdf = new SimpleDateFormat("HHmm");
int s = Integer.parseInt(sdf.format(new Date()));
if (Integer.parseInt(epg.getProgramStartTime().replace(":", "")) <= s && s <= Integer.parseInt(epg.getProgramEndTime().replace(":", ""))) {
holder.epgRow.setSelected(true);
}
}
@Override
public int getItemCount() {
return individualDayEpg.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
View v;
private TextView programName, programTime;
private LinearLayout epgRow;
public ViewHolder(View itemView) {
super(itemView);
v = itemView;
epgRow = (LinearLayout) itemView.findViewById(R.id.epgRow);
programName = (TextView) itemView.findViewById(R.id.epgProgramName);
programTime = (TextView) itemView.findViewById(R.id.epgProgramTime);
}
}
}
发布于 2016-12-07 09:18:25
可以使用SparseBooleanArray保存当前选定的项。
在RecyclerView适配器类中执行以下操作:
// Initialize variable to hold the selected item.
SparseBooleanArray mSelectedItems = new SparseBooleanArray();
// When selecting an item, save it
mSelectedItems.put(your_item_position, true); // Set true when selected
// Then in your view binding, set based on the selection saved before
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
...
if(mSelectedItem.get(position)) {
// set as selected here
} else {
// set as not selected here.
// SparseBoolean always return false if we haven't add the value yet.
}
...
}
更新
如果您只想选择一个星期,则可以通过重置为假SparseBooleanArray中的所有数据来完成此操作,但当前选定的项位置除外。然后你需要打电话给notifyItemChanged(int position)
。
就像这样:
// Do this when you selecting an item:
// save it
mSelectedItems.put(your_item_position, true); // Set true when selected
// Then you reset the items check of the other items
final int checkedItemCount = mSelectedItems.size();
for (int i = 0; i < checkedItemCount; i++) {
int position = checkedItemPositions.keyAt(i); // item position in the list.
// reset position except the current selected item.
if (position != your_item_position) {
if (checkedItemPositions.get(position)) {
// Item is checked. Need to uncheck it.
mSelectedItems.put(position, false);
// notify the change to Adapter
notifyItemChanged(position);
}
}
}
https://stackoverflow.com/questions/41012371
复制相似问题