0
두 개의 개별 항목, 섹션의 헤더 및 각 헤더의 체크 가능한 항목으로 내 사용자 정의 listview를 구현하려고합니다.체크 박스가있는 안 드 로이드 목록보기는 edittext의 입력을 기준으로 선택합니다.
edittext에 텍스트를 입력 한 다음 검사 가능한 요소 목록을 반복하고 입력과 일치하는 것을 찾고 해당 행의 확인란을 설정하면됩니다.
두 슬라이딩 단편을 관리하기 위해 fragmentpager 어댑터를 사용하고 있습니다.
기본적으로 가장 좋은 방법은 목록 항목의 선택 상태를 변경할 수 있어야하지만 onitemcheckedlistener뿐만 아니라 텍스트 상자에 무언가를 입력하는 것입니다. 당신이 올바른 생각을 가지고있는 것처럼
public class RetrieveListAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<ScanInfo> list = new ArrayList<ScanInfo>();
private static LayoutInflater inflater = null;
private TreeSet mSeparatorsSet = new TreeSet();
public RetrieveListAdapter(Activity a) {
activity = a;
//list = si;
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return list.size();
}
public void addItem(final ScanInfo item) {
list.add(item);
notifyDataSetChanged();
}
public void addSeparatorItem(final ScanInfo item) {
list.add(item);
mSeparatorsSet.add(list.size() - 1);
// save separator position
//mSeparatorsSet.add(mData.size() - 1);
notifyDataSetChanged();
}
public ScanInfo getItem(int position) {
return list.get(position);
}
@Override
public int getItemViewType(int position) {
return mSeparatorsSet.contains(position) ? 0 : 1;
}
@Override
public int getViewTypeCount() {
return 2;
}
public long getItemId(int position) {
return position;
}
public void checkItem(String tracking) {
for (int i = 0; i < list.size(); i++) {
if (getItemViewType(i) == 1) {
if (tracking.equals(getItem(i).getTracking())) {
RetrievePackage.checkedItems[i] = true;
}
}
}
}
public View getView(final int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case 0:
convertView = inflater.inflate(R.layout.single_list_item, null);
holder.textView = (TextView) convertView.findViewById(R.id.text1);
holder.textView.setText(list.get(position).getLocation());
break;
case 1:
convertView = inflater.inflate(R.layout.retrieve_package_item, null);
holder.textView = (TextView) convertView.findViewById(R.id.trackingListItem);
holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox1);
if (list.get(position).getShortDisplayTracking().equals("")) {
holder.textView.setText(list.get(position).getTracking() + " [" + list.get(position).getCarrier() + "]");
} else {
holder.textView.setText(list.get(position).getShortDisplayTracking() + " [" + list.get(position).getCarrier() + "]");
}
holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
RetrievePackage.checkedItems[position] = isChecked;
}
});
holder.checkBox.setChecked(RetrievePackage.checkedItems[position]);
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
switch (type) {
case 0:
holder.textView.setText(list.get(position).getLocation());
break;
case 1:
if (list.get(position).getShortDisplayTracking().equals("")) {
holder.textView.setText(list.get(position).getTracking() + " [" + list.get(position).getCarrier() + "]");
} else {
holder.textView.setText(list.get(position).getShortDisplayTracking() + " [" + list.get(position).getCarrier() + "]");
}
break;
}
return convertView;
}
public static class ViewHolder {
public TextView textView;
public CheckBox checkBox;
}
은}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View V = inflater.inflate(R.layout.retrieve_packages, null);
submitRetrieve = (Button) V.findViewById(R.id.retrievePackages);
tracking = (EditText) V.findViewById(R.id.scanTrackingRet);
lv = (ListView) V.findViewById(R.id.retrieveList);
submitRetrieve.setEnabled(false);
activity = getActivity();
context = getActivity().getApplicationContext();
adapter = new RetrieveListAdapter(activity);
return V;
}
private static void initializePackageScan() {
checkedItems = new boolean[adapter.getCount()];
tracking.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_NEXT || actionId == EditorInfo.IME_ACTION_DONE) {
String number = tracking.getText().toString();
adapter.checkItem(number);
}
return true;
}
});
}
내가 혼란스러워하는 부분을 보았습니다. getView 메소드 외부에서 체크 상자를 어떻게 참조할까요? 내 edittext 제출 메서드를 호출하여 체크 확인란을 설정할 수 있어야합니다. –
원본 데이터를 변경하는 경우 확인란을 직접 참조하지 않아도됩니다. notifyDataSetChanged()를 호출하면 ListView를 다시 생성하도록 어댑터가 프롬프트되어야합니다. EditText에 항목을 입력 할 때 "list"에서 일치하는 항목을 검색하면 일치 항목을 "checked"로 설정 한 다음 notifyDataSetChanged()를 호출하여 ListView가 업데이트되도록합니다. – Sector95
당신은 절대적으로 옳습니다. nofityDataSetChanged를 사용하여 뷰를 다시 생성해야했습니다. 감사! –