1

上部に検索ボックスがある単純なリストビューを作成しようとしています。ハミーはこのスレッドで優れたチュートリアルを提供しています。ただし、この最後に1つの問題が発生しました。レイアウトXMLファイルを参照する行があります。

filterText = (EditText) findViewById(R.id.search_box);

'id'を解決できない(またはフィールドではない)限り、Eclipseはエラーをスローします。私のレイアウトXMLファイルには次のものが含まれています。

<!-- Pretty hint text, and maxLines -->
<EditText android:id="@+building_list/search_box" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="type to filter"
    android:inputType="text"
    android:maxLines="1"/>

<!-- Set height to 0, and let the weight param expand it -->
<!-- Note the use of the default ID! This lets us use a 
     ListActivity still! -->
<ListView android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="0dip"
    android:layout_weight="1" 
     /> 

行を置き換えるなど、いくつかの明らかな修正を試みました

<EditText android:id="@+building_list/search_box"

と:

<EditText android:id="@+id/search_box"

...これでエラーは削除されますが、テキストボックスに何かを入力しようとすると、アプリがクラッシュします。

どこが間違っているのですか?完全を期すために、これが私のJavaファイルの内容です。

package mjd.listview.test;

import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.R.id;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import au.com.bytecode.opencsv.CSVReader;

public class ListProjectActivity extends ListActivity {

private EditText filterText = null; // used in filtering the list
ArrayAdapter<String> adapter = null; // used in filtering the list

/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);     

  setContentView(R.layout.filterable_listview); // load the layout file 'filterable_listview.xml'
  filterText = (EditText) findViewById(R.id.search_box); // used in filtering the list
    filterText.addTextChangedListener(filterTextWatcher); // used in filtering the list

  String next[] = {}; // 'next' is used to iterate through dictionaryFile
  List<String[]> dictionaryArray = new ArrayList<String[]>();

  try {
        CSVReader reader = new CSVReader(new InputStreamReader(getAssets().open("dictionaryFile.csv")));
        while((next = reader.readNext()) != null) {
            dictionaryArray.add(next);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

  String[] terms = dictionaryArray.get(0); // load terms from dictionaryArray  
  setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, terms));

  ListView lv = getListView();

  lv.setOnItemClickListener(new OnItemClickListener() { // when an item is clicked on...
    public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {
        AlertDialog alertDialog = new AlertDialog.Builder(ListProjectActivity.this).create(); // create a dialog box in memory
        alertDialog.setTitle(((TextView) view).getText()); // set title of dialog box to term name
        alertDialog.setMessage("Put definition here"); // set dialog box message to term definition
        alertDialog.show(); // actually display the dialog box
    }

  });

}

// The whole block below is used in filtering the list
private TextWatcher filterTextWatcher = new TextWatcher() {

    public void afterTextChanged(Editable s) {
    }

    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        adapter.getFilter().filter(s);
    }

};

@Override
protected void onDestroy() {
    super.onDestroy();
    filterText.removeTextChangedListener(filterTextWatcher);
}
}

編集:これは、後で別のリストレイアウトを使用するという事実に関連しているのではないかと疑っています(以下の行を参照)

setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, terms));

おそらく、その「list_item」は「android:id /list」のようなものである必要がありますか?しかし、正しく参照するための構文を正しく取得できません...何かアイデアはありますか?

4

3 に答える 3

3

あなたのエラーは完全に別の問題だと思います(R.id.search_boxとは関係ありません)

使用する場合

android:id="@+building_list/search_box"

を使用して参照する必要があります

findViewById(R.building_list.search_box)

あなたの場合、

android:id="@+id/search_box"

(あなたが試した)あなたがそれを参照しているので、その最初の問題を解決します

findViewById(R.id.search_box)

これで、logcatは、onTextChangedメソッドでNullPointerExceptionが発生していることを示します。私の経験では、これは通常、初期化されていないオブジェクト参照、または配列関連の問題です。あなたの場合、あなたは電話しています

adapter.getFilter().filter(s);

onTextChangedメソッド内にありますが、実際にアダプターをコード内のどこかに設定したようには見えません。私が収集できることから、これが行うことになっていることから、置き換えてみてください

setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, terms));

adapter= new ArrayAdapter<String>(this, R.layout.list_item, terms));
setListAdapter(adapter); 
于 2012-08-27T02:22:41.333 に答える
1

mjd.listview.test.R(または同様のもの)の代わりにandroid.R.idをインポートしました

Rの使用に関するガイドをご覧ください:http: //developer.android.com/guide/topics/resources/accessing-resources.html

于 2012-08-27T02:03:02.760 に答える
0

logcatを投稿してください

問題はレイアウトではないと思いますが、

メソッドの例外onTextChangedです。adapter.getFilter().filter(s)アダプタはnullであり、例外をスローすると思います。

于 2012-08-27T02:24:15.710 に答える