2013-05-29 2 views
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; 
     } 
    }); 
} 

답변

1

같습니다; 항목을 "checked"로 설정 한 다음 항목을 추가 한 것처럼 notifyDataSetChanged()를 호출하십시오.

+0

내가 혼란스러워하는 부분을 보았습니다. getView 메소드 외부에서 체크 상자를 어떻게 참조할까요? 내 edittext 제출 메서드를 호출하여 체크 확인란을 설정할 수 있어야합니다. –

+0

원본 데이터를 변경하는 경우 확인란을 직접 참조하지 않아도됩니다. notifyDataSetChanged()를 호출하면 ListView를 다시 생성하도록 어댑터가 프롬프트되어야합니다. EditText에 항목을 입력 할 때 "list"에서 일치하는 항목을 검색하면 일치 항목을 "checked"로 설정 한 다음 notifyDataSetChanged()를 호출하여 ListView가 업데이트되도록합니다. – Sector95

+0

당신은 절대적으로 옳습니다. nofityDataSetChanged를 사용하여 뷰를 다시 생성해야했습니다. 감사! –

관련 문제