我的recycler view
使用youtube API
库从GSON
获取数据列表。在一个网址中,返回的JSON
为:
items: [
{
kind: "youtube#playlist",
etag: ""tag/abc"",
id: "id",
请注意,id字段是String
问题是,其他网址返回:
items: [
{
kind: "youtube#searchResult",
etag: ""etag/abc"",
id: {
kind: "youtube#playlist",
playlistId: "id"
},
ID变为Class
。
最简单的方法是为GSON
创建不同的adapter
模型和不同的recycler view
。但是,我们需要多次调用setAdapter
,这会影响性能。
有人有更好的解决方法吗?
感谢您的时间
答案 0 :(得分:2)
您不需要创建多个RecyclerView.Adapter
。
RecyclerView和ListView可以使用@Override
getItemViewType(int position)
执行相同的操作。
在你的适配器中:
1. @Override
getItemViewType(int position)
。
您将返回表示视图类型的最终静态int(如1或0)
2.在onCreateViewHolder(ViewGroup parent, int viewType)
中将正确的视图扩展为viewType
3.在onBindViewHolder
管理您的对象类型。
扩展示例:
public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.ViewHolder> {
public static final int VIEW_TYPE_NORMAL = 0;
public static final int VIEW_TYPE_FOOTER = 1;
private LinkedList<Message> mDataSet = new LinkedList<>();
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v;
// We assume we have the same ViewHolder, but you will prefer to use two different viewHolder as it make more sense
if (viewType == VIEW_TYPE_FOOTER) {
v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_message_footer, parent, false);
} else {
v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_message, parent, false);
}
return new ViewHolder(v);
}
@Override
public int getItemViewType(int position) {
// Define here the rule to change the view type according the position and your data
return (position == mDataSet.size()) ? VIEW_TYPE_FOOTER : VIEW_TYPE_NORMAL;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// Check the position or the instance of holder and change the view data
}
}
答案 1 :(得分:2)
嗯,首先,它看起来像Youtube搜索结果包含Youtube播放列表项目列表。所以我只是从搜索结果中取出播放列表项并使用它们。
我认为最简单的方法是不要有两个不同的对象,但有一个对象是RecyclerView.Adapter
理解的界面。大多数列表都有基本信息,因此没有理由将信息源联系起来。所以在这种情况下,
public interface AdapterInterface {
public String getTitle();
public String getDescription();
}
然后,您可以创建任何您想要的任何类型数据支持的对象,并指定哪种数据是“标题”和“描述”。
public class YoutubeObject1 implements AdapterInterface {
private final class YoutubePlaylistObject mObject;
public YoutubeObject1(YoutubePlalistObject object) {
mObject = object;
}
@Override
public String getTitle() {
return mObject.getTitle();
}
@Override
public String getDescription() {
return mObject.getId();
}
}
然后,对于您的RecyclerView.Adapter,您只需使用界面
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
private final ArrayList<AdapterInterface> mItems;
public MyAdapter() {
mItems = new ArrayList<AdapterInterface>();
}
public void addItem(AdapterItem item) {
mItems.add(item);
}
... other methods....
}