android - 一个 fragment 中的多个 RecyclerView

标签 android android-fragments android-recyclerview

我有一个具有以下设计的 fragment 需要帮助来实现这一点。

MainFragment

试图将其作为标题放入适配器中,但没有成功。

我的适配器

public class FeedListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements GetJSONListener {
private final int VIEW_TYPE_ITEM = 0;
private final int VIEW_TYPE_LOADING = 1;
private final int VIEW_TYPE_HEADER = 2;
private List<FeedItem> feedItems;
private Context mContext;
private CallWSTask callWSTask;
private View VaultsHeader;
private ArrayList<String> userVaults;
private MyVaultsAdapter vaultsAdapter;
private List<VaultsPojo> vaultsPojo;


// Provide a suitable constructor (depends on the kind of dataset)
public FeedListAdapter(Context context, List<FeedItem> feedItems, View header) {
    this.feedItems = feedItems;
    mContext = context;
    if(!header.equals(null)){
        this.VaultsHeader = header;
    }



}
public boolean isHeader(int position) {
    return position == 0;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.feed_note, null);


    if (viewType == VIEW_TYPE_ITEM) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.feed_note, parent, false);
        return new FeedListViewHolder(view);

    } else if (viewType == VIEW_TYPE_LOADING) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.layout_loading_item, parent, false);
        return new LoadingViewHolder(view);
    }else if(viewType == VIEW_TYPE_HEADER){
        View view = LayoutInflater.from(mContext).inflate(R.layout.vaults_header_view, parent, false);
        return new HeaderViewHolder(view);
    }
    return null;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof FeedListViewHolder) {
        final FeedItem feedItem = feedItems.get(position);
        FeedListViewHolder feedListViewHolder = (FeedListViewHolder) holder;

        feedListViewHolder.display_name_tv.setText(feedItem.getUserDisp().getFirstName() + " " + feedItem.getUserDisp().getLastName());
        feedListViewHolder.display_name_tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(mContext, UserProfileActivity.class);
                i.putExtra("userid", feedItem.getUserId());
                mContext.startActivity(i);
            }
        });
        CharSequence timeAgo = DateUtils.getRelativeTimeSpanString(
                Long.parseLong(feedItem.getCreateDate()),
                System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS);
        feedListViewHolder.timestamp_tv.setText(timeAgo);
        feedListViewHolder.abbreviationtxt.setText("Ma");
        Picasso.with(mContext).load(mContext.getString(R.string.ENVIRONMENT1) + feedItem.getUserDisp().getProfilepicName())
                .into(feedListViewHolder.user_iv);
        Picasso.with(mContext).load(SharedPreferenceUtils.getProfilePic(mContext)).into(((FeedListViewHolder) holder).comment_user_iv);

        feedListViewHolder.like_count.setText(feedItem.getFavoriteCount() + "");
        feedListViewHolder.comment_count.setText(feedItem.getCommentCount() + "");
        feedListViewHolder.share_count.setText(feedItem.getShareCount() + "");

        if (feedItem.isLike()) {
            feedListViewHolder.like_empty_iv.setImageDrawable(mContext.getDrawable(R.drawable.ic_action_helpful_selected));
        } else {
            feedListViewHolder.like_empty_iv.setImageDrawable(mContext.getDrawable(R.drawable.ic_action_helpful));
        }


        feedListViewHolder.like_empty_iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(mContext, "Liked!", Toast.LENGTH_LONG).show();

            }
        });
        feedListViewHolder.comment_iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(mContext, "coment!", Toast.LENGTH_LONG).show();

            }
        });
        feedListViewHolder.share_iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(mContext, "shared!", Toast.LENGTH_LONG).show();

            }
        });
        if (feedItem.getFeedType().equals("Note")) {
            feedListViewHolder.FeedNote.setVisibility(View.VISIBLE);
            feedListViewHolder.FeedAskQuestion.setVisibility(View.GONE);
            feedListViewHolder.FedMcq.setVisibility(View.GONE);
            feedListViewHolder.FeedEmbedYouTube.setVisibility(View.GONE);
            feedListViewHolder.FeedEmbedWeb.setVisibility(View.GONE);
            feedListViewHolder.embed_disp_tv.setText(Html.fromHtml(feedItem.getNotedisp().getNoteContent()));

            if (feedItem.getNotedisp().getAttachment().toString() != "[]") {

                if (feedItem.getNoteDisp().getAttachment().size() == 1) {
                    if (feedItem.getNoteDisp().getAttachment().get(0).isImage()) {
                        feedListViewHolder.note_post_iv01.setVisibility(View.VISIBLE);
                        feedListViewHolder.gridView.setVisibility(View.GONE);
                        Picasso.with(mContext)
                                .load(mContext.getString(R.string.ENVIRONMENT1) + "/MediaImages/Medium/" + feedItem.getNoteDisp().getAttachment().get(0).getFileName())
                                .into(feedListViewHolder.note_post_iv01);

                        Log.v("one image",mContext.getString(R.string.ENVIRONMENT1) + "/MediaImages/Medium/" + feedItem.getNoteDisp().getAttachment().get(0).getFileName());

                    } else if (feedItem.getNoteDisp().getAttachment().get(0).isVideo()) {

                    }

                }else if(feedItem.getNoteDisp().getAttachment().size() > 1){
                    feedListViewHolder.gridView.setVisibility(View.VISIBLE);
                    feedListViewHolder.note_post_iv01.setVisibility(View.GONE);
                    FeedNoteAttachmentAdapter attachmentAdapter = new FeedNoteAttachmentAdapter(mContext, feedItem.getNoteDisp().getAttachment());
                    feedListViewHolder.gridView.setAdapter(attachmentAdapter);
                    feedListViewHolder.gridView.autoresize();

                }


            }else{
                feedListViewHolder.gridView.setVisibility(View.GONE);
                feedListViewHolder.note_post_iv01.setVisibility(View.GONE);
            }
        } else if (feedItem.getFeedType().equals("Embed")) {


            if (feedItem.getEmbed().getEmbedType().equals("youtube")) {
                feedListViewHolder.FeedNote.setVisibility(View.GONE);
                feedListViewHolder.FeedAskQuestion.setVisibility(View.GONE);
                feedListViewHolder.FedMcq.setVisibility(View.GONE);
                feedListViewHolder.FeedEmbedWeb.setVisibility(View.GONE);
                feedListViewHolder.FeedEmbedYouTube.setVisibility(View.VISIBLE);
                feedListViewHolder.btnplay.setVisibility(View.VISIBLE);
                ((FeedListViewHolder) holder).youtube_title.setText(Html.fromHtml(feedItem.getEmbed().getEmbedTitle()));
                ((FeedListViewHolder) holder).youtube_disp.setText(Html.fromHtml(feedItem.getEmbed().getEmbedDescription()));
                Picasso.with(mContext).load(feedItem.getEmbed().getEmbedImageUrl())
                        .into(feedListViewHolder.youtube_post_iv);

            } else {
                feedListViewHolder.FeedNote.setVisibility(View.GONE);
                feedListViewHolder.FeedAskQuestion.setVisibility(View.GONE);
                feedListViewHolder.FedMcq.setVisibility(View.GONE);
                feedListViewHolder.FeedEmbedYouTube.setVisibility(View.GONE);
                feedListViewHolder.FeedEmbedWeb.setVisibility(View.VISIBLE);
                ((FeedListViewHolder) holder).embed_title.setText(Html.fromHtml(feedItem.getEmbed().getEmbedTitle()));
                ((FeedListViewHolder) holder).embed_disp.setText(Html.fromHtml(feedItem.getEmbed().getEmbedDescription()));

                if ((feedItem.getEmbed().getEmbedImageUrl() != null) && (feedItem.getEmbed().getEmbedImageUrl().length() > 0) && (!feedItem.getEmbed().getEmbedImageUrl().equals("null"))) {
                    feedListViewHolder.embed_image.setVisibility(View.VISIBLE);
                    Picasso.with(mContext).load(feedItem.getEmbed().getEmbedImageUrl())
                            .into(feedListViewHolder.embed_image);
                } else {
                    feedListViewHolder.embed_image.setVisibility(View.GONE);
                }

            } //youTubeView.setVisibility(View.GONE);


        } else if (feedItem.getFeedType().equals("AskQuestion")) {
            feedListViewHolder.FeedNote.setVisibility(View.GONE);
            feedListViewHolder.FeedAskQuestion.setVisibility(View.VISIBLE);
            feedListViewHolder.FedMcq.setVisibility(View.GONE);
            feedListViewHolder.FeedEmbedYouTube.setVisibility(View.GONE);
            feedListViewHolder.FeedEmbedWeb.setVisibility(View.GONE);
            feedListViewHolder.question_txt.setText(Html.fromHtml(feedItem.getAskQuestions().getQuestionText()));
        } else if (feedItem.getFeedType().equals("MCQ")) {
            feedListViewHolder.FeedNote.setVisibility(View.GONE);
            feedListViewHolder.FeedAskQuestion.setVisibility(View.GONE);
            feedListViewHolder.FedMcq.setVisibility(View.VISIBLE);
            feedListViewHolder.FeedEmbedYouTube.setVisibility(View.GONE);
            feedListViewHolder.FeedEmbedWeb.setVisibility(View.GONE);
            feedListViewHolder.mcq_question.setText(Html.fromHtml(feedItem.getMCQ().getQuestion()));

            Typeface ubantulight = Typeface.createFromAsset(mContext.getAssets(), "fonts/Ubuntu-L.ttf");
            feedListViewHolder.radioButton01.setTypeface(ubantulight);
            feedListViewHolder.radioButton02.setTypeface(ubantulight);
            feedListViewHolder.radioButton03.setTypeface(ubantulight);
            feedListViewHolder.radioButton04.setTypeface(ubantulight);


            if (feedItem.getMCQ().getAnswer().size() == 4) {
                feedListViewHolder.radioButton01.setText(feedItems.get(position).getMCQ().getAnswer().get(0).getAnswerText());
                feedListViewHolder.radioButton02.setText(feedItems.get(position).getMCQ().getAnswer().get(1).getAnswerText());
                feedListViewHolder.radioButton03.setText(feedItems.get(position).getMCQ().getAnswer().get(2).getAnswerText());
                feedListViewHolder.radioButton04.setText(feedItems.get(position).getMCQ().getAnswer().get(3).getAnswerText());
                // viewHolder = (ViewHolder) convertView.getTag();
            } else if (feedItem.getMCQ().getAnswer().size() == 3) {
                feedListViewHolder.radioButton04.setVisibility(View.GONE);
                feedListViewHolder.radioButton03.setText(feedItems.get(position).getMCQ().getAnswer().get(2).getAnswerText());
                feedListViewHolder.radioButton01.setText(feedItems.get(position).getMCQ().getAnswer().get(0).getAnswerText());
                feedListViewHolder.radioButton02.setText(feedItems.get(position).getMCQ().getAnswer().get(1).getAnswerText());
                // viewHolder = (ViewHolder) convertView.getTag();
            } else if (feedItem.getMCQ().getAnswer().size() == 2) {
                feedListViewHolder.radioButton01.setText(feedItems.get(position).getMCQ().getAnswer().get(0).getAnswerText());
                feedListViewHolder.radioButton02.setText(feedItems.get(position).getMCQ().getAnswer().get(1).getAnswerText());
                feedListViewHolder.radioButton03.setVisibility(View.GONE);
                feedListViewHolder.radioButton04.setVisibility(View.GONE);
                // viewHolder = (ViewHolder) convertView.getTag();
            } else {
                feedListViewHolder.radioButton01.setVisibility(View.GONE);
                feedListViewHolder.radioButton02.setVisibility(View.GONE);
                feedListViewHolder.radioButton03.setVisibility(View.GONE);
                feedListViewHolder.radioButton04.setVisibility(View.GONE);
                //viewHolder = (ViewHolder) convertView.getTag();
            }

        }

        //this line is important
        feedListViewHolder.itemView.setTag(feedItems.get(position));
        //setAnimation(feedListViewHolder.mainlinear_feed,position);
    } else if (holder instanceof LoadingViewHolder) {
        LoadingViewHolder loadingViewHolder = (LoadingViewHolder) holder;

        if (!Utilities.Isconnetcted(mContext) && position >= 30) {
            loadingViewHolder.errormsg.setVisibility(View.VISIBLE);
        } else {
            loadingViewHolder.progressBar.setVisibility(View.VISIBLE);
            loadingViewHolder.progressBar.setIndeterminate(true);
        }
    }else if (holder instanceof HeaderViewHolder){
        HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder;


        userVaults = SharedPreferenceUtils.getUserVaults(mContext);

        //String vaultsjsonstring = new Gson().toJson(userVaults);
        vaultsPojo = ResponseParser.parsevaultsJson(userVaults.toString());

        vaultsAdapter = new MyVaultsAdapter(mContext,vaultsPojo);
        headerViewHolder.vaultsRecyclerView.setLayoutManager(new GridLayoutManager(mContext,2));
        headerViewHolder.vaultsRecyclerView.setAdapter(vaultsAdapter);

    }


}

@Override
public int getItemCount() {
    return feedItems == null ? 0 : feedItems.size();
}

@Override
public void onRemoteCallComplete(String jsonFromWSCall) {

}

public void addFeedItem(List<FeedItem> feedItems) {
    //this.feedItems.add(position,feedItems);

    this.feedItems.addAll(feedItems);
    //notifyDataSetChanged();

}

public String getLastFeedId() {
    if (!this.feedItems.isEmpty()) {
        return this.feedItems.get(this.feedItems.size() - 2).getFeedId();
    } else {
        return null;
    }
}


@Override
public int getItemViewType(int position) {
    if(isHeader(position)){
        return VIEW_TYPE_HEADER;
    }else {
        return feedItems.get(position) == null ? VIEW_TYPE_LOADING : VIEW_TYPE_ITEM;
    }

}


static class LoadingViewHolder extends RecyclerView.ViewHolder {
    public ProgressBar progressBar;
    public TextView errormsg;

    public LoadingViewHolder(View itemView) {
        super(itemView);
        progressBar = (ProgressBar) itemView.findViewById(R.id.progressBar1);
        errormsg = (TextView) itemView.findViewById(R.id.errormsg);
    }
}
static class HeaderViewHolder extends RecyclerView.ViewHolder {
    public RecyclerView vaultsRecyclerView;


    public HeaderViewHolder(View itemView) {
        super(itemView);
        vaultsRecyclerView = (RecyclerView) itemView.findViewById(R.id.my_Vaults_recycler_view);

    }
}}

尝试库 RvJoiner

我试图在同一个 xml 中实现两个回收器 View ,一个在另一个下面,但只有一个出现而另一个没有出现。如果您能将我链接到一些教程,那就太好了。

最佳答案

无需将两个 RecyclerView 合并为一个,您可以只定义一个具有两种不同 View 类型的 RecyclerView(因此是一个适配器)并播放使用 GridLayoutManager,以便元素可以根据其类型填充不同数量的列。

Here在 GitHub 上,我有一个实现完全符合您的要求。

我在下面为您提供了一些关于代码的细节和要强调的主要内容:

  • 在您的模型中定义两种不同的项目类型,一种用于网格部分,另一种用于列表部分。它们都应该扩展同一个抽象类。当然,您可以添加渲染项目所需的所有参数。在这个简单的例子中,我只是在每个元素中使用了一个标签。

    public abstract class AbstractItem {
    
        public static final int GRID_TYPE = 0;
        public static final int LIST_TYPE = 1;
    
        private String label;
    
        public AbstractItem(String label) {
            this.label = label;
        }
    
        // getters and setters here
    
        abstract public int getType();
    
    }
    
    public class GridItem extends AbstractItem {
    
        public GridItem(String label) {
            super(label);
        }
    
        @Override
        public int getType() {
            return GRID_TYPE;
        }
    
    }
    
    public class ListItem extends AbstractItem {
    
        public ListItem(String label) {
            super(label);
        }
    
        @Override
        public int getType() {
            return LIST_TYPE;
        }
    
    }
    
  • 在您的 Activity 中,使用 GridLayoutManager 实现您需要的行为来初始化 RecyclerView。特别是,您的网格将有 2 列。 GridItem 元素将只占用一列,而 ListItem 元素将占用 2 列(因此它们将使用等于 2 的 colspan)。您可以使用方法 setSpanSizeLookup 获得此结果,如下所示:

    GridLayoutManager manager = new GridLayoutManager(this, 2);
    manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            AbstractItem item = mItems.get(position);
            switch (item.getType()) {
                case AbstractItem.GRID_TYPE:
                    // grid items to take 1 column
                    return 1;
                default:
                    // list items to take 2 columns
                    return 2;
            }
        }
    }); 
    

这是我得到的最终结果:

enter image description here

希望这对您有所帮助。

关于android - 一个 fragment 中的多个 RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35194661/

相关文章:

java.lang.NoClassDefFoundError : org. apache.commons.lang.StringEscapeUtils

android - 了解 LiveData 和数据绑定(bind)

java - View 分页器的 fragment 需要从主要 Activity 中进行编程

android - 如何在没有 fragment 的情况下使我的应用程序适应平板电脑

java - 如何刷新 recyclerview 的上一个项目行 View 的 View

java - 如何使用类 - 蓝牙线程

android - Intent 启动 Activity 后会调用哪个方法?

Android 对话框在后台任务运行时不显示

java - RecyclerView 在 DrawerLayout 关闭时获得焦点

android - 通过 recyclerview 的 onClick 传递 Intent