2012-08-29 4 views
0

으로 전환 할 수 없습니다 내가 파일의 배열 설정 ArrayAdapter와,이 : 나는 항목 클릭하여 CheckedTextView의 체크 가능 상태를 변경하려면 다음CheckedTextView는 setOnItemClickListener에서 onCreate 방법

adapter = new ArrayAdapter<Item>(this, 
      R.layout.file_manager, R.id.checkedTextItem, 
      fileList) 
      { 


     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // creates view 
      LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View view = inflater.inflate(R.layout.item, null); 
      view.setFocusable(false); 
      CheckedTextView textView = (CheckedTextView) view 
        .findViewById(R.id.checkedTextItem); 

      // put the image on the text view 
      textView.setCompoundDrawablesWithIntrinsicBounds(
        fileList[position].icon, 0, 0, 0); 

      textView.setTextColor(Color.WHITE); 
      textView.setText(fileList[position].file); 
      if(fileList[position].icon == R.drawable.directory_icon) 
       textView.setCheckMarkDrawable(null); 
      else if(fileList[position].icon == R.drawable.directory_up) 
       textView.setCheckMarkDrawable(null); 

      // add margin between image and text (support various screen 
      // densities) 
      int dp5 = (int) (5 * getResources().getDisplayMetrics().density + 0.5f); 
      textView.setCompoundDrawablePadding(dp5); 

      textView.setFocusable(false); 

      return view; 

     } 
    }; 

합니다. 나는 이것을 좋아한다 :

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.file_manager); 
    lv = (ListView)findViewById(R.id.fileManagerList); 
    loadFileList(); 
    file_list = findViewById(R.id.filesList); 
    lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    lv.setFocusable(false); 
    lv.setAdapter(adapter); 

    lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { 
      public void onItemClick(AdapterView<?> myAdapter, View myView, int myItemInt, long mylng) { 
      //String selectedFromList = (lv.getItemAtPosition(myItemInt).toString()); 
      chosenFile = fileList[myItemInt].file; 
      File sel = new File(path + "/" + chosenFile); 

      if (sel.isDirectory()) { 

       firstLvl = false; 


       str.add(chosenFile); 

       fileList = null; 
       path = new File(sel + ""); 
       //adapter.notifyDataSetChanged(); 
       loadFileList(); 
       lv.setAdapter(adapter); 


      } 
      else if (chosenFile.equalsIgnoreCase("up") && !sel.exists()) { 

       // present directory removed from list 
       String s = str.remove(str.size() - 1); 

       // path modified to exclude present directory 
       path = new File(path.toString().substring(0, 
         path.toString().lastIndexOf(s))); 
       fileList = null; 

       // if there are no more directories in the list, then 
       // its the first level 
       if (str.isEmpty()) { 
        firstLvl = true; 
       } 

       loadFileList(); 
       lv.setAdapter(adapter); 
      } 
      else 
      { 
       View view = myAdapter.getChildAt(myItemInt); 
       CheckedTextView textView = (CheckedTextView) view 
         .findViewById(R.id.checkedTextItem);   
       Toast toast = Toast.makeText(getApplicationContext(),textView.isChecked(), Toast.LENGTH_LONG); 
       toast.show(); 

       textView.toggle(); 

       textView.setChecked(true); 
      } 

    } 

}); 


} 

click 이벤트가 제대로 처리되고있다. onCreate() 메서드의 else 문에서 CheckedTextView 항목을 가져올 수 있습니다. 해당 ID를 감지하고 해당 텍스트를 가져올 수도 있습니다. 하지만 그것을 토글하거나 setCheckable하려고하면 처리 할 수 ​​없습니다. 그럼에도 불구하고 내 어댑터의 모든 항목을 전환하거나 설정할 때 체크 상태가 변경 될 수 있습니다 ... 이유가 무엇일까요?

답변

1

Android에서보기를 재사용하기 때문에. 확인 가능한 항목 목록이 화면 너머로 스크롤되면 아래쪽에 표시된 새 항목이 이전 항목에서 재사용됩니다. 각 항목의 상태를 추적하고 (희소 배열이 잘 작동해야 함) 각보기에서 배열의 상태를 확인하고 이에 따라 checkedtextview를 설정하십시오.

+0

감사합니다. 하지만이 경우 왜 내가 클릭 한 항목의 getText()를 얻을 수 있습니까? 내가 그 제목을 논리적으로 할 수 있다면, 그것의 setCheckable() 상태를 바꿀 수있다 ... –

+0

나는 조언을 해줄 것이다 ... 그러나 나는 Item 클래스에서 체크 상태를 탐지하는 필드를 하나 더 만들었다. 이 항목. 그 후 항목을 클릭하면이 필드의 상태가 변경되고 내 어댑터의 notifyDataSetChanged()가 호출됩니다. 고마워요, 당신은 저를 해결책에 집어 넣었습니다! –