2016-05-01 13 views
2

私のアプリケーションで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]); 

    } 
} 

答えて

1

問題の場所について正しいです。問題は、ソース配列がフィルタリングされていないため、インデックスがフィルタリングされているアダプタのインデックスと一致しないことです。次のようにonItemClick()を書き換え :

@Override 
public void onItemClick(AdapterView<?> parent, View view, 
     int position, long id) { 
    Intent i = new Intent(MainActivity.this, SingleItemView.class); 

    Vocabulary voc = (Vocabulary) adapter.getItem(position); 

    i.putExtra("definition", voc.getDefinition()); 
    // Pass word 
    i.putExtra("word", voc.getWord()); 
    // Pass example 
    i.putExtra("example", voc.getExample()); 
    // Pass flag 
    i.putExtra("flag", voc.getFlag()); 
    // Pass position 
    i.putExtra("position", position); 
    // Open SingleItemView.java Activity 
    startActivity(i); 
} 

これは、あなたが他のSingleItemView活動に必要があるの値を渡します。配列全体ではありません。

また、キャストを避けるためにBaseAdapterの代わりにAdapterArrayAdapter<Vocabulary>に延長することを検討してください。 個々のフィールドを渡す代わりにParcelableを実装すると、Vocabularyオブジェクト全体を新しいActivityオブジェクトに渡すこともできます。

UPDATE:ここ

は、同様にSingleItemViewになされる必要がある変更です。 1つの項目を表示するために配列全体を必要としないので、選択項目の値だけを渡すように項目を更新しました。

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.getIntExtra("position", -1); 
     definition = i.getStringExtra("definition"); 
     word = i.getStringExtra("word"); 
     example = i.getStringExtra("example"); 
     flag = i.getIntExtra("flag", -1); 


     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); 
     txtword.setText(word); 
     txtexample.setText(example); 


     imgflag.setImageResource(flag); 

    } 
} 
+0

私はonItemClickを書き換えてアプリケーションを実行した後、アイテムをクリックするたびにアプリが停止して終了します。 –

+0

'SingleItemView'アクティビティを書き直して、インテントエクストラを文字列配列ではなく文字列として取得しましたか?そうでない場合はまずそれを行います。あなたがしていた場合は、何がうまくいかなかったかを調べるために、logcatのスタックトレースに質問の編集としてエラーメッセージを含めてください。 –

+0

上記の私のMainActivityを更新しました(onItemClickをすべて書き直して)、私は自分の 'SingleItemView'アクティビティを投稿しました。それが大丈夫かどうか見てください。前もって感謝します。 –

関連する問題