简体   繁体   中英

Hide multiple empty textviews

I am am using a RecyclerView , with a CardView , that includes multiple TextView s. 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.

This is all performed in the adapter for the 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.

I've tried to create a simple loop to just cycle through all the textviews and hide them if they are empty. However, the way I tried, won't work as it's using a string as the 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. If the length of their text == 0 hide the text view else show.

Also I would hide and clear all the TextViews in the beginning if public void onBindViewHolder()

@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.

// 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:

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:

@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]);
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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