2016-08-01 10 views
0

これを動作させようと思ったが、役に立たなかった時間:( 私のリストビュー用の検索フィルターを設定しました。 、フィルタが無意味になりた覚えていない前またはフィルタリング後のいずれかのチェックボックスここにいくつかの指導をお願い申し上げ検索フィルターでチェックされたチェックボックスを記憶していることを記憶している

私のコード:。。

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.SearchView; 
import android.widget.ListView; 

import java.util.ArrayList; 
import java.util.Arrays; 

public class MainActivity extends AppCompatActivity implements 
     SearchView.OnQueryTextListener { 

    private AllStuffModel[] modelItems = AllStuff.allConditions; 
    private ListView conditionsView; 
    private SearchView search_view; 
    private AllStuffAdapter adapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     adapter = new AllStuffAdapter(this, new ArrayList<AllStuffModel>(Arrays.asList(modelItems)), this); 
     conditionsView = (ListView) findViewById(R.id.condition_list); 
     conditionsView.setAdapter(adapter); 

     search_view = (SearchView) findViewById(R.id.search_view); 
     search_view.setOnQueryTextListener(this); 

    } 

    @Override 
    public boolean onQueryTextChange(String newText) { 
     adapter.getFilter().filter(newText); 
     return false; 
    } 

    @Override 
    public boolean onQueryTextSubmit(String query) { 
     return false; 
    } 

} 

AllStuffAdapter.java

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.Filter; 
import android.widget.Filterable; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.List; 

public class AllStuffAdapter extends ArrayAdapter<AllStuffModel> implements Filterable { 
    private List<AllStuffModel> modelItems; 
    private List<AllStuffModel> filteredModelItems; 
    private Context context; 
    private MainActivity mainActivity; 
    private ValueFilter valueFilter; 

    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 

    public AllStuffAdapter(Context context, List<AllStuffModel> resource, MainActivity mainActivity) { 
     super(context, R.layout.condition_row, resource); 
     this.context = context; 
     this.modelItems = resource; 
     this.mainActivity = mainActivity; 
     filteredModelItems = modelItems; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     convertView = inflater.inflate(R.layout.condition_row, parent, false); 
     TextView conditionText = (TextView) convertView.findViewById(R.id.condition_text); 
     final CheckBox conditionCheckBox = (CheckBox) convertView.findViewById(R.id.condition_checkbox); 
     conditionCheckBox.setId(position); 
     conditionText.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (!conditionCheckBox.isChecked()) { 
        conditionCheckBox.setChecked(true); 
        modelItems.get(position).setIsChecked(true); 
       } 
       else if(conditionCheckBox.isChecked()) { 
        conditionCheckBox.setChecked(false); 
        modelItems.get(position).setIsChecked(false); 
       } 
       System.out.println(modelItems.get(position).isChecked()); 
      } 
     }); 


     conditionText.setText(modelItems.get(position).getName()); 
     conditionCheckBox.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       CheckBox currentCheckBox = (CheckBox) v; 
       if (currentCheckBox.isChecked()) { // If checked set to true, else false 
        modelItems.get(position).setIsChecked(true); 
       } else if (!currentCheckBox.isChecked()) { 
        modelItems.get(position).setIsChecked(false); 
       } 
       System.out.println(modelItems.get(position).isChecked()); 
      } 
     }); 

     return convertView; 
    } 

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

    @Override 
    public long getItemId(int position) { 
     return modelItems.indexOf(getItem(position)); 
    } 

    @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<AllStuffModel> filterList = new ArrayList<AllStuffModel>(); 
       for (int i = 0; i < filteredModelItems.size(); i++) { 
        if ((filteredModelItems.get(i).getName().toUpperCase()) 
          .contains(constraint.toString().toUpperCase())) { 

         AllStuffModel allConditionsModel = new AllStuffModel(filteredModelItems.get(i).getCode(),filteredModelItems.get(i).getName()); 

         allConditionsModel.setIsChecked(filteredModelItems.get(i).isChecked()); 

         filterList.add(allConditionsModel); 
        } 
       } 
       results.count = filterList.size(); 
       results.values = filterList; 
      } else { 
       results.count = filteredModelItems.size(); 
       results.values = filteredModelItems; 
      } 
      return results; 

     } 

     @Override 
     protected void publishResults(CharSequence constraint, 
             FilterResults results) { 
      modelItems = (ArrayList<AllStuffModel>) results.values; 
      notifyDataSetChanged(); 
     } 
    } 

} 

AllStuffModel.java

public class AllStuffModel { 
     private String name; 
     private String code; 
     private boolean isChecked; 


     public AllStuffModel(String code, String name) { 
      this.name = name; 
      this.code = code; 
     } 


     public String getName() { 
      return this.name; 
     } 


     public String getCode() { 
      return this.code; 
     } 


     public boolean isChecked() { 
      return isChecked; 
     } 


     public void setIsChecked(boolean isChecked) { 
      this.isChecked = isChecked; 
     } 
    } 

AllStuff.java 

    public class AllStuff { 

     private AllStuff() { 

     } 

     public static final AllStuffModel[] allConditions = { 
       new AllStuffModel("ca", "Candy"), 
       new AllStuffModel("fo", "Football"), 
       new AllStuffModel("mu", "Music"), 
       new AllStuffModel("sn", "Snooker"), 
     }; 

    } 

condition_row.xml

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" 
     android:paddingTop="10dp"> 

     <CheckBox 
      android:id="@+id/condition_checkbox" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="7dp" /> 

     <TextView 
      android:id="@+id/condition_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="TextView" 
      android:textColor="#DE000000" 
      android:textSize="17sp" /> 

    </LinearLayout> 

activity_main.xml 

    <?xml version="1.0" encoding="utf-8"?> 
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/scrollview_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 


     <SearchView 
      android:id="@+id/search_view" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:padding="2dp" 
      android:queryHint="Search...." /> 




     <ListView 
      android:id="@+id/condition_list" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"></ListView> 


    </LinearLayout> 

    </ScrollView> 

は、私は何をしようとしたことはAllStuffAdapterに私のonClickメソッドでnotifyDataSetChaanged()を使用しているが、これは完全にチェックされてからのチェックボックスを停止します。

TL/DR:検索フィルタでチェックボックスをオンにしたことを確認するにはどうすればよいですか?

+0

'hasStableIds'と' getItemId'の実装とは何かが関係していると思います - 一意のIDが必要です。また、 'getItem(position)'はフィルタリングされたデータセット間のuniqueIdではありません。リストは2つの全く異なるアイテムになることができますが、 'id'は同じです。 http://stackoverflow.com/a/26206584/4252352&http://stackoverflow.com/a/18217552/4252352 –

答えて

1

、私はこれは(あなたの変更を伴う)完全modelItems.get(position).setIsChecked(isChecked);後に問題を解決追加信じ@faranjit

conditionCheckBox.setOnCheckedChangeListener(null); 
conditionCheckBox.setChecked(modelItems.get(position).isChecked()); 
conditionCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      modelItems.get(position).setIsChecked(isChecked); 
     } 
    }); 
+0

ありがとうございます - 元の問題は解決されたようです。しかし、私が今問題を抱えているのは、何かをチェックすると(フィルタリングをしたとき)、通常のビューに戻り、そのチェックは保存されないということです。 – ak1652

+0

同様に、(フィルタリングされたビューで)正常にチェックされたもののチェックを外すと、この変更は反映されません。結果を返す前に 'notifyDataSetChanged();'を使用しようとしましたが、これによりアプリがクラッシュする可能性があります。これは、私がAllStuffAdapterではなく、ValueFilterクラスに入っているからだと思います。 TL/DR:フィルタされたビューを変更した場合、実際の通常のビューには反映されません。 – ak1652

+0

'getView'ではフィルタに' modelItems'を使用します.' filteredModelItems'を使用し、アダプタのコンストラクタにのみ割り当てられます。チェックボックスをクリックすると 'modelItems'は変更されますが、' filteredModelItems'は変更されません。これは問題の原因になると思います。 – faranjit

1

おかげに

conditionCheckBox.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      CheckBox currentCheckBox = (CheckBox) v; 
      if (currentCheckBox.isChecked()) { // If checked set to true, else false 
       modelItems.get(position).setIsChecked(true); 
      } else if (!currentCheckBox.isChecked()) { 
       modelItems.get(position).setIsChecked(false); 
      } 
      System.out.println(modelItems.get(position).isChecked()); 
     } 
    }); 

を変更してみてください。これは確認できますか?

リストを更新するには、適切な項目に一致するようにしてください。注:codeは自分で設定したものであり、いつでもユニークになることが保証されています。

関連する問題