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;
}
}
어떻게 작동했는지. 나는 그것을 완전히 이해하지 못했습니다. setTag() & getTag() [viewHolder.checkbox.setTag (position);]와 함께 정확하게 무엇이 진행되는지 설명해주십시오. – reiley
setTag (position) setTag (position)은 뷰를 사용하여 더 자세하게 사용할 수있는 위치를 첨부합니다. int pos = (Integer) v.getTag();를 사용하여 같은 위치를 가져 오는 것을 볼 수 있습니다. 그것을 사용합니다. –
안녕하세요, 귀하의 코드를 따라하고 잘 작동하지만 ... 지금은 다른 관련 문제를 만드는 것 같습니다. 이제 ArrayList는 대체 값을 유지합니다. 즉, 첫 번째 및 세 번째를 유지하고 두 번째 및 네 번째를 잊어 버립니다. [여기] (http://stackoverflow.com/questions/11486128/android-after-button-press-checkbox-oncheckedchange-not-working) – reiley