2012-04-10 22 views
0

私は最初のアンドロイドアプリを構築しており、問題が発生しました。私はListViewを使用して検索機能があります。ここで、ユーザーは特定のアイテムを検索し、それが存在するかどうかを見ることができます。これは本当にうまく動作し、このチュートリアルに基づいて作成しました。Android ListView with SearchAndroid Search Expandable ListView

すべての項目は、array.xmlで定義されている文字列配列にあります。現在、すべてのアイテムは1つまたは複数のコレクションに含めることができます。現在、アイテム名の横に「ITEM - >コレクション」のようなコレクションが表示されています。これは機能しますが、実際にはエレガントなオプションではありません。私がしたいのは、アイテムの名前が、拡張可能なListView内のITEMであり、それがSUBITEMとして属するコレクションです。したがって、私は2つの文字列の配列を持っているでしょう、親アイテムのためのもの、子供アイテムのためのものです。

私が見つけたすべての例では、リストを「手動で」入力していますが、私のITEMS配列をGROUPに、私のCOLLECTIONS配列を子供に割り当てる方法がわかりません。

私はこの明確に十分に説明している場合、私は知らないが、要するに、それはこのようになります:

ITEM_1 = 1番目のグループ名 COLLECTIONS_1 = 1番目のグループの子

Example Image

感謝君は!

+0

本当に展開可能なリストビューが必要ですか、または上部がアイテムで、コレクションの下部が2つのラインリストビューを希望しますか?あなたがイメージで見せているものは、前者ではなく、後者のように見えます。 – Barak

+0

私は今のところ、2行の解決策も機能すると思います。私はそのようなアイデアを使用してそのアイデアを半実装しました。文字列配列項目を定義するときは、 "ITEM \ r \ n - > Collection(s)"です。今コレクションは2番目の行にあります。最初の行とは違ってフォーマットすることは可能でしょうか? –

答えて

0

編集:私はこのようにそれを望んでいたように[OK]を、拡張可能なビューを作成するために管理 :今

public class Search extends ListActivity { 
    private String[] l1; 
    private String[] l2; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.search); 
     ArrayList<Map<String, String>> list = buildData(); 
     String[] from = { "name", "purpose" }; 
     int[] to = { android.R.id.text1, android.R.id.text2 }; 
     SimpleAdapter adapter = new SimpleAdapter(this, list, android.R.layout.simple_list_item_2, from, to); 
     setListAdapter(adapter); 
    } 

    private ArrayList<Map<String, String>> buildData() { 
     l1 = getResources().getStringArray(R.array.items); 
     l2 = getResources().getStringArray(R.array.collections); 
     Integer i; 
     int to = l1.length; 
     ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();  
     for(i=0;i < to;i++){ 
     list.add(putData(l1[i], l2[i])); 
     } 
     return list; 
    } 

    private HashMap<String, String> putData(String name, String purpose) { 
     HashMap<String, String> item = new HashMap<String, String>(); 
     item.put("name", name); 
     item.put("purpose", purpose); 
     return item; 
    } 
} 

問題

、どのように私はこれを並べ替えることができますか?

+1

フォローアップの質問がある場合は、新しい質問を投稿するか、現在のものを編集することを検討してください(回答を隠すことは誰も期待していません。 – kleopatra

0

現在地からソースコードをダウンロード(Expandablelistview with searchview in android

MainActivity.java:

public class MainActivity extends AppCompatActivity { 
    ExpandableListView ev_list; 
    List> lv_country = new ArrayList<>(); 
    CustomAdapter customAdapter; 
    EditText et_search; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     setContentView(R.layout.activity_main); 
     getSupportActionBar().hide(); 
     init(); 

    } 

    private void init() { 
     ev_list = (ExpandableListView) findViewById(R.id.ev_list); 
     et_search = (EditText) findViewById(R.id.et_search); 

     fn_arraylist(); 
     customAdapter = new CustomAdapter(lv_country, getApplicationContext()); 
     ev_list.setAdapter(customAdapter); 

     ev_list.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { 
      @Override 
      public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { 
       return true; // This way the expander cannot be collapsed 
      } 
     }); 

     for (int i = 0; i < customAdapter.getGroupCount(); i++) { 
      ev_list.expandGroup(i); 
     } 


     et_search.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

      } 

      @Override 
      public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

      } 

      @Override 
      public void afterTextChanged(Editable editable) { 

       if (et_search.getText().toString().length() == 0) { 
        customAdapter = new CustomAdapter(lv_country, getApplicationContext()); 
        ev_list.setAdapter(customAdapter); 

        for (int i = 0; i < customAdapter.getGroupCount(); i++) { 
         ev_list.expandGroup(i); 
        } 
       } else { 

        List> lv_search = new ArrayList<>(); 

        for (int i = 0; i < lv_country.size(); i++) { 
         List> lv_searchstate = new ArrayList<>(); 

         List> lv_state = (List>) lv_country.get(i).get("State"); 
         for (int j = 0; j < lv_state.size(); j++) { 
          if (lv_state.get(j).get("Name").toString().toLowerCase().contains(et_search.getText().toString())) { 
           lv_searchstate.add(lv_state.get(j)); 
          } 
         } 

         if (lv_searchstate.size() != 0) { 
          HashMap hashMap_search = new HashMap<>(); 
          hashMap_search.put("Name", lv_country.get(i).get("Name").toString()); 
          hashMap_search.put("State", lv_searchstate); 

          lv_search.add(hashMap_search); 
         } 
        } 


        customAdapter = new CustomAdapter(lv_search, getApplicationContext()); 
        ev_list.setAdapter(customAdapter); 

        for (int i = 0; i < customAdapter.getGroupCount(); i++) { 
         ev_list.expandGroup(i); 
        } 


       } 

      } 
     }); 


    } 

ありがとう!

関連する問題