安卓 - 自定义列表视图中的空列表

3

这是我的自定义列表视图布局。

我添加了一个带有id“android:empty”的“空列表”文本视图,但当列表为空时,“空文本”视图不会显示。

请问有什么建议吗?

更新 - 更新了布局。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight"
    android:paddingLeft="5dip" android:paddingRight="5dip" 
    android:paddingTop="15dip" android:paddingBottom="15dip"
    android:cacheColorHint="@color/match_bg2" android:background="@color/match_bg">
    <ImageView android:id="@+id/flag_left" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:background="@drawable/flag"
        android:src="@drawable/flag_default" />
    <LinearLayout android:orientation="vertical"
        android:padding="10dip" android:layout_width="0dip" android:gravity="center"
        android:layout_weight="1" android:layout_height="fill_parent">
        <TextView android:id="@+id/item_match_label"
            android:layout_width="wrap_content" android:layout_height="0dip"
            android:layout_weight="1" android:gravity="center"
            android:textColor="@color/match_fg"  android:textStyle="bold"
            android:singleLine="true"
            android:ellipsize="marquee"
            android:focusableInTouchMode="true"
            />
    </LinearLayout>
    <ImageView android:id="@+id/flag_right" android:layout_width="wrap_content" 
        android:layout_height="wrap_content" android:background="@drawable/flag"
        android:src="@drawable/flag_default" />

    <TextView android:id="@id/android:empty"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="#FF0000"
              android:text="No data"/>
</LinearLayout>

这是我的Listview活动

public class LatestMatchesListActivity extends ListActivity {
...

private void createMatchList() {

    /*
    Log.i(MY_DEBUG_TAG, "Checking Match store size before passing it to custom adapter: "+mStore.size());
    if(mStore.size() == 0){
        Log.i(MY_DEBUG_TAG, "Got Empty match store, so checking connectivity..");
        Match m = new Match();
        if(isOnline()){
            Log.i(MY_DEBUG_TAG, "Internet is accessible, so adding no matches object: ");
            m.setId(-1);
        } else{
            Log.i(MY_DEBUG_TAG, "No Internet accessible, so adding mo caonnectivity match  object: ");
            m.setId(-2);
        }
        mStore.add(m);
    } else {
        Log.e(MY_DEBUG_TAG, "Match store is not empty ");
    }
    */
    //mStore.clear();
    Log.i(MY_DEBUG_TAG, "Passing match list to custom adapter: "+mStore.toString());
    this.mAdapter = new MatchAdapter(this, R.layout.list_matches, mStore);
    this.setListAdapter(this.mAdapter);

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);
    lv.setBackgroundDrawable(null);
    lv.setBackgroundResource(0);

}

以及自定义的ArrayAdapter

public class MatchAdapter extends ArrayAdapter<Match> {
    private ArrayList<Match> items;
    private final String MY_DEBUG_TAG = "MatchAdapter";

    public MatchAdapter(Context context, int textViewResourceId, ArrayList<Match> items) {
        super(context, textViewResourceId, items);
        this.items = items;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.list_matches, null);
        }
        Match m = items.get(position);
        if (m != null) {
            TextView itemLabel = (TextView) v.findViewById(R.id.item_match_label);
            ImageView imageFlagLeft = (ImageView) v.findViewById(R.id.flag_left);
            ImageView imageFlagRight = (ImageView) v.findViewById(R.id.flag_right);

            if(m.getId() == -1){
                itemLabel.setText("No Live Matches.");
                imageFlagLeft.setVisibility(View.INVISIBLE);
                imageFlagRight.setVisibility(View.INVISIBLE);
            } else if(m.getId() == -2){
                itemLabel.setText("No Intenet connectivity.");
                imageFlagLeft.setVisibility(View.INVISIBLE);
                imageFlagRight.setVisibility(View.INVISIBLE);
            } else {
                itemLabel.setText(m.getTeam1() + " v/s " + m.getTeam2());
                imageFlagLeft.setImageResource(getFlagResource(m.getTeam1()));
                imageFlagRight.setImageResource(getFlagResource(m.getTeam2()));
            }

        }
        return v;
    }

    private int getFlagResource(String teamName) {
        Log.i(MY_DEBUG_TAG, "Getting the flag of " + teamName);
        String flagString = "flag_" + teamName.replace(" ", "_").toLowerCase();
        int resId = getContext().getResources().getIdentifier(flagString, "drawable", "com.itflux.DroidChirp");
        if (resId != 0) {
            return resId;
        }
        return R.drawable.flag_default;
    }
}

你的布局中没有显示TextView? - vnshetty
是的,@vnshetty,当列表为空时,文本视图不会显示。 - Mithun Sreedharan
你能在图形化布局中看到你的TextView吗? - vnshetty
4个回答

3
你需要让你的 ListView 适应屏幕,然后在 LinearLayout 中,你的 TextView 显示在那个 ListView 下面,所以它是不可见的(如果你使用 ScrollView 它就是可见的)。
你需要使用一个根元素为 RelativeLayout 的布局,这样你的 TextView 就可以放在 ListView 上方了。

我尝试使用RelativeLayout包装我的布局,并按照您的建议移动了TextView,当前代码可以在http://pastebin.com/xFBqErgq中查看。但是空的文本视图仍然没有显示。 - Mithun Sreedharan
你是如何触发TextView的显示的?你能分享相关代码作为问题的扩展吗?谢谢! - rekaszeru

2

看起来问题仍未解决。这是我解决它的方法。我触发了一个函数,每当数据更改时,它就会基本上刷新列表布局:

    ListView lv = getListView();
    lv.requestLayout();
    if(aa.arrayValue.size() > 0) {
        lv.setVisibility(ListView.VISIBLE);
        setListAdapter(new Adaptor(this, R.layout.main_list_item, aa.arrayValue));
    }
    else {
        lv.setVisibility(ListView.INVISIBLE);
        TextView tv = (TextView) findViewById(android.R.id.empty);
        tv.requestLayout();
        tv.setVisibility(TextView.VISIBLE);
    }

希望这能对您有所帮助!

1

在空的情况下使用@+id,在列表中使用@id:android:id="@+id/android:empty"


@Sandy 在 id 中添加了 +,但没有帮助。 - Mithun Sreedharan
它应该可以正常工作,你能否发布一下你使用列表的Java代码? - Sandy
你能发布这个方法吗:ListView lv = getListView(); - Sandy
@Sandy,getListView是从这里获取的,我没有重写它。 - Mithun Sreedharan
你是否有包含ListView的布局?你应该添加setContentView(R.layout.WhichHasListView),然后ListView lv = (ListView)findViewByID(android.R.id.list); - Sandy

0
你遇到的问题与 ListView 的高度属性有关。将其设置为wrap_content

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接