私のアプリケーションでListView
をフィルタリングするためにSearchView
とカスタムFilter
を実装しました。私はこの問題に直面しています:SeachView
フィールドに入力して項目をクリックした後にListView
をフィルタリングすると、新しいアクティビティが開きますが、間違ったデータ位置になります。私はonclickListener i.putExtra("word", word);
を入れようとしましたが、 "word"文字列の位置が間違っています。フィルタリング可能なインターフェイスですが、BaseAdapterのgetviewが間違った位置になっています
MainActivity
ListViewAdapter
public class ListViewAdapter extends BaseAdapter implements Filterable {
Context context;
String[] word;
String[] definition;
String[] example;
int[] flag;
LayoutInflater inflater;
ArrayList<Vocabulary> vocabularylist;
ArrayList<Vocabulary> mStringFilterList;
ValueFilter valueFilter;
public ListViewAdapter(Context context, ArrayList<Vocabulary> vocabularylist, String[] word, String[] definition,
String[] example, int[] flag) {
this.context = context;
this.word = word;
this.definition = definition;
this.example = example;
this.flag = flag;
this.vocabularylist = vocabularylist;
mStringFilterList = vocabularylist;
}
@Override
public int getCount() {
return vocabularylist.size();
}
@Override
public Object getItem(int position) {
return vocabularylist.get(position);
}
@Override
public long getItemId(int position) {
return vocabularylist.indexOf(getItem(position));
}
public View getView(int position, View convertView, ViewGroup parent) {
TextView txtword;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View itemView = inflater.inflate(R.layout.listview_item, parent, false);
// Locate the TextViews in listview_item.xml
txtword = (TextView) itemView.findViewById(R.id.word);
Vocabulary vocabulary = vocabularylist.get(position);
txtword.setText(vocabulary.getWord());
return itemView;
}
@Override
public Filter getFilter() {
if (valueFilter == null) {
valueFilter = new ValueFilter();
}
return valueFilter;
}
private class ValueFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint != null && constraint.length() > 0) {
ArrayList<Vocabulary> filterList = new ArrayList<Vocabulary>();
for (int i = 0; i < mStringFilterList.size(); i++) {
if ((mStringFilterList.get(i).getWord().toUpperCase())
.contains(constraint.toString().toUpperCase())) {
Vocabulary vocabulary = new Vocabulary(mStringFilterList.get(i)
.getWord(), mStringFilterList.get(i)
.getDefinition(), mStringFilterList.get(i)
.getExample(), mStringFilterList.get(i)
.getFlag());
filterList.add(vocabulary);
}
}
results.count = filterList.size();
results.values = filterList;
} else {
results.count = mStringFilterList.size();
results.values = mStringFilterList;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
vocabularylist = (ArrayList<Vocabulary>) results.values;
notifyDataSetChanged();
}
}
}
語彙
public class Vocabulary {
String word;
int flag;
String definition;
String example;
Vocabulary(String word, String definition, String example, int flag) {
this.word = word;
this.definition = definition;
this.example = example;
this.flag = flag;
}
public String getDefinition() {
return definition;
}
public void setDefinition(String definition) {
this.definition = definition;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public String getExample() {
return example;
}
public void setExample(String example) {
this.example = example;
}
public int getFlag() {
return flag;
}
public void setFlag(int flag) {
this.flag = flag;
}
}
SingleItemView
public class SingleItemView extends Activity {
// Declare Variables
TextView txtdefinition;
TextView txtword;
TextView txtexample;
ImageView imgflag;
String[] definition;
String[] word;
String[] example;
int[] flag;
int position;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.singleitemview);
// Retrieve data from MainActivity on listview item click
Intent i = getIntent();
position = i.getExtras().getInt("position");
definition = i.getStringArrayExtra("definition");
word = i.getStringArrayExtra("word");
example = i.getStringArrayExtra("example");
// Get the list of flag
flag = i.getIntArrayExtra("flag");
txtdefinition = (TextView) findViewById(R.id.definition);
txtword = (TextView) findViewById(R.id.word);
txtexample = (TextView) findViewById(R.id.example);
imgflag = (ImageView) findViewById(R.id.flag);
txtdefinition.setText(definition[position]);
txtword.setText(word[position]);
txtexample.setText(example[position]);
imgflag.setImageResource(flag[position]);
}
}
私はonItemClickを書き換えてアプリケーションを実行した後、アイテムをクリックするたびにアプリが停止して終了します。 –
'SingleItemView'アクティビティを書き直して、インテントエクストラを文字列配列ではなく文字列として取得しましたか?そうでない場合はまずそれを行います。あなたがしていた場合は、何がうまくいかなかったかを調べるために、logcatのスタックトレースに質問の編集としてエラーメッセージを含めてください。 –
上記の私のMainActivityを更新しました(onItemClickをすべて書き直して)、私は自分の 'SingleItemView'アクティビティを投稿しました。それが大丈夫かどうか見てください。前もって感謝します。 –