2012-07-11 2 views
2

디렉터리 이름이 포함 된 ListView을 만들려고합니다. ListView에는 TextView에 폴더 이름이 표시되고 checkbox이 표시됩니다. 목록이 성공적으로 작성되었지만 목록을 위/아래로 스크롤 할 때 확인란 상태에 문제가 있습니다. 확인란의 상태가 임의로 변경됩니다. 확인란의 상태를 저장하려면 HashMap<String, Boolean>, 문자열의 연속을 지정하고 부울 - 확인란 상태. I 확인란의 스크롤 문제 같은 이유로 블로그 포스트를 만들었다체크 박스 스크롤 문제가 포함 된 ListView

public class MainActivity extends ListActivity implements OnClickListener { 

    Button done, cancel, selectAll; 

    ArrayList<String> m_list; 
    HashMap<String, Boolean> m_checkedMap; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     m_checkedMap = new HashMap<String, Boolean>(); 

     done = (Button) findViewById(R.id.bDone); 
     cancel = (Button) findViewById(R.id.bCancel); 
     selectAll = (Button) findViewById(R.id.bSelAll); 
     done.setOnClickListener(this); 
     cancel.setOnClickListener(this); 

     new AsyncHandler(this).execute(); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     Toast.makeText(this, m_list.get(position), Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onClick(View view) { 
     switch (view.getId()) { 
     case R.id.bDone: 
      //Update CheckedMap in DB 
      Toast.makeText(this, m_checkedMap.values().toString(), 
        Toast.LENGTH_LONG).show(); 
      break; 
     case R.id.bCancel: 
      this.finish(); 
      break; 
     } 
    } 

    public class AsyncHandler extends AsyncTask { 

     Context context; 
     public AsyncHandler(Context c) { 
      context = c; 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      Toast.makeText(context, "In onPreExecute()", Toast.LENGTH_SHORT) 
        .show(); 
     } 

     @Override 
     protected Object doInBackground(Object... arg0) { 
      getList(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Object result) { 
      // super.onPostExecute(result); 
      setListAdapter(new ElementAdapter(context, m_list, m_checkedMap)); 
     } 

     private void getList() { 
      m_list = new ArrayList<String>(); 
      File root = new File("/"); 
      File[] files = root.listFiles(); 
      for (File f : files) { 
       if (f.isDirectory() && !f.isHidden()) { 
        m_list.add(f.getName()); 
        m_checkedMap.put(f.getName(), false); 
       } 
      } 
      Collections.sort(m_list); 
     } 
    } 
} 

어댑터 클래스

public class ElementAdapter extends ArrayAdapter { 

    LinearLayout rowLayout; 
    ArrayList<String> items = new ArrayList<String>(); 
    TextView tvElement; 
    HashMap<String, Boolean> checkedMap; 
    CheckBox cBox; 
    Context context; 

    public ElementAdapter(Context c, ArrayList<String> elements, 
      HashMap<String, Boolean> m_checkedMap) { 
     super(c, R.layout.row, elements); 
     this.items = elements; 
     this.checkedMap = m_checkedMap; 
     this.context = c; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     if (view == null) { 
      LayoutInflater vi = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = vi.inflate(R.layout.row, null); 
     } 

     rowLayout = (LinearLayout) view.findViewById(R.id.row); 
     tvElement = (TextView) view.findViewById(R.id.tvElement); 
     tvElement.setText(items.get(position)); 
     cBox = (CheckBox) view.findViewById(R.id.checkBox1); 
     cBox.setOnClickListener(new OnClickListener() { 
      public void onClick(View paramView) { 
       if (cBox.isChecked()) { 
        //checkedMap.put(tvElement.getText().toString(), false); 
        checkedMap.put(items.get(position), false); 
       } else if (!cBox.isChecked()) { 
        //checkedMap.put(tvElement.getText().toString(), true); 
        checkedMap.put(items.get(position), true); 
       } 
      } 
     }); 
     cBox.setChecked(checkedMap.get(items.get(position))); 
     return view; 
    } 
} 

답변

3

MainActivity.java : 아래

는 (길이 죄송합니다) 코드입니다 ListView, ListView with CheckBox Scrolling Issue

+0

어떻게 작동했는지. 나는 그것을 완전히 이해하지 못했습니다. setTag() & getTag() [viewHolder.checkbox.setTag (position);]와 함께 정확하게 무엇이 진행되는지 설명해주십시오. – reiley

+0

setTag (position) setTag (position)은 뷰를 사용하여 더 자세하게 사용할 수있는 위치를 첨부합니다. int pos = (Integer) v.getTag();를 사용하여 같은 위치를 가져 오는 것을 볼 수 있습니다. 그것을 사용합니다. –

+0

안녕하세요, 귀하의 코드를 따라하고 잘 작동하지만 ... 지금은 다른 관련 문제를 만드는 것 같습니다. 이제 ArrayList는 대체 값을 유지합니다. 즉, 첫 번째 및 세 번째를 유지하고 두 번째 및 네 번째를 잊어 버립니다. [여기] (http://stackoverflow.com/questions/11486128/android-after-button-press-checkbox-oncheckedchange-not-working) – reiley

관련 문제