2014-09-15 2 views
1

내 애플 리케이션의 중간에 ListView가 있고 TextView와 버튼을 보유하고있는 하단에 투명한 RelativeLayout을 추가했습니다. ListView에는 각 행에 대한 확인란이 있습니다. 내 문제는 내가 클릭 한 항목으로 목록에서 선택한 항목의 양을 TextView 채울 싶습니다. 그렇게 할 수있는 방법이 있습니까? 이 내 레이아웃입니다 :어댑터에서 체크 박스 수를 확인하는 방법은 무엇입니까?

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
    <TextView 
     android:text="@string/compare_information" 
     android:textColor="#8F8F8F" 
     android:textSize="20sp" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:background="@android:color/transparent" 
     android:layout_marginBottom="10dp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/informationText" /> 
    <ListView 
     android:id="@+id/lvCompare" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:divider="@null" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="5dp" 
     android:layout_below="@+id/informationText"> 

    </ListView> 
    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="75dp" 
     android:layout_alignParentBottom="true" 
     android:background="#90303030" > 
     <TextView 
      android:id="@+id/checkedItems" 
      android:text="0 of 10" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textColor="#EEEEEE" 
      android:textSize="14sp" 
      android:gravity="center_vertical|left" 
      /> 
     <Button 
      android:id="@+id/compare" 
      android:background="@drawable/filter_button_layout" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:gravity="center_vertical|right" 
      android:text="@string/compare" 
      android:textColor="#FFFFFF" 
      android:textSize="18sp" 
      /> 
    </RelativeLayout> 
</RelativeLayout> 

이 내 어댑터입니다 :

public class CompareListAdapter extends ArrayAdapter<Restaurant>{ 
     private ArrayList<Restaurant> list = new ArrayList<Restaurant>(); 
     private Context context; 
     private static int checkBoxCounter = 0; 
     private static int checkBoxInitialized = 0; 
     private int layoutResourceId; 
     private TextView cCheckedItems; 
     private final String INFORMATION_TEXT = "Select six companies to compare"; 

     public CompareListAdapter(Context context, int resource, 
       List<Restaurant> objects,TextView textViewToEdit) { 
      super(context, resource, objects); 
      this.context = context; 
      this.layoutResourceId = resource; 
      checkBoxCounter = 0; 
      cCheckedItems = textViewToEdit; 
      // We put the strings from the array in to the hash map for storing 
      for (int i = 0; i < objects.size(); ++i) { 
       list.add(objects.get(i)); 
      } 
     } 

     public View getView(final int position, View convertView, ViewGroup parent) { 
      View view = null; 
      if(convertView==null){ 
       LayoutInflater inflater=(LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
       view=inflater.inflate(layoutResourceId, parent, false); 
       final ViewHolder viewHolder = new ViewHolder(); 
       viewHolder.cName =(TextView) view.findViewById(R.id.rest_name_textView1); 
       viewHolder.addres1 =(TextView) view.findViewById(R.id.address1_textView2); 
       viewHolder.addres2 =(TextView) view.findViewById(R.id.address2_textView3); 
       viewHolder.openingTime =(TextView) view.findViewById(R.id.opening_hour_textView4); 
       viewHolder.distance =(TextView) view.findViewById(R.id.distance_user_textView5); 
       viewHolder.openImage =(ImageView)view.findViewById(R.id.clock_imageView2); 
       viewHolder.checkBox = (CheckBox) view.findViewById(R.id.checkBox1); 
       viewHolder.cbBackground = (RelativeLayout) view.findViewById(R.id.checkbox_layout); 
       viewHolder.rating = (RatingBar) view.findViewById(R.id.restaurant_ratingBar1); 
       viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
        @Override 
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
         if(isChecked && checkBoxCounter>=2){ 
          list.get(position).setChecked(false); 
          viewHolder.checkBox.setChecked(false); 
          viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background); 
         }else { 
          Restaurant element = (Restaurant) viewHolder.checkBox.getTag(); 
          element.setChecked(buttonView.isChecked()); 
          if (isChecked) { 
           viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background_checked); 
           checkBoxCounter++; 
          } else { 
           viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background); 
           checkBoxCounter--; 
          }        
         } 
        Log.d("MYLOG INSIDE getView", String.valueOf(cCheckedItems)); 
        cCheckedItems.setText(checkBoxCounter + " of 6"); 
        Toast.makeText(context, "there are " + checkBoxCounter + " items selected", Toast.LENGTH_LONG).show();}}); 
}}); 
       view.setTag(viewHolder); 
       viewHolder.checkBox.setTag(list.get(position)); 
      }else{ 
       view = convertView; 
       ((ViewHolder) view.getTag()).checkBox.setTag(list.get(position)); 
      } 
      ViewHolder viewHolder = (ViewHolder) view.getTag(); 
      Restaurant obj=list.get(position); 
      viewHolder.rating.setRating((float) obj.getRating()); 
      viewHolder.cName.setText(obj.getRestaurantName()); 
      viewHolder.addres1.setText(obj.getAddress1()); 
      viewHolder.addres2.setText(obj.getAddress2()); 
      viewHolder.openingTime.setText(obj.getDayOfWeek()+" "+obj.getOpeningHour()); 
      viewHolder.distance.setText(obj.getDistance()); 
      viewHolder.checkBox.setChecked(obj.isChecked()); 
      if(obj.isChecked()) { 
       viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background_checked); 
      }else{ 
       viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background); 
      } 
      boolean isOpen=checkForOpen(obj.getDayOfWeek(),obj.getOpeningHour()); 
      if(isOpen) 
       viewHolder.openImage.setImageResource(R.drawable.opened_logo); 
      else viewHolder.openImage.setImageResource(R.drawable.closed_logo); 
      return view; 
     } 
     private boolean checkForOpen(String weekDay,String openingTimeRange) { 
      Calendar cal = Calendar.getInstance(); 


      int currentMinute=cal.get(Calendar.HOUR_OF_DAY)*60+cal.get(Calendar.MINUTE);;//today.MINUTE; 
      int dayNo=cal.get(Calendar.DAY_OF_WEEK); 
      String []timeRange=openingTimeRange.split("-"); 

      int openingMn=Integer.parseInt(timeRange[0].substring(0,2))*60+Integer.parseInt(timeRange[0].substring(3,5)); 

      int closingMn=Integer.parseInt(timeRange[1].substring(0,2))*60+Integer.parseInt(timeRange[1].substring(3,5)); 

      if(weekDay.equals(getDayOfWeekFromDayNo(dayNo))&& currentMinute>=openingMn &&currentMinute<=closingMn) 
       return true; 


      return false; 
     } 
     public String getDayOfWeekFromDayNo(int dayNo) 
     { 
      String dayName=""; 
      switch (dayNo) { 
      case 1: 
       dayName="SUNDAY"; 
       break; 
      case 2: 
       dayName="MONDAY"; 
       break; 
      case 3: 
       dayName="TUESDAY"; 
       break; 
      case 4: 
       dayName="WEDNESDAY"; 
       break; 
      case 5: 
       dayName="THURSDAY"; 
       break; 
      case 6: 
       dayName="FRIDAY"; 
       break; 
      case 7: 
       dayName="SATERDAY"; 
       break; 

      default: 
       break; 
      } 
      return dayName;    
     } 
     static class ViewHolder{ 
      RatingBar rating; 
      CheckBox checkBox; 
      RelativeLayout cbBackground; 
      TextView cName, addres1, addres2, openingTime, distance; 
      ImageView openImage; 


     } 
    } 

업데이트 : 작업 알았어요. 내가 지금 IDE에서 작업하고있는 것을 추가했습니다. 생성자에서 TextView 요구 사항을 만들고 필요한 경우 TextView를 어댑터에 저장했습니다. TextView가 존재하는지 테스트하기위한 로그를 설정합니다. @SagarPilkhwal에게 감사의 말을 전합니다.

+0

'setOnCheckedChangeListener'에서'checkBoxCounter ++'와'checkBoxCounter -'를하고 있습니다.'checkBoxCounter'에 액세스하려고 했습니까? –

+0

하지만 'checkBoxCounter'는 어댑터에 있고 정보를 보내려는'TextView '는 조각보기에 있습니다. Wen 나는 어댑터에서'checkedItems' TextView를 얻으려고하는데 nullpointer 예외를 얻는다. –

+0

'(TextView) view.findViewById (R.id.checkedItems);'getView()'를 사용하여 해당 텍스트 뷰를 참조하고 있습니까? 'view.findViewById'에서'view' 대신 fragment view 객체를 사용하십시오. –

답변

0
private TextView cCheckedItems; 
.... 
cCheckedItems =(TextView) view.findViewById(R.id.checkedItems); 
.... 
    viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if(isChecked && checkBoxCounter>=2){ 
      list.get(position).setChecked(false); 
      viewHolder.checkBox.setChecked(false); 
      viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background); 
     }else { 
      Restaurant element = (Restaurant) viewHolder.checkBox.getTag(); 
      element.setChecked(buttonView.isChecked()); 
      if (isChecked) { 
       viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background_checked); 
       checkBoxCounter++;    
      } else { 
       viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background); 
       checkBoxCounter--; 
      } 
      cCheckedItems.setText(checkBoxCounter); //<-- ADD THIS 
      Toast.makeText(context, "there are " + checkBoxCounter + " items selected", Toast.LENGTH_LONG).show(); 
     }}}); 
관련 문제