0

私はこれを理解しようとして髪を引っ張っています。私が読んだすべてのチュートリアルから、このセットアップの方法はうまくいくはずです。カスタム アダプターを使用して一部のデータを表示する ListActivity があります。アダプターが空の場合、「アイテムが見つかりません」というメッセージを表示したいと思います。

これは私のレイアウトです:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 style="@style/BaseStyle"
 android:orientation="vertical"
 android:padding="5dip"
 >
      <ListView android:id="@android:id/list"
      style="@style/BaseStyle"
      />

      <TextView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@android:id/empty"
      style="@style/BaseStyle.Title"
      android:text="No Items Found"
      />

      <TextView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/text"
      style="@style/BaseStyle.Title"
      android:layout_alignParentTop="true"
      />
 </RelativeLayout>

これは私のコードです:

 public class Main extends ListActivity {
 private CustomAdapter adapter;
 private String[] items = {};

 @Override     
 public void onCreate(Bundle icicle) {
      super.onCreate(icicle);
      setContentView(R.layout.main);

      adapter = new CustomAdapter();

      PopulateItems();

      for (String item : items)
           adapter.addItem(item);

      this.setListAdapter(adapter);
      adapter.notifyDataSetChanged();
 }

 private class CustomAdapter extends BaseAdapter {
 private String[] mData;
 private LayoutInflater mInflater;

 public CustomAdapter() {
      mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 }

 public void addItem(String item) {
      mData.add(item);
 }

 @Override
 public int getCount() {
      return mData.size();
 }

 @Override
 public Object getItem(int position) {
      return mData.get(position);
 }

 @Override
 public long getItemId(int position) {
      return position;
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent)
 {
      ViewHolder holder;
      String item = (String)this.getItem(position);

      if (convertView == null)
      {         
           holder = new ViewHolder();

           convertView = mInflater.inflate(R.layout.main, parent, false);
           holder.text = (TextView)convertView.findViewById(R.id.text);
           convertView.setTag(holder);
      } else {
           holder = (ViewHolder)convertView.getTag();
      }
      TextView tvText = holder.text;
      tvText.setText(item);
 }

 static class ViewHolder {
      TextView text;
 }

「アイテム」文字列配列にデータがない場合、「アイテムが見つかりません」というテキストが正常に表示されます。PopulateItem() メソッドには、配列にデータを入力するプロセスがあり、データがある場合でも、リストの各行のデータの「下」に「項目が見つかりません」というテキストが表示されます。したがって、空のテキストは基本的にデータによってオーバーレイされています。

4

2 に答える 2

1

IDが「空」のテキストビューはまだ表示されているため、最初にそのビューの可視性を非表示に設定し、リストが空の場合は表示するだけにして
、android:visibility="invisible" パラメータを見てください。
リストが空の場合はコード内で yourtextview.setVisibility(View.VISIBILE)

于 2011-09-06T03:33:32.790 に答える
0

コードの質問でタイプミスをしたかどうかはわかりません。ここに投稿する前に、コードの一部を取り除いているようです。

getView() は、ListViewの特定の行のビューを作成するためのものです。これは、ListView、EmptyView、および別の TextView を含む RelativeLayout です。

ListView が文字列のみを表示している場合は、TextView をインスタンス化して getView に返すだけです。

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
  String item = (String)this.getItem(position);

  if (convertView == null)
  {         
       convertView = new TextView(context);
  } 
  convertView.setText(item);
  return convertView
}

カスタム アダプターのコンストラクターを介して Context を渡します。

編集:単一の行に複数のテキストビューを表示する

厳密に言うと、問題は convertView = mInflater.inflate() の行ではありません。エラーは膨張したファイルにあります。リストビューの各行のビューがより複雑な場合は、通常、別の xml ファイルを拡張する方が簡単です。以前の間違いは、main.xml の再帰的な膨張のように見えます。

複数のテキストビューを処理するには、次のようにします。

リストビューの各行を表す別の xml ファイル list_item.xml を作成します。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  .....
 >
  <TextView android:id="@+id/list_text_1"
    ....
  />

  <TextView android:id="@+id/list_text_2"
    ....
  />

  <TextView android:id="@+id/list_text_3"
    ....
  />
 </LinearLayout>

アダプターの getView 実装では、

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
  String item = (String)this.getItem(position);

  if (convertView == null)
  {         
     convertView = mInflater.inflate(R.layout.list_item.xml, parent, false);
     //link list_text_1, list_text_2, list_text_3 as you need to the individual   
     // textviews
  } 
  else {
    // TODO linking up the textviews when convertView is not null
  }
  return convertView
}

xml ファイルを拡張する必要があることを考えると、これはおそらくビューホルダー パターンを導入するのに適した時期です。この回答にリンクされている pdf ファイルの 11/19 ページには、ViewHolder パターンに関するかなり良い説明があります。

最後に、ListView の例をさらに読んで、getView でいつインフレータを使用するのか、実際に 何をインフレートするのかを観察してください。

于 2011-09-06T05:27:02.207 に答える