Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在RecyclerView中为自定义视图使用setter?_Java_Android_Android View_Android Recyclerview - Fatal编程技术网

Java 如何在RecyclerView中为自定义视图使用setter?

Java 如何在RecyclerView中为自定义视图使用setter?,java,android,android-view,android-recyclerview,Java,Android,Android View,Android Recyclerview,我有一个自定义视图,它有一个setHeadingString()方法来动态设置其标题。我在我的RecyclerView中添加了几个这样的视图,但是当我想对它们使用setHeadinString()时,标题不会出现在应用程序中 为了检查setHeadinString()方法是否有效,我只需在布局中添加一个新视图(通过XML和代码),并在其上使用此方法。成功了 我的自定义视图名为AccordionView(AccordionItem是我使用的另一个视图,但请不要注意) 这是我的适配器: public

我有一个自定义视图,它有一个
setHeadingString()
方法来动态设置其标题。我在我的RecyclerView中添加了几个这样的视图,但是当我想对它们使用
setHeadinString()
时,标题不会出现在应用程序中

为了检查
setHeadinString()
方法是否有效,我只需在布局中添加一个新视图(通过XML和代码),并在其上使用此方法。成功了
我的自定义视图名为AccordionView(AccordionItem是我使用的另一个视图,但请不要注意)

这是我的适配器:

public class AllWorksAdapter extends RecyclerView.Adapter<AllWorksAdapter.ViewHolder> {

    private List<AccordionView> items;
    RecyclerView.RecycledViewPool viewPool;
    Context mContext;

    public AllWorksAdapter(List<AccordionView> dataset, Context context) {
        items = dataset;
        viewPool = new RecyclerView.RecycledViewPool();
        mContext = context;
    }

    public AllWorksAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
        View accordion = inflater.inflate(R.layout.item_accordion, parent, false);
        ViewHolder viewHolder = new ViewHolder(accordion);
        viewHolder.recyclerView.setRecycledViewPool(viewPool);



        return viewHolder;
    }

    @Override
    public void onBindViewHolder(AllWorksAdapter.ViewHolder viewHolder, int position) {
        AccordionView accordion = items.get(position);
        AccordionView accordionView = viewHolder.accordionView;
        RecyclerView recyclerView = viewHolder.recyclerView;
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        AccordionView accordionView;
        RecyclerView recyclerView;
        TextView heading;

        ViewHolder(final View itemView) {
            super(itemView);

            accordionView = itemView.findViewById(R.id.accordionView);
            recyclerView = (RecyclerView) itemView.findViewById(R.id.recyclerView);
            heading = accordionView.findViewById(R.id.heading);
        }

    }
    public AccordionView getItem(int position) {
        return items.get(position);
    }
}

在AdapterOnBindViewHolder方法中,您需要填充自定义视图,并在那里调用“setHeadingString”方法。像

   @Override
public void onBindViewHolder(AllWorksAdapter.ViewHolder viewHolder, int position) {
    AccordionView accordion = new AccordionView()// initialization
    accordion.setHeadingString(items.get(position).getHeading());
}
最好使用自定义类模型作为项目列表,而不是自定义视图类型。像

 private List<YourModelClass> items;

传递给
适配器的
手风琴视图的
列表
不是您在屏幕上看到的列表。实际上,在
getItemCount()
中,该
列表基本上只用于其大小。您确实看到的
AccordionView
s是在
onCreateViewHolder()
中膨胀的视图。现在还不清楚您到底想实现什么,但这些是您需要调用的
setHeadingString()
的功能。是的,很抱歉。我们可能不需要那门课。我没有注意到这个问题,直到Asad Choudhary在下面指出,您的数据集是那些
AccordionView
s的
列表。他们的功劳。是的,谢谢。我已经完全忘记了RecyclerView的模型,因为一天前就开始使用它了。我设法确定了方向。
public class AccordionView extends RelativeLayout {
    View[] children;

    Boolean isExpanded = false;

    Boolean isAnimated = false;

    Boolean isPartitioned = false;

    String headingString;

    View partition;

    TextView heading;

    ImageView icon;

    RelativeLayout paragraph;

    int headingTextSize;

    ImageView dropdownImage;

    ImageView dropupImage;

    private LayoutInflater inflater;

    ConstraintLayout headingLayout;

    int paragraphTopMargin;

    int paragraphBottomMargin;

    // int paragraphHeight;

    int headingBackgroundColor = Color.WHITE;

    int paragraphBackgroundColor = Color.WHITE;

    Drawable headingBackground;

    Drawable paragraphBackground;

    AccordionOnExpansionCollapseListener listener;

    Context mContext;


    public AccordionView(Context context) {
        super(context);
        mContext = context;
        prepareLayoutWithoutChildren(context);
    }

    public AccordionView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        handleAttributeSet(context, attrs);
    }

    public AccordionView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mContext = context;
        handleAttributeSet(context, attrs);
    }

    private void handleAttributeSet(Context context, AttributeSet attrs) {
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AccordionView);

        isAnimated = a.getBoolean(R.styleable.AccordionView_isAnimated, false);
        isPartitioned = a.getBoolean(R.styleable.AccordionView_isPartitioned, false);
        headingString = a.getString(R.styleable.AccordionView_heading);
        isExpanded = a.getBoolean(R.styleable.AccordionView_isExpanded, false);
        headingTextSize = a.getDimensionPixelSize(R.styleable.AccordionView_headingTextSize, 20);
        headingBackgroundColor = a.getColor(R.styleable.AccordionView_headingBackgroundColor,Color.WHITE);
        paragraphBackgroundColor = a.getColor(R.styleable.AccordionView_bodyBackgroundColor,Color.WHITE);

        headingBackground = a.getDrawable(R.styleable.AccordionView_headingBackground);
        paragraphBackground = a.getDrawable(R.styleable.AccordionView_bodyBackground);
    }

    private void initializeViewWithoutChildren(Context context) {
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LinearLayout accordionLayout = (LinearLayout) inflater.inflate(R.layout.accordion, null);
        partition = accordionLayout.findViewById(R.id.partition);
        heading = (TextView) accordionLayout.findViewById(R.id.heading);
        paragraph = (RelativeLayout) accordionLayout.findViewById(R.id.paragraph_layout);
        dropdownImage = (ImageView) accordionLayout.findViewById(R.id.dropdown_image);
        dropupImage = (ImageView) accordionLayout.findViewById(R.id.dropup_image);
        headingLayout = accordionLayout.findViewById(R.id.heading_layout);
        icon = accordionLayout.findViewById(R.id.icon);
        paragraph.removeAllViews();
        removeAllViews();
        paragraphBottomMargin = ((LinearLayout.LayoutParams) paragraph.getLayoutParams()).bottomMargin;
        paragraphTopMargin = ((LinearLayout.LayoutParams) paragraph.getLayoutParams()).topMargin;
        addView(accordionLayout);

    }


    private void initializeViews(Context context) {

        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LinearLayout accordionLayout = (LinearLayout) inflater.inflate(R.layout.accordion, null);
        partition = accordionLayout.findViewById(R.id.partition);
        heading = (TextView) accordionLayout.findViewById(R.id.heading);
        paragraph = (RelativeLayout) accordionLayout.findViewById(R.id.paragraph_layout);
        dropdownImage = (ImageView) accordionLayout.findViewById(R.id.dropdown_image);
        dropupImage = (ImageView) accordionLayout.findViewById(R.id.dropup_image);
        headingLayout = accordionLayout.findViewById(R.id.heading_layout);
        icon = accordionLayout.findViewById(R.id.icon);
        paragraph.removeAllViews();

        int i;
        children = new View[getChildCount()];
        for (i = 0; i < getChildCount(); i++) {
            children[i] = getChildAt(i);
        }
        removeAllViews();
        for (i = 0; i < children.length; i++) {
            paragraph.addView(children[i]);
        }


        paragraphBottomMargin = ((LinearLayout.LayoutParams) paragraph.getLayoutParams()).bottomMargin;
        paragraphTopMargin = ((LinearLayout.LayoutParams) paragraph.getLayoutParams()).topMargin;

        addView(accordionLayout);


    }

    private void prepareLayout(Context context) {
        initializeViews(context);
        partition.setVisibility(isPartitioned ? VISIBLE : INVISIBLE);
        heading.setText(headingString);
        heading.setTextSize(headingTextSize);

        //Set the background on the heading...if the background drawable has been set by the user, use that. Else, set the background color
        if(!WidgetHelper.isNullOrBlank(headingBackground) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
            headingLayout.setBackground(headingBackground);
        else
            headingLayout.setBackgroundColor(headingBackgroundColor);

        //Set the background on the paragraph...if the background drawable has been set by the user, use that. Else, set the background color
        if(!WidgetHelper.isNullOrBlank(paragraphBackground) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
            paragraph.setBackground(paragraphBackground);
        else
            paragraph.setBackgroundColor(paragraphBackgroundColor);

        paragraph.setVisibility(VISIBLE);
        //paragraph.getViewTreeObserver().addOnGlobalLayoutListener(globalLayoutListener);
        if (isAnimated) {
            headingLayout.setLayoutTransition(new LayoutTransition());
        } else {
            headingLayout.setLayoutTransition(null);

        }

        if (isExpanded)
            expand();
        else
            collapse();

        setOnClickListenerOnHeading();
        setOnLongClickListenerOnHeading();

    }

    private void prepareLayoutWithoutChildren(Context context) {
        initializeViewWithoutChildren(context);
        partition.setVisibility(isPartitioned ? VISIBLE : INVISIBLE);
        heading.setText(headingString);
        paragraph.setVisibility(VISIBLE);
        //paragraph.getViewTreeObserver().addOnGlobalLayoutListener(globalLayoutListener);
        if (isAnimated) {
            headingLayout.setLayoutTransition(new LayoutTransition());
        } else {
            headingLayout.setLayoutTransition(null);

        }

        if (isExpanded)
            expand();
        else
            collapse();

        setOnClickListenerOnHeading();
        setOnLongClickListenerOnHeading();

    }

    protected void onFinishInflate() {
        prepareLayout(getContext());
        super.onFinishInflate();

    }

    private void expand() {
        if (isAnimated) {

            AccordionTransitionAnimation expandAnimation = new AccordionTransitionAnimation(paragraph, 300, AccordionTransitionAnimation.EXPAND);
            expandAnimation.setHeight(WidgetHelper.getFullHeight(paragraph));
            expandAnimation.setEndBottomMargin(paragraphBottomMargin);
            expandAnimation.setEndTopMargin(paragraphTopMargin);
            paragraph.startAnimation(expandAnimation);

        } else {
            paragraph.setVisibility(VISIBLE);
        }


        partition.setVisibility(isPartitioned ? VISIBLE : INVISIBLE);

        dropupImage.setVisibility(VISIBLE);
        dropdownImage.setVisibility(GONE);
        if(!WidgetHelper.isNullOrBlank(listener)) {
            listener.onExpanded(this);
        }


    }

    private void collapse() {

        if (isAnimated) {

            AccordionTransitionAnimation collapseAnimation = new AccordionTransitionAnimation(paragraph, 300, AccordionTransitionAnimation.COLLAPSE);
            paragraph.startAnimation(collapseAnimation);

        } else {
            paragraph.setVisibility(GONE);

        }

        partition.setVisibility(INVISIBLE);

        dropupImage.setVisibility(GONE);
        dropdownImage.setVisibility(VISIBLE);

        if(!WidgetHelper.isNullOrBlank(listener)) {
            listener.onCollapsed(this);
        }


    }

    private void setOnClickListenerOnHeading() {
        heading.setOnClickListener(toggleParagraphVisiblity);
        dropdownImage.setOnClickListener(toggleParagraphVisiblity);
        dropupImage.setOnClickListener(toggleParagraphVisiblity);
        icon.setOnClickListener(toggleParagraphVisiblity);
        headingLayout.setOnClickListener(toggleParagraphVisiblity);

    }

    OnClickListener toggleParagraphVisiblity = new OnClickListener() {
        @Override
        public void onClick(View view) {
            if (paragraph.getVisibility() == VISIBLE) {
                collapse();
            } else
                expand();
        }
    };

    private void setOnLongClickListenerOnHeading() {
        headingLayout.setOnLongClickListener(longClickListener);
        heading.setOnLongClickListener(longClickListener);
        dropdownImage.setOnLongClickListener(longClickListener);
        dropupImage.setOnLongClickListener(longClickListener);
        icon.setOnLongClickListener(longClickListener);
    }

    OnLongClickListener longClickListener = new OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            MainActivity mainActivity = (MainActivity) mContext;
            mainActivity.showActionsOnFileFragment(headingString, 2);
            return false;
        }
    };

    public void addViewToBody(View child) {
        paragraph.addView(child);
    }

    public void setHeadingString(String headingString) {
        this.headingString = headingString;
        heading.setText(headingString);
    }

    public Boolean getAnimated() {
        return isAnimated;
    }

    public void setAnimated(Boolean animated) {
        isAnimated = animated;
    }

    public void setOnExpandCollapseListener(AccordionOnExpansionCollapseListener listener) {
        this.listener = listener;
    }

    public RelativeLayout getBody() {
        return paragraph;
    }

    public RelativeLayout getParagraph() {
        return paragraph;
    }

    public Boolean getExpanded() {
        return isExpanded;
    }

    public void setExpanded(Boolean expanded) {
        isExpanded = expanded;
    }

    public Boolean getPartitioned() {
        return isPartitioned;
    }

    public String getHeadingString() { return headingString; }

    public void setPartitioned(Boolean partitioned) {
        isPartitioned = partitioned;
        partition.setVisibility(isPartitioned ? VISIBLE : INVISIBLE);
    }

    public void setHeadingBackGround(Drawable drawable) {

        if(WidgetHelper.isNullOrBlank(headingLayout))
            headingLayout = findViewById(R.id.heading_layout);


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            headingLayout.setBackground(drawable);
        }
    }

    public void setHeadingBackGround(int resId) {
        Drawable drawable = getResources().getDrawable(resId);

        if(WidgetHelper.isNullOrBlank(headingLayout))
            headingLayout = findViewById(R.id.heading_layout);


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            headingLayout.setBackground(drawable);
        }
    }

    public void setBodyBackGround(Drawable drawable) {

        if(WidgetHelper.isNullOrBlank(paragraph))
            paragraph = (RelativeLayout) findViewById(R.id.paragraph_layout);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            paragraph.setBackground(drawable);
        }
    }

    public void setBodyBackGround(int resId) {
        Drawable drawable = getResources().getDrawable(resId);

        if(WidgetHelper.isNullOrBlank(paragraph))
            paragraph = (RelativeLayout) findViewById(R.id.paragraph_layout);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            paragraph.setBackground(drawable);
        }
    }

    public void setHeadingBackGroundColor(int color) {

        if(WidgetHelper.isNullOrBlank(headingLayout))
            headingLayout = findViewById(R.id.heading_layout);
        headingLayout.setBackgroundColor(color);

    }

    public void setBodyBackGroundColor(int color) {

        if(WidgetHelper.isNullOrBlank(paragraph))
            paragraph = (RelativeLayout) findViewById(R.id.paragraph_layout);
        paragraph.setBackgroundColor(color);

    }

}
   @Override
public void onBindViewHolder(AllWorksAdapter.ViewHolder viewHolder, int position) {
    AccordionView accordion = new AccordionView()// initialization
    accordion.setHeadingString(items.get(position).getHeading());
}
 private List<YourModelClass> items;
 adapter.notifyDataSetChanged();