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.