简体   繁体   English

隐藏多个空文本视图

[英]Hide multiple empty textviews

I am am using a RecyclerView , with a CardView , that includes multiple TextView s. 我正在使用带有CardViewRecyclerView ,其中包括多个TextView Each card requires a different number of TextView s showing, therefore some will be empty and if empty it just shows a blank space on the card. 每张卡需要显示不同数量的TextView ,因此有些将为空,如果为空,则仅在卡上显示空白。

This is all performed in the adapter for the RecyclerView . 这全部在RecyclerView的适配器中执行。

For example: 例如:

Card 1: (id 1)
3 TextViews showing
Card 2: (id 2)
10 TextViews showing
Card 3: (id 3)
7 TextViews showing

I currently use an if else statement to determine which set of text it is, then it assigns the textviews, setting the text or hiding the view. 我目前使用if else语句确定它是哪组文本,然后它分配textviews,设置文本或隐藏视图。

I've tried to create a simple loop to just cycle through all the textviews and hide them if they are empty. 我试图创建一个简单的循环以循环浏览所有textview,如果它们为空则将其隐藏。 However, the way I tried, won't work as it's using a string as the TextView . 但是,我尝试的方法无法正常工作,因为它使用字符串作为TextView

Adapter Class: 适配器类别:

        .Adapter<SettingsAdapter
        .DataObjectHolder> {

    private ArrayList<DataObject> mDataset;
    Context context;

    public static class DataObjectHolder extends RecyclerView.ViewHolder {

        public DataObjectHolder(View itemView) {
            super(itemView);
            setting1 = (TextView) itemView.findViewById(R.id.textView);
            setting2 = (TextView) itemView.findViewById(R.id.textView2);
           //... assigning all the textviews
        }

    }

    public SettingsAdapter(ArrayList<DataObject> myDataset, Context context) {
        mDataset = myDataset;
        this.context = context;
    }

    @Override
    public DataObjectHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.settings_card_view, parent, false);
        DataObjectHolder dataObjectHolder = new DataObjectHolder(view);
        return dataObjectHolder;
    }

    @Override
    public void onBindViewHolder(DataObjectHolder holder, int position) {
        int id= mDataset.get(position).getmIndex();
        if (id == 1) {
            holder.setting1.setText(mDataset.get(position).getmText1());
            holder.setting2.setVisibility(View.GONE);
            holder.setting3.setVisibility(View.GONE);
            holder.setting4.setVisibility(View.GONE);
            holder.setting5.setVisibility(View.GONE);
            holder.setting6.setVisibility(View.GONE);
            holder.setting7.setVisibility(View.GONE);
            holder.setting8.setVisibility(View.GONE);
            holder.setting9.setVisibility(View.GONE);
            holder.setting10.setVisibility(View.GONE);
        } else if (id == 2) {
            holder.setting1.setText(mDataset.get(position).getmText1());
            holder.setting2.setText(mDataset.get(position).getmText2());
            holder.setting3.setText(mDataset.get(position).getmText3());
            holder.setting4.setText(mDataset.get(position).getmText4());
            holder.setting5.setText(mDataset.get(position).getmText5());
            holder.setting6.setText(mDataset.get(position).getmText6());
            holder.setting7.setText(mDataset.get(position).getmText7());
            holder.setting8.setText(mDataset.get(position).getmText8());
            holder.setting9.setText(mDataset.get(position).getmText9());
            holder.setting10.setText(mDataset.get(position).getmText10());
        } else if (id == 3) {
            holder.setting1.setText(mDataset.get(position).getmText1());
            holder.setting2.setText(mDataset.get(position).getmText2());
            holder.setting3.setText(mDataset.get(position).getmText3());
            holder.setting4.setText(mDataset.get(position).getmText4());
            holder.setting5.setText(mDataset.get(position).getmText5());
            holder.setting6.setText(mDataset.get(position).getmText6());
            holder.setting7.setText(mDataset.get(position).getmText7());
            holder.setting8.setVisibility(View.GONE);
            holder.setting9.setVisibility(View.GONE);
            holder.setting10.setVisibility(View.GONE);
        } 
    }

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

Example code of what I'm trying to do: 我正在尝试执行的示例代码:

int limit = 15;
for(int i = 1; i < limit; i++) {
    String textView = "setting" + i;
    if(holder.textView.getLineCount() == 0) {
        holder.textView.setVisibility(View.GONE);
    }
}

Personally I would create an array from your textViews, and loop through all of them. 就我个人而言,我将从您的textViews创建一个数组,并遍历所有它们。 If the length of their text == 0 hide the text view else show. 如果其文本的长度== 0,则隐藏文本视图,否则显示。

Also I would hide and clear all the TextViews in the beginning if public void onBindViewHolder() 另外,如果public void onBindViewHolder()我一开始也会隐藏并清除所有TextViews。

@Override
public void onBindViewHolder(DataObjectHolder holder, int position) {

    for(TextView textView : textViews) {
        textView.setText("");
        textView.setVisibility(View.GONE);
    }

    int id= mDataset.get(position).getmIndex();
    if (id == 1) {
        holder.setting1.setText(mDataset.get(position).getmText1());
    } else if (id == 2) {
        holder.setting1.setText(mDataset.get(position).getmText1());
        holder.setting2.setText(mDataset.get(position).getmText2());
        holder.setting3.setText(mDataset.get(position).getmText3());
        holder.setting4.setText(mDataset.get(position).getmText4());
        holder.setting5.setText(mDataset.get(position).getmText5());
        holder.setting6.setText(mDataset.get(position).getmText6());
        holder.setting7.setText(mDataset.get(position).getmText7());
        holder.setting8.setText(mDataset.get(position).getmText8());
        holder.setting9.setText(mDataset.get(position).getmText9());
        holder.setting10.setText(mDataset.get(position).getmText10());
    } else if (id == 3) {
        holder.setting1.setText(mDataset.get(position).getmText1());
        holder.setting2.setText(mDataset.get(position).getmText2());
        holder.setting3.setText(mDataset.get(position).getmText3());
        holder.setting4.setText(mDataset.get(position).getmText4());
        holder.setting5.setText(mDataset.get(position).getmText5());
        holder.setting6.setText(mDataset.get(position).getmText6());
        holder.setting7.setText(mDataset.get(position).getmText7());
    } 

    for(TextView textView : textViews) {
        if (textView.getText().length > 0) {
           textView.setVisibility(View.VISIBLE);
        }
    }
}

I think that you could do in your DataObject class a method that returns in a list or array all your messages. 我认为您可以在DataObject类中执行一个以列表或数组形式返回所有消息的方法。

// Somewhere in your DataObject class, it's important to add all the messages, even if they are empty
public String[] getAllMessages(){
    return new String[]{messages1, messages2, messages3};
}

then you can create a TextView list in order to loop it, like: 那么您可以创建一个TextView列表以使其循环,例如:

private ArrayList<DataObject> mDataset;
Context context;
//Here your list
private List<TextView> tvList = new ArrayList();

public static class DataObjectHolder extends RecyclerView.ViewHolder {

    public DataObjectHolder(View itemView) {
        super(itemView);
        setting1 = (TextView) itemView.findViewById(R.id.textView);
        setting2 = (TextView) itemView.findViewById(R.id.textView2);

       // Then you add all your TextViews to your list
       tvList.add(setting1); 
       tvList.add(setting2); 
    }
}

And then in your onBindViewHolder method you can loop your lists: 然后在您的onBindViewHolder方法中,可以循环您的列表:

@Override
public void onBindViewHolder(DataObjectHolder holder, int position) {
    String[] messages = mDataset.get(position).getAllMessages(); // The method that we just code
    for(int i = 0; i < tvList.size(); i++){
        if(messages[i].isEmpty()){
            tvList.get(i).setVisibility(View.GONE);
        }else{
             tvList.get(i).setVisibility(View.VISIBLE);
             tvList.get(i).setText(messages[i]);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM