3

現在私はこのAndroidアプリケーションを構築していますListViewが、困ったのはハンドルアイテムがすべて必要な順序で表示されていることですが、1つのタグに空白の値がある場合は、スペースと間隔だけを占めるsingleLineオブジェクトとして表示されますレイアウト。

エラー

この画像のListViewアイテムのすべてのスペースは、送信されるNull文字列であり、解析します。このエラーを処理するための最良の方法を知りたいですか?

ListViewアイテムの私のXML:

<?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);

オブジェクトをに追加するために、値がnullかどうかを確認しようとしていますHashMap。もちろんこれは機能しません。それらをチェックして非表示にする方法をnull TextViews考えています。

4

6 に答える 6

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);
于 2013-03-12T12:18:41.450 に答える
1

William が言ったように、テキストが null または空の場合、Simple Adapter を拡張してビューに可視性を追加できます。

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 の特定の位置に表示されるビューを返します。特定の位置にあるアイテムを回復することにより、データソースに従ってこれらのビューのすべてを変更できます。

于 2013-03-12T12:23:20.023 に答える
1

を使用してSimpleAdapterいます。それは良いことですが、変更管理はソフトウェアの重要な要素だと思います。メソッドを拡張BaseAdapterして処理する必要がありgetViewます。

実装が非常に迅速であることはわかっSimpleAdapterていますが、変更が発生すると、嫌がらせになります。カスタム アダプター用に今すぐもう 1 つのファイルを作成すると、変更が発生したときにリラックスできます。

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;
}
于 2013-03-19T04:42:21.340 に答える
1

あなたのリスト ビュー アイテムの構造がわかりません。

私の提案は次のとおりです。

タグが null かどうかを確認し、この問題を解決するために、TextView の可視性 = GONE を設定するなどの操作を行います。

于 2013-03-08T20:49:09.473 に答える
1

リストビューに入力するためにアダプターに渡されるコレクションにnull値を追加しないでください

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;
}
于 2013-03-18T14:06:58.603 に答える