2013-03-08 2 views
3

В настоящее время я создаю это приложение для Android, и одна вещь, которая меня озадачила, - это дескриптор ListView элементов, которые отображаются в том порядке, в котором они мне нужны, но если один тег имеет пустое значение, которое он показывает как объект singleLine, занимающий только пространство и расстояние между макетом.Как проверить нуль на анализируемых XML-тегах Значение

Error

Все пространство в этом изображения ListView элементов является пустая строка отправляется и я разобрать его. Я бы просто хотел узнать, как лучше справиться с этой ошибкой?

Мой XML для ListView Items:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:id="@+id/ContactTitle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="@color/White" /> 

    <TextView 
     android:id="@+id/Name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignRight="@+id/ContactTitle" 
     android:layout_below="@+id/ContactTitle" 
     android:layout_marginRight="17dp" 
     android:textColor="@color/White" /> 

    <TextView 
     android:id="@+id/MainPhone" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignRight="@+id/Name" 
     android:layout_below="@+id/Name" 
     android:textColor="@color/White"/> 

    <TextView 
     android:id="@+id/Cell" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignRight="@+id/MainPhone" 
     android:layout_below="@+id/MainPhone" 
     android:textColor="@color/White" /> 

    <TextView 
     android:id="@+id/Fax" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/Cell" 
     android:layout_below="@+id/Cell" 
     android:textColor="@color/White" /> 

    <TextView 
     android:id="@+id/Email" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/Fax" 
     android:layout_below="@+id/Fax" 
     android:ellipsize="marquee" 
     android:textColor="@color/EmailColor" /> 

</RelativeLayout> 

Мне нужно проверить на пустой TextViews и скрыть их. Мой код здесь:

protected void onPostExecute(String result) { 
      String xml = result; 
      String KEY_ITEM = "Contact"; 
      String KEY_CONTACTTITLE = "ContactTitle"; 
      String KEY_NAME = "Name"; 
      String KEY_MAINPHONE = "Phone"; 
      String KEY_CELLPHONE = "Cell"; 
      String KEY_FAX = "Fax"; 
      String KEY_EMAIL = "Email"; 
      ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>(); 

      Document doc = getDomElement(xml); 
      if (xml != null) { 
       { 
        NodeList nl = doc.getElementsByTagName(KEY_ITEM); 
        for (int i = 0; i < nl.getLength(); i++) { 
         HashMap<String, String> map = new HashMap<String, String>(); 
         Element e = (Element) nl.item(i); 
         if (getValue(e, KEY_CONTACTTITLE) != null) { 
          map.put(KEY_CONTACTTITLE, 
            getValue(e, KEY_CONTACTTITLE)); 
         } else { 
          TextView contactTitle = (TextView) findViewById(R.id.ContactTitle); 
         } 
         if (getValue(e, KEY_NAME) != null) { 
          map.put(KEY_NAME, getValue(e, KEY_NAME)); 
         } 
         if (getValue(e, KEY_MAINPHONE) != null) { 
          map.put(KEY_MAINPHONE, getValue(e, KEY_MAINPHONE)); 
         } 

         if (getValue(e, KEY_CELLPHONE) != null) { 
          map.put(KEY_CELLPHONE, getValue(e, KEY_CELLPHONE)); 
         } 

         if (getValue(e, KEY_FAX) != null) { 
          map.put(KEY_FAX, getValue(e, KEY_FAX)); 
         } 

         if (getValue(e, KEY_EMAIL) != null) { 
          map.put(KEY_EMAIL, getValue(e, KEY_EMAIL)); 
         } 

         menuItems.add(map); 
         menuItems = simple; 
        } 

        String[] hashMapObjects = { KEY_CONTACTTITLE, KEY_NAME, 
          KEY_MAINPHONE, KEY_CELLPHONE, KEY_FAX, KEY_EMAIL }; 
        int[] listItemObjects = { R.id.ContactTitle, R.id.Name, 
          R.id.MainPhone, R.id.Cell, R.id.Fax, R.id.Email }; 

         ListAdapter adapter = new SimpleAdapter(
         MoveContactsActivity.this, menuItems, 
         R.layout.listed_contacts, hashMapObjects, 
         listItemObjects); 
        setListAdapter(adapter); 

Я пытаюсь проверить, если значение равно нулю, чтобы добавить объект в HashMap. Это, конечно, не работает, и мне интересно, как проверить эти nullTextViews и скрыть их.

+0

показать мне адаптер пожалуйста –

+0

я использую простой адаптер ...... String [] = {hashMapObjects KEY_CONTACTTITLE, KEY_NAME, \t \t \t \t \t \t \t KEY_MAINPHONE, KEY_CELLPHONE, KEY_FAX, KEY_EMAIL}; \t \t \t \t \t INT [] listItemObjects = {R.id.ContactTitle, R.id.Name, \t \t \t \t \t \t \t R.id.MainPhone, R.id.Cell, R.id.Fax, R.id.Email}; \t \t \t \t \t ListAdapter адаптер = новый SimpleAdapter ( \t \t \t \t \t \t \t MoveContactsActivity.this, MenuItems, \t \t \t \t \t \t \t R.layout.listed_contacts, hashMapObjects, \t \t \t \t \t \t \t listItemObjects); Затем я устанавливаю адаптер. – Keeano

+0

вы не можете использовать простой адаптер, если хотите, чтобы элемент списка отличался от других элементов списка. вы должны использовать создание своего адаптера, а затем функцию 'getView', вы можете проверить нулевые значения и просто не устанавливать их в какой-либо виджет в элемент списка. –

ответ

2

Вам нужно позвонить только View.setVisibility(View.GONE), если в TextView ничего не видно. Так как вы используете SimpleAdapter и не имеют ни одного пользовательского getView метод, самый простой способ сделать это состоит в использовании SimpleAdapter.ViewBinder:

String[] hashMapObjects = { 
     KEY_CONTACTTITLE, KEY_NAME, KEY_MAINPHONE, KEY_CELLPHONE, KEY_FAX, KEY_EMAIL 
}; 

int[] listItemObjects = { 
     R.id.ContactTitle, R.id.Name, R.id.MainPhone, R.id.Cell, R.id.Fax, R.id.Email 
}; 

SimpleAdapter adapter = new SimpleAdapter(MoveContactsActivity.this, menuItems, R.layout.listed_contacts, hashMapObjects, listItemObjects); 
SimpleAdapter.ViewBinder binder = new SimpleAdapter.ViewBinder() { 
    @Override 
    public boolean setViewValue(View view, Object object, String value) { 
     if (!(view instanceof TextView)) { 
      return false; 
     } 

     final TextView text = (TextView) view; 

     text.setVisibility(TextUtils.isEmpty(value) ? View.GONE : View.VISIBLE); 
     text.setText(value); 

     return true; 
    } 
}; 

adapter.setViewBinder(binder); 
setListAdapter(adapter); 
1

Я не знаю, как выглядит структура вашего списка.

Мое предложение:

проверить, если тег является недействительным и сделать что-то, чтобы решить эту проблему, как видимость набор TextView = Gone.

1

Как сказал Уильям вы можете расширяет простой адаптер для добавления видимость на вид, если текст равно нулю или пусто:

public class MyAdapter extends SimpleAdapter { 

    public MyAdapter(Context context, List<? extends Map<String, ?>> data, 
      int resource, String[] from, int[] to) { 
     super(context, data, resource, from, to); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
      if(convertView!=null) //reset the visibility if a convert view is used 
       convertView.setVisibility(View.VISIBLE); 

     View v = super.getView(position, convertView, parent); 

     //text recovering from data source. here I check the name field 
     //you can add any test and hide any views using views id and setVisibility method 
     String displayedText = ((HashMap<String, String>) this.getItem(position)).get("Name"); 
     if(displayedText == null || displayedText.isEmpty()) 
      v.setVisibility(View.GONE); 


     return v; 
    } 
} 

использовать этот класс вместо SimpleAdapter, то вы можете Ставить метод GetView для добавления условий на любом поле каких-либо взглядов вашей ListView.

для информации: getView возвращает представление, которое будет отображаться в заданной позиции в ListView, вы можете изменить что-либо в этих представлениях в соответствии с источником данных, восстановив элемент в данной позиции.

1

Просто избежать добавления нулевых значений в вашей коллекции, которая передается на адаптер для заполнения вид списка

boolean elementFound = false; 
for (int i = 0; i < nl.getLength(); i++) { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    Element e = (Element) nl.item(i); 
    elementFound = false; 
    if (getValue(e, KEY_CONTACTTITLE) != null) { 
     map.put(KEY_CONTACTTITLE, 
       getValue(e, KEY_CONTACTTITLE)); 
     elementFound = true; 
    } else { 
     TextView contactTitle = (TextView) findViewById(R.id.ContactTitle); 
    } 
    if (getValue(e, KEY_NAME) != null) { 
     map.put(KEY_NAME, getValue(e, KEY_NAME)); 
     elementFound = true; 
    } 
    if (getValue(e, KEY_MAINPHONE) != null) { 
     map.put(KEY_MAINPHONE, getValue(e, KEY_MAINPHONE)); 
     elementFound = true; 
    } 

    if (getValue(e, KEY_CELLPHONE) != null) { 
     map.put(KEY_CELLPHONE, getValue(e, KEY_CELLPHONE)); 
     elementFound = true; 
    } 

    if (getValue(e, KEY_FAX) != null) { 
     map.put(KEY_FAX, getValue(e, KEY_FAX)); 
     elementFound = true; 
    } 

    if (getValue(e, KEY_EMAIL) != null) { 
     map.put(KEY_EMAIL, getValue(e, KEY_EMAIL)); 
     elementFound = true; 
    } 
    if(elementFound){ 
     menuItems.add(map); 
    } 
    //I don't understand whay are you doing this 
    //menuItems = simple; 
} 
1

проверить свою ценность с непустым String также как:

if (getValue(e, KEY_NAME) != null && !getValue(e,KEY_NAME).toString().equalsIgnoreCase("")) { 
map.put(KEY_NAME, getValue(e, KEY_NAME)); 
} 
1

You используют SimpleAdapter. Это хорошо, но я считаю, что управление изменениями является ключевым элементом программного обеспечения. Вы должны продлить BaseAdapter и должны обрабатывать метод getView.

Я знаю, что SimpleAdapter довольно быстро реализуется, но когда происходят изменения, это будет беспокоить вас.Если вы напишете еще один файл прямо сейчас для custom adapter, вы будете расслаблены, когда придут изменения.

ArrayList<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>(); 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder holder; 
    if (convertView == null) { 

     convertView = infalter.inflate(R.layout.list_row, null); 
     holder = new ViewHolder(); 
     holder.tvRawName = (TextView) convertView 
       .findViewById(R.id.tvRawName); 
     holder.tvRawEmail= (TextView) convertView 
       .findViewById(R.id.tvRawEmail); 
     convertView.setTag(holder); 

    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    try { 
     if(data.get(position).get("Email")!=null && data.get(position).get("Email").length()>0) 
     { 
       holder.tvRawEmail.setVisibility(View.VISIBLE); 
       holder.tvRawEmail.setText(data.get(position).get("Email")); 
     }else 
     { 
       holder.tvRawEmail.setVisibility(View.GONE); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

//do like for all 

    return convertView; 
} 

public class ViewHolder { 
    TextView tvRawName; 
    TextView tvRawEmail; 
} 
Смежные вопросы