10

I guess getView() is called for each item of the list, but my question is, Can we not show the row if data associated with that row is null. I want to do this inside getView () only.

For Example:

If the alerts for a person whose name is to be shown in list view are null.I don't want to display that person's name in list view.

Rookie
  • 8,660
  • 17
  • 58
  • 91

2 Answers2

25

You can set the visibility of that row to "gone" in the last line before returning the View - that should work for you.

Edit: Be sure to set visibility to visible if the content is not null - otherwise all the views will become "gone" as the ListView reuses views.

myView.setVisibility((myData == null) ? View.GONE : View.VISIBLE);
Tim
  • 6,692
  • 2
  • 25
  • 30
  • I dont think so.coz each row in list view has same id so it will set the visibility of all above rows to gone. – Rookie Jun 17 '12 at 11:14
  • 1
    That's not correct - you just have to check for each row if the content is null or not and set the visibility to visible or gone. – Tim Jun 17 '12 at 11:16
  • You're welcome :) We're using that in our own projects, too :) – Tim Jun 17 '12 at 11:21
  • Can You tell me ...what is notifyDataSetChanged() for..?Willl it be applicable here.? – Rookie Jun 17 '12 at 11:23
  • notifyDataSetChanged() is used for telling the adapter that the views should be renewed (per example if the data in the adapter dynamically changes). – Tim Jun 17 '12 at 11:24
  • @TimMesserschmidt :Please share what will be the last line of code? – Shahzad Imam Jun 17 '12 at 11:30
  • if((list.get(position).get("alerts")).isEmpty()){ holder.txtFirst.setVisibility(View.GONE); } else holder.txtFirst.setText(map.get("firstName").toString() +"_____"+ map.get("lastName").toString()); – Rookie Jun 17 '12 at 11:34
  • I've added a possible last line before returning the View. – Tim Jun 17 '12 at 11:37
  • @TimMesserschmidt :The that row will become invisible or some other items will show? – Shahzad Imam Jun 17 '12 at 11:38
  • Your code would only set the TextView's visibility to gone - my code would set the parent's View's visibility to gone. Furthermore I'd avoid checking for isEmpty() and I'd do it myself via == null || .equals(""); – Tim Jun 17 '12 at 11:41
  • Hey can u givee me an exmaple showing the working of notifyDataSetChanged()..? – Rookie Jun 17 '12 at 12:14
  • Check this topic at Stackoverflow: http://stackoverflow.com/questions/3669325/notifydatasetchanged-example/5092426#5092426 – Tim Jun 17 '12 at 12:24
  • i think this is not the best solution for this purpose. just try to set your specific condition and increase your position number in getView. – Setmax Nov 04 '15 at 10:43
  • 7
    Tried this solution. It creates blank places in the list – Shivaraj Patil Feb 05 '16 at 14:13
1

Hi Pals I tried setting the visibility to invisible but still i can see an empty row in a listview so i change a little bit and it worked according to my need so it worth sharing if someone needs similar result like mine.

I am using List as source my requirement was to skip few applications so what i did was i removed that application from the List and notified Data set change

public AppListAdapter(Context context, List<ApplicationInfo> appList) {
        this.context = context;
        this.appList = appList;
        inflater = LayoutInflater.from(context);
        localStorage = new LocalStorage(context);
        pm = context.getPackageManager();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null)
              convertView = inflater.inflate(R.layout.applist_item, parent, false);
            // Other lines of code
        if(appName.length()==0 || getItem(position).packageName.equals("package.name.to.skip")) {
              appList.remove(position);
              notifyDataSetChanged();
        }
    return convertView;
}

Lines of Concern

appList.remove(position);
notifyDataSetChanged();

Your suggestions and corrections are always welcome.
AzmatHunzai

Azmat Karim Khan
  • 437
  • 5
  • 18