【问题标题】:How to change Layout in OncreateViewHolder in Recyclerview.ViewHolder如何在 Recyclerview.ViewHolder 中更改 OncreateViewHolder 中的布局
【发布时间】:2017-02-06 15:19:12
【问题描述】:

我在 Recyclerview 中使用分页。我在 RecyclerView.ViewHolder 中使用了两种布局。我想从另一个类更改按钮单击的布局。

public class PollListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    private List<PollList> pollLists;
    RecyclerView mrecyclerView;
    private int VIEW_TYPE_ITEM = 0;
    private int VIEW_TYPE_LOADING = 1;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView question, description, createdTime, closedTime;

        public MyViewHolder(View view) {
            super(view);
            question = (TextView) view.findViewById(R.id.questionPoll);
            description = (TextView) view.findViewById(R.id.descriptionPoll);
           }
    }

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

        public LoadingViewHolder(View itemView) {
            super(itemView);
            progressBar = (ProgressBar) itemView.findViewById(R.id.progressBar1);
        }
    }

    public PollListAdapter(List<PollList> pollLists, RecyclerView recyclerView, Context con){
        this.pollLists = pollLists;
        this.mrecyclerView = recyclerView;
        this.con = con;
        mrecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
                totalItemCount = linearLayoutManager.getItemCount();
                lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
                if (NewsFragment.nextPageURL != null) {
                if (!isLoading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                    if (mOnLoadMoreListener != null) {
                        mOnLoadMoreListener.onLoadMore();
                    }
                    isLoading = true;
                }
                }
            }
        });

    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == VIEW_TYPE_ITEM) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.poll_row, parent, false);
        return new MyViewHolder(itemView);
        } else if (viewType == VIEW_TYPE_LOADING) {
            View view = LayoutInflater.from(con).inflate(R.layout.layout_loading_item, parent, false);
            return new LoadingViewHolder(view);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof MyViewHolder) {
            PollList poll_list = pollLists.get(position);
            MyViewHolder viewHolder = (MyViewHolder) holder;
            viewHolder.question.setText(poll_list.getTitle());
            viewHolder.description.setText(poll_list.getDescription());
            viewHolder.createdTime.setText(poll_list.getCreatedAt());
        } else if (holder instanceof LoadingViewHolder){
            LoadingViewHolder loadingViewHolder = (LoadingViewHolder) holder;
            loadingViewHolder.progressBar.setIndeterminate(true);
        }
    }

    @Override
    public int getItemViewType(int position) {
        return pollLists.get(position) == null ? VIEW_TYPE_LOADING : VIEW_TYPE_ITEM;
    }

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

    public void setLoaded() {
        isLoading = false;
    }

    public void setOnLoadMoreListener(OnLoadMoreListener mOnLoadMoreListener) {
        this.mOnLoadMoreListener = mOnLoadMoreListener;
    }

}

上面的适配器显示了多个布局视图及其条件

按钮点击
这是按钮单击的代码

createGroupButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 groupName.setText("");
                 groupStatus.clearCheck();
                 groupVisibility.clearCheck();
                 finish();
                 GroupFragment.groupvalues.clear();
                 GroupFragment.GroupData groupDataRefresh = new GroupFragment.GroupData();
                 groupDataRefresh.execute();
            }
        });

【问题讨论】:

  • 点击的按钮是在recyclerview还是在单独的view中?
  • 不在 Recyclerview 中。它在单独的视图中
  • 在您的适配器中创建一个公共变量,将视图类型存储为VIEW_TYPE_LOADINGVIEW_TYPE_ITEM,并在您想要的任何位置单击按钮进行更改。
  • 你应该在适配器内部创建方法,并从你的主类中调用它 adapter.method。不能给你更多信息,因为你没有提供 Reyclerview 适配器的完整实现
  • 我想在按钮点击时选择我想要的布局。

标签: android pagination android-recyclerview


【解决方案1】:

如果我理解正确,如果List 元素为空,则显示加载。因此,要更改元素,只需在该位置更改您的 List 并更新 recyclerView 适配器。

在 Adapter 类中创建公共方法

public void changeLoading(int position, PollList item){

     pollLists.set(index, item);
     notifyItemChanged(index);
}

OnClick内部调用这个方法

createGroupButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             groupName.setText("");
             groupStatus.clearCheck();
             groupVisibility.clearCheck();
             finish();
             GroupFragment.groupvalues.clear();
             GroupFragment.GroupData groupDataRefresh = new GroupFragment.GroupData();
             groupDataRefresh.execute();

             adapter.changeLoading(itemPosition, item);
        }
    });

【讨论】:

    【解决方案2】:

    在你的适配器类中创建一个变量

    public int VIEW_TYPE = VIEW_TYPE_LOADING;

    将适配器中的两个视图类型变量设为公共静态变量。

    public static final int VIEW_TYPE_ITEM = 0; public static final int VIEW_TYPE_LOADING = 1;

    在你的适配器中创建一个方法

    public void changeLayout(int viewType)
    {
        this.VIEW_TYPE = viewType;
        notifyDatasetChanged();
    }
    

    您的OnClickListener() 将是

    createGroupButton.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v) {
        groupName.setText("");
        groupStatus.clearCheck();
        groupVisibility.clearCheck();
        finish();
        GroupFragment.groupvalues.clear();
        GroupFragment.GroupData groupDataRefresh = new     GroupFragment.GroupData();
        groupDataRefresh.execute();
    
        //change layout here
        pollListAdapter.changeLayout(PollListAdapter.VIEW_TYPE_ITEM)
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2020-08-16
      • 2017-07-30
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多