2014-11-17 2 views
0

У меня есть строка, которая представлена ​​изображением, некоторым текстом и CheckBoxes. Всякий раз, когда я пытаюсь использовать OnItemClickListener для строк, событие не запускается при нажатии CheckBoxes.Использование OnItemClickListener в CheckBoxes в ListView с адаптером

Я также пробовал checkbox.onCheckedChangedListener, но он дает мне Null Pointer в findViewByID. Я проверил, ID, который я ищу, в порядке, никаких опечаток.

Я бы хотел использовать этот OnItemClickListener, чтобы позже я мог играть с флажками. Есть идеи?

Код:

ADAPTER:

public class FilterAdapter extends BaseAdapter { 

    private Context mContext; 
    private ArrayList<String> mFilters; 
    private ArrayList<Integer> mPictures; 
    private Typeface Bebas, DroidSans; 


    public FilterAdapter(Context context, ArrayList<String> filters, ArrayList<Integer> pictures) { 
     this.mContext = context; 
     this.mFilters = filters; 
     this.mPictures = pictures; 
    } 

    @Override 
    public int getCount() { 
     return mFilters.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mFilters.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      LayoutInflater mInflater = (LayoutInflater) 
        mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
      convertView = mInflater.inflate(R.layout.category_filter_item, null); 
     } 

     DroidSans = Typeface.createFromAsset(mContext.getAssets(), "fonts/DroidSans.ttf"); 

     ImageView filter_img = (ImageView) convertView.findViewById(R.id.category_picture); 
     TextView filter_category = (TextView) convertView.findViewById(R.id.filter_category); 
     CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.check_box); 



     filter_category.setTypeface(DroidSans); 
     filter_category.setText(mFilters.get(position)); 
     filter_img.setBackgroundResource(mPictures.get(position)); 


     return convertView; 
    } 
} 

класса, где с помощью адаптера:

public class CheckinFilters extends Fragment { 

    private ListView mListView; 
    private FilterAdapter filterAdapter; 
    private ArrayList<String> l = new ArrayList<String>(); 
    private ArrayList<Integer> drawables = new ArrayList<Integer>(); 
    private Typeface Bebas; 
    private ArrayList<Integer> checkboxes = new ArrayList<Integer>(); 
    private SharedPreferences sharedPreferences; 
    private SharedPreferences.Editor editor; 


    public CheckinFilters() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     final View view = inflater.inflate(R.layout.fragment_checkin_filters, container, false); 


     l.add("Chill"); 
     l.add("Eat"); 
     l.add("Explore"); 
     l.add("Move"); 
     l.add("Party"); 
     l.add("Whatever"); 

     drawables.add(R.drawable.category_chill); 
     drawables.add(R.drawable.category_eat); 
     drawables.add(R.drawable.category_explore); 
     drawables.add(R.drawable.category_move); 
     drawables.add(R.drawable.category_party); 
     drawables.add(R.drawable.category_whatever); 

     mListView = (ListView) view.findViewById(R.id.filter_list); 
     filterAdapter = new FilterAdapter(view.getContext(), l, drawables); 
     mListView.setAdapter(filterAdapter); 


     sharedPreferences = getActivity().getPreferences(Context.MODE_PRIVATE); 
     editor = sharedPreferences.edit(); 

     Bebas = Typeface.createFromAsset(view.getContext().getAssets(), "fonts/BebasNeue.otf"); 

     TextView mainHeader = (TextView) view.findViewById(R.id.filters_text); 
     mainHeader.setTypeface(Bebas); 

     SearchView filter_categories = (SearchView) view.findViewById(R.id.filter_categories); 

     int searchImgID = getResources().getIdentifier("android:id/search_button", null, null); 
     ImageView searchViewHint = (ImageView) filter_categories.findViewById(searchImgID); 
     searchViewHint.setImageResource(R.drawable.ab_icon_search); 

     int searchPlateID = filter_categories.getContext().getResources().getIdentifier("android:id/search_plate", null, null); 
     View searchPlateView = filter_categories.findViewById(searchPlateID); 
     if (searchPlateView != null) { 
      searchPlateView.setBackgroundResource(R.drawable.search_location_shape); 
     } 

     int searchViewID = filter_categories.getContext().getResources().getIdentifier("android:id/search_src_text", null, null); 
     TextView textView = (TextView) filter_categories.findViewById(searchViewID); 
     textView.setTextColor(Color.GRAY); 

     CheckBox checkBox = (CheckBox) view.findViewById(R.id.check_box); 

     return view; 
    } 

    private void save() { 
     sharedPreferences = getActivity().getPreferences(Context.MODE_PRIVATE); 
     editor = sharedPreferences.edit(); 
     editor.putInt("first", checkboxes.size()); 

     for (int i = 0; i < checkboxes.size(); i++) { 
      editor.remove("Status_" + i); 
      editor.putInt("Status_" + i, checkboxes.get(i)); 
     } 

     editor.commit(); 
    } 

    private void load() { 
     sharedPreferences = getActivity().getPreferences(Context.MODE_PRIVATE); 
     int size = sharedPreferences.getInt("first", 0); 

     for (int i = 0; i < size; i++) { 
      checkboxes.add(sharedPreferences.getInt("Status_" + i, 0)); 
     } 

    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     save(); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     load(); 

    } 
} 

Layout Я накачивания для адаптера:

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="#ECF0F1"> 

     <ImageView 
      android:id="@+id/category_picture" 
      android:layout_width="70dp" 
      android:layout_height="60dp" 
      android:background="@drawable/sm_profile"/> 

     <TextView 
      android:id="@+id/filter_category" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerVertical="true" 
      android:layout_toRightOf="@+id/category_picture" 
      android:padding="10dp" 
      android:text="Party" 
      android:textColor="@color/enloop_dark_gray" 
      android:textSize="18dp"/> 

     <CheckBox 
      android:id="@+id/check_box" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_centerVertical="true" 
      android:focusable="false" 
      android:focusableInTouchMode="false" 
      android:padding="10dp"/> 

    </RelativeLayout> 

</RelativeLayout> 
+0

Ваш код пожалуйста :) –

+0

пожалуйста, поделитесь код WHT у попытались – koutuk

+0

я редактировал свой вопрос, пожалуйста, посмотрите :) – funkycookie

ответ

0

Вместо использования OnItemClickListener в CheckinFilters.java, вы должны добавить этот код в getView() метод FilterAdapter. Вы фактически добавляете флажок для каждой строки, но флажок id для всех одинаковый, поэтому вы не можете применять индивидуальный код для каждого флажка.

Для того, чтобы использовать все флажки, вы можете поместить код в getView(), потому что он также содержит аргумент, называемый позицией. Таким образом, вы можете просто получить позицию и применить OnItemClickListener к каждому отдельному флажку. Таким образом, это сработает.

public class FilterAdapter extends BaseAdapter { 

private Context mContext; 
private ArrayList<String> mFilters; 
private ArrayList<Integer> mPictures; 
private Typeface Bebas, DroidSans; 


public FilterAdapter(Context context, ArrayList<String> filters, ArrayList<Integer> pictures) { 
    this.mContext = context; 
    this.mFilters = filters; 
    this.mPictures = pictures; 
} 

@Override 
public int getCount() { 
    return mFilters.size(); 
} 

@Override 
public Object getItem(int position) { 
    return mFilters.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     LayoutInflater mInflater = (LayoutInflater) 
       mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     convertView = mInflater.inflate(R.layout.category_filter_item, null); 
    } 

    DroidSans = Typeface.createFromAsset(mContext.getAssets(), "fonts/DroidSans.ttf"); 

    ImageView filter_img = (ImageView) convertView.findViewById(R.id.category_picture); 
    TextView filter_category = (TextView) convertView.findViewById(R.id.filter_category); 
    CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.check_box); 



    filter_category.setTypeface(DroidSans); 
    filter_category.setText(mFilters.get(position)); 
    filter_img.setBackgroundResource(mPictures.get(position)); 

    if(position == 0) { 
     checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked) 

      else { 

      } 

     } 
    }); 
    } 

    //Similarly add OnClickListener to other checkboxes. 


    return convertView; 
} 
} 
+0

ОК, но как же работает OnItemClickListener? Если я щелкнул в другом месте, но на checkbox, он запустит это событие. Должен быть способ сделать это так, как я хочу. – funkycookie

+0

@ PopAlex-Cristian Я разместил код, вам просто нужно проверить позицию и добавить слушателя в этот флажок. –

Смежные вопросы