Android - 自定义列表视图中的空列表

时间:2011-05-02 05:24:41

标签: android android-listview android-arrayadapter

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

我添加了一个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;
    }
}

4 个答案:

答案 0 :(得分:3)

您的ListView适合屏幕,LinearLayout TextView ListView显示在ScrollView下面,因此它不可见(如果您是{使用RelativeLayout)。

例如,您需要将TextView用作布局的根元素,以使ListView位于{{1}}之上。

答案 1 :(得分: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);
    }

希望这会帮助你!

答案 2 :(得分:1)

在空中使用@ + id,在列表中使用@id:android:id =“@ + id / android:empty”

答案 3 :(得分:0)

您的问题在于ListView height属性。将其设置为wrap_content