首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在RecyclerView上选择单个项目和跟踪项目的位置?

无法在RecyclerView上选择单个项目和跟踪项目的位置?
EN

Stack Overflow用户
提问于 2016-12-07 08:14:28
回答 2查看 1.6K关注 0票数 0

我希望选择并高亮显示recyclerview的行,并在单击日期时显示当前时间。我可以在单击星期数上显示行。但不能高亮显示或setBackground到具有当前时间的行。一旦我将positiononBindHolder()方法中的位置进行比较,行数就是highlighted

请帮我一把。谢谢

这一行代码setAdapter()和平滑滚动到当前的时间位置:

代码语言:javascript
运行
复制
    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

代码语言:javascript
运行
复制
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);

    }
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-07 09:18:25

可以使用SparseBooleanArray保存当前选定的项。

在RecyclerView适配器类中执行以下操作:

代码语言:javascript
运行
复制
// 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)

就像这样:

代码语言:javascript
运行
复制
// 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);
    }
  }
}
票数 3
EN

Stack Overflow用户

发布于 2016-12-07 08:39:21

如下所示,在可绘制文件夹中创建选择器,并将其设置为行的LinearLayout的背景:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="false" 
          android:drawable="@android:color/transparent" />
    <item android:state_selected="true"  
          android:drawable="@android:color/background_dark" />
</selector>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41012371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档