在回收站视图中使用不同对象的最佳方法是什么?

时间:2015-09-30 15:24:10

标签: android gson

我的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,这会影响性能。

有人有更好的解决方法吗?

感谢您的时间

2 个答案:

答案 0 :(得分:2)

您不需要创建多个RecyclerView.Adapter。 RecyclerView和ListView可以使用@Override getItemViewType(int position)执行相同的操作。

请参阅documentation here.

在你的适配器中:
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....
}