2017-04-04 11 views
0

私はリストビューを使ってNLevelの拡張可能なリストを作っています。リストビューで最後のレベルのデータのみチェックボックスを追加しました。私は下のシナリオで立ち往生している。androidのリストを展開中にリフレッシュチェックボックスを避ける方法

チェックボックスをオンにすると、リストビューを拡張すると、チェックボックスが自動的にチェックされなくなります。そのようにはなりません。チェックボックスをオンにすると、手動でチェックを外すまでチェックが残るはずです。

誰か助けてください!私がここにこだわったのは二日間でした。事前に

MainActivity.java

public class MainActivity extends Activity { 

    List<NLevelItem> list; 
    ListView listView; 
    Context context; 
    Button checkButton; 
    ArrayList<String>tempList; 

    CheckBox selected = null; //Make only one selection at a time 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     listView = (ListView) findViewById(R.id.listView1); 
     list = new ArrayList<NLevelItem>(); 
     context = this; 
     checkButton = (Button)findViewById(R.id.buttons); 
     tempList = new ArrayList<String>(); 
     //here we create 5 grandparent (top level) NLevelItems 
     //then foreach grandparent create a random number of parent (second level) NLevelItems 
     //then foreach parent create a random number of children (third level) NLevelItems 

     //we pass in an anonymous instance of NLevelView to the NLevelItem, this NLevelView is 
     //what supplies the NLevelAdapter with a View for this NLevelItem 
     Random rng = new Random(); 
     final LayoutInflater inflater = LayoutInflater.from(this); 
     for (int i = 0; i < 5; i++) { 
      final NLevelItem grandParent = new NLevelItem(new SomeObject("GrandParent "+i),null, new NLevelView() { 

       @Override 
       public View getView(NLevelItem item) { 
        View view = inflater.inflate(R.layout.list_item, null); 
        TextView tv = (TextView) view.findViewById(R.id.textView); 
        //tv.setBackgroundColor(Color.GREEN); 
        String name = (String) ((SomeObject) item.getWrappedObject()).getName(); 
        tv.setText(name); 
        return view; 
       } 
      }); 
      list.add(grandParent); 

      int numChildren = rng.nextInt(4) + 1; 
      for (int j = 0; j < numChildren; j++) { 
       NLevelItem parent = new NLevelItem(new SomeObject("Parent "+j),grandParent, new NLevelView() { 

        @Override 
        public View getView(NLevelItem item) { 
         View view = inflater.inflate(R.layout.list_item, null); 
         TextView tv = (TextView) view.findViewById(R.id.textView); 
         //tv.setBackgroundColor(Color.YELLOW); 
         String name = (String) ((SomeObject) item.getWrappedObject()).getName(); 
         tv.setText(name); 
         return view; 
        } 
       }); 
       list.add(parent); 

       int children = rng.nextInt(3)+1; 
       for(int x=0; x<children;x++){ 
        final NLevelItem childs = new NLevelItem(new SomeObject("Parent1 "+x),parent, new NLevelView() { 

         @Override 
         public View getView(NLevelItem item) { 
          View view = inflater.inflate(R.layout.list_item, null); 
          TextView tv = (TextView) view.findViewById(R.id.textView); 
          //tv.setBackgroundColor(Color.BLUE); 
          String name = (String) ((SomeObject) item.getWrappedObject()).getName(); 
          tv.setText(name); 
          return view; 
         } 
        }); 
        list.add(childs); 

        int grandChildren = rng.nextInt(5)+1; 
        for(int k = 0; k < grandChildren; k++) { 
         NLevelItem child = new NLevelItem(new SomeObject("child "+k),childs, new NLevelView() { 

          @Override 
          public View getView(NLevelItem item) { 
           View view = inflater.inflate(R.layout.check_list, null); 
           TextView tv = (TextView) view.findViewById(R.id.checktextView); 
           final String name = (String) ((SomeObject) item.getWrappedObject()).getName(); 
           final CheckBox checkBox = (CheckBox)view.findViewById(R.id.check); 
           checkBox.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View v) { 
             if(selected != null){ //Edit 
              selected.setChecked(false); 
              } 
              selected = checkBox; //Edit 
             if(checkBox.isChecked()){ 

              tempList.add((String) ((SomeObject)childs.getWrappedObject()).getName()+"+"+name); 
             } 
             else { 
              tempList.remove((String) ((SomeObject)childs.getWrappedObject()).getName()+"+"+name); 
             } 
            } 
           }); 
           //tv.setBackgroundColor(Color.GRAY); 

           tv.setText(name); 
           return view; 
          } 
         }); 
         list.add(child); 
        } 
       } 

      } 
     } 

     NLevelAdapter adapter = new NLevelAdapter(list); 
     listView.setAdapter(adapter); 
     listView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
       ((NLevelAdapter)listView.getAdapter()).toggle(arg2); 
       ((NLevelAdapter)listView.getAdapter()).getFilter().filter(); 

      } 
     }); 

     checkButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       for (int i=0;i<tempList.size();i++){ 
        Toast.makeText(context,tempList.get(i),Toast.LENGTH_LONG).show(); 
       } 
      } 
     }); 


    } 

    class SomeObject { 
     public String name; 

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

} 

NLevelAdapter.java

public class NLevelAdapter extends BaseAdapter { 

     List<NLevelItem> list; 
     List<NLevelListItem> filtered; 
     public void setFiltered(ArrayList<NLevelListItem> filtered) { 
       this.filtered = filtered; 

     } 

     public NLevelAdapter(List<NLevelItem> list) { 
       this.list = list; 
       this.filtered = filterItems(); 
     } 

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

     @Override 
     public NLevelListItem getItem(int arg0) { 
       return filtered.get(arg0); 
     } 

     @Override 
     public long getItemId(int arg0) { 
       return 0; 
     } 

     @Override 
     public View getView(int arg0, View arg1, ViewGroup arg2) { 
       return getItem(arg0).getView(); 
     } 

     public NLevelFilter getFilter() { 
       return new NLevelFilter(); 
     } 


     class NLevelFilter { 

       public void filter() { 
         new AsyncFilter().execute(); 
       } 

       class AsyncFilter extends AsyncTask<Void, Void, ArrayList<NLevelListItem> > { 

         @Override 
         protected ArrayList<NLevelListItem> doInBackground(Void...arg0) { 
           return (ArrayList<NLevelListItem>)filterItems(); 
         } 

         @Override 
         protected void onPostExecute(ArrayList<NLevelListItem> result) { 
           setFiltered(result); 
           NLevelAdapter.this.notifyDataSetChanged(); 
         } 
       } 


     } 

     public List<NLevelListItem> filterItems() { 

      List<NLevelListItem> tempfiltered = new ArrayList<NLevelListItem>(); 
      OUTER: for (NLevelListItem item : list) { 
         //add expanded items and top level items 
         //if parent is null then its a top level item 
         if(item.getParent() == null) { 
           tempfiltered.add(item); 
         } else { 
           //go through each ancestor to make sure they are all expanded 
           NLevelListItem parent = item; 
           while ((parent = parent.getParent())!= null) { 
             if (!parent.isExpanded()) { 
                //one parent was not expanded 
                //skip the rest and continue the OUTER for loop 
                continue OUTER; 
             } 
           } 
           tempfiltered.add(item); 
         } 
       } 

       return tempfiltered;  
     } 

     public void toggle(int arg2) { 
        filtered.get(arg2).toggle(); 
     } 
} 

感謝!!:

は、ここに私のコードを行きますこのようにタグを設定し、取得する

答えて

0

チェックボックスの状態をboolean(チェックされている)に保存し、getView()が呼び出されたときにそのビューに反映させる必要があると思います。

1-ブールを追加NLevelItemにチェック:

private boolean checked = false; 
//add setter: setChecked(boolean) 
//add getter isChecked() 

2- getView()ブール使用(チェックボックスが追加された最後のもの)

@Override 
public View getView(final NLevelItem item) { 
// ....... 

    final CheckBox checkBox = (CheckBox)view.findViewById(R.id.check); 
    checkBox.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      //store checkbox state, note that NLevelItem item might need to be defined with 'final' 
      item.setChecked(checkBox.isChecked()); 

      if(checkBox.isChecked()){ 
       tempList.add((String) ((SomeObject)childs.getWrappedObject()).getName()+"+"+name); 
      } 
      else { 
       tempList.remove((String) ((SomeObject)childs.getWrappedObject()).getName()+"+"+name); 
      } 
     }//onClick() 
    }//setOnClickListener() 

    //update checkbox state from the corresponding NLevelItem 
    checkBox.setChecked(item.isChecked()); 

    //....... 
}//getView() 

-EDIT:

1つのアイテムを選択するには、すべてのアイテムを繰り返し実行する必要があります。チェックされた= falseを設定しますが、1

List<NLevelItem> list; 

または

List<NLevelListItem> filtered; 
アダプタクラスで

private void selectOnly(int position){ 
    for(int a=0;a<list.size();a++){ 
     if(a == position){ 
      list.get(a).setChecked(true); 
      continue; 
     } 
     list.get(a).setChecked(false); 
    }//for loop 
    notifyDataSetChanged(); // to update views (checkbox state) 
} 

使用法::私は、このチェックボックスの状態(にisChecked)新しい問題を作成しますselectOnly(15);

+0

ありがとうございました – appu

+0

もう一度疑問に思っています。時には1つの選択を行う方法 – appu

+0

@appu質問を更新しました。それはテストされていませんし、うまくいくかどうかわかりませんが、これがロジックです。 – Yazan

0

使用ViewHolderクラス:

public class ListAdapter extends BaseAdapter { 

    private Context con; 
    private List<String> dataLt; 
    private static LayoutInflater inflater = null; 

    public ListAdapter(Context context, List<String> dataList){ 
     con   = context; 
     dataLt  = dataList; 
     inflater = (LayoutInflater)con.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi = convertView; 
     ViewHolder holder; 

     if(convertView==null){ 

      /****** Inflate tabitem.xml file for each row (Defined below) *******/ 
      vi = inflater.inflate(R.layout.list_item_search, null); 
      /****** View Holder Object to contain tabitem.xml file elements ******/ 
      holder = new ViewHolder(); 
      holder.textView   = (TextView) vi.findViewById(R.id.textView); 
      /************ Set holder with LayoutInflater ************/ 
      vi.setTag(holder); 
     } 
     else 
      holder=(ViewHolder)vi.getTag(); 

     return vi; 
    } 

    public static class ViewHolder{ 
     TextView textView; 
    } 
} 

は、これが役立つことを願っています。

+0

考える上でそれを行うにはアイテムごとではなく、リサイクルされたビューごとに維持されます。つまり、スクロールすると、チェックされていないチェックボックス。 – Yazan

関連する問題