android - 具有多种视图类型的 Recyclerview
问题描述
我正在尝试使用四种视图类型制作recyclerview,每种视图类型将代表某些数据,我的应用程序适用于英超联赛(足球),所以我有目标,黄牌和红牌的视图类型,每个字符串都带有得分时间目标,或者得到黄牌和红牌,我正在尝试应用一些逻辑,但它对我不起作用
第一:这就是我想要实现的 图像,显示目标和卡片在它们发生时是如何排序的
其次,这是我试图实现的代码:
//Splitting Strings
String[] homeg = hometiming.split(";");
String[] homeyello = homeyellow.split(";");
String[] homere = homered.split(";");
for (String h : homeg) {
if (!h.equals("")) {
int subgoals = Integer.parseInt(h.substring(0, 1));
for (String y : homeyello) {
if (!y.equals("")) {
int subYellow = Integer.parseInt(y.substring(0, 1));
for (String n : homere) {
if (!n.equals("")) {
int subRed = Integer.parseInt(n.substring(0, 1));
/// if goals time is smaller than time of yellow and rec card , show
/// goals
if (subgoals < subYellow && subgoals < subRed) {
GoalsItem goalsItem = new GoalsItem();
goalsItem.setHomegoals("goals :" + h + "\n");
consolidatedlist.add(goalsItem);
}
/// if yellow cards time is smaller than time of goals and red cards ,
/// show yellow cards
else if (subYellow < subgoals && subYellow < subRed) {
YellowItems yellowItems = new YellowItems();
yellowItems.setHomeyellow("yellow :" + y + "\n");
consolidatedlist.add(yellowItems);
}
/// if red card time is smaller than time of goals and yellow cards ,
/// show red cards
else if (subRed < subgoals && subRed < subYellow) {
RedItems redItems = new RedItems();
redItems.setHomered("red : " + n + "\n");
consolidatedlist.add(redItems);
} } } } } } }
- 第三:这是我在 bindviewholder 上的适配器
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
switch (holder.getItemViewType()) {
case TypeItem.TYPE_PHOTO:
PhotoItem photoItem = (PhotoItem) list.get(position);
ViewPhoto viewphoto = (ViewPhoto) holder;
viewphoto.date.setText("" + photoItem.getDate());
Picasso.with(context).load(photoItem.getPhoto()).fit().into(((ViewPhoto) holder).photo);
break;
case TypeItem.TYPE_Goals:
GoalsItem goalsItem = (GoalsItem) list.get(position);
ViewGoals viewgoals = (ViewGoals) holder;
viewgoals.homegoals.setText("" + goalsItem.getHomegoals());
viewgoals.awaygoals.setText("" + goalsItem.getAwaygoals());
break;
case TypeItem.TYPE_Yellow:
YellowItems yellowItems = (YellowItems) list.get(position);
ViewYellow viewyellow = (ViewYellow) holder;
viewyellow.homeyellow.setText("" + yellowItems.getHomeyellow());
viewyellow.awayyellow.setText("" + yellowItems.getAwayyellow());
break;
case TypeItem.TYPE_RED:
RedItems redItems = (RedItems) list.get(position);
ViewRed viewred = (ViewRed) holder;
viewred.homered.setText("" + redItems.getHomered());
viewred.awayred.setText("" +redItems.getAwayred());
break;
}
}
- 这是我用于更多说明的 json 示例
"strHomeGoalDetails":"",
"strHomeRedCards":"",
"strHomeYellowCards":"13':Luka Milivojevic;",
"strAwayRedCards":"",
"strAwayYellowCards":"47':Raheem Sterling;",
"strAwayGoalDetails":"39':Gabriel Jesus;41':David Silva;",
解决方案
你必须override getItemViewType(position: Int)
,而不是通过不同viewType
的onCreatecreate
回报ViewHolders
(如果你需要),而不是onBindViewHolder
你的类型绑定
例如,在您的适配器类中,使用typeField: String
, 和key: Int
private val keyMap = HashMap<String, Int>().apply {
put("FIRST_TYPE", 1)
put("SECOND_TYPE", 2)
put("THIRD_TYPE", 3)
}
第二步是覆盖getItemViewType(position: Int)
override fun getItemViewType(position: Int): Int {
return keyMap.get(yourItemList(position).getType())
第三步——override onCreateViewHolder
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ResourceViewHolder {
return when (viewType) {
keyMap.get("FIRST_TYPE") -> //create specific ViewHolder
keyMap.get("SECOND_TYPE") -> //create specific ViewHolder
//etc
}
最后一部分是绑定onBindViewHolder
你可以这样做onCreateViewHolder
推荐阅读
- r - 将xml格式转换为r中的数据框
- c# - DefaultHttpContext 在集成测试中测试身份验证
- c - 在 c 中使用套接字读取和显示内容
- python - 我如何在 Bokeh 中两次放置相同的 x 轴
- javascript - 在打印窗口中打开 Blob 文件
- firebase - 如何检查用户是否验证邮件然后让登录?
- azure - Azure SQL 权限:如何允许使用 Query Performance Insight,但不更改定价层等设置?
- windows - 尝试更新 Windows 中另一个文件夹中文件的文件时间/日期
- r - Kmeans 以 group_by 为中心并汇总管道
- asp.net - 获取以下 HTTP 错误 500.19 和错误代码:0x80070021