2016-12-27 17 views
-2

У меня есть пользовательский вид (который имеет флажок) для listview. Я также добавил checkbox в макете деятельности, чтобы выбрать все checkboxes. Я получаю все пункты listview, когда я выбираю действие, но я не могу сделать все checkboxes в listview, как было проверено. Когда я пытался использовать getChildAt() в цикле for, я получаю Null Pointer.Как получить элемент строки списка с помощью getChildAt

// row layout 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:id="@+id/rootlay"> 

    <CheckBox 
     android:id="@+id/cbBox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" > 
    </CheckBox> 

    <LinearLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="5dp" 
     android:orientation="vertical" 
     android:layout_weight="1" > 

     <TextView 
      android:id="@+id/tvDescr" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="5dp" 
      android:text="" 
      android:textSize="20sp" > 
     </TextView> 

     <TextView 
      android:id="@+id/tvPrice" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="5dp" 
      android:text="" > 
     </TextView> 
    </LinearLayout> 


</LinearLayout> 
public class ContactsPickerActivity extends AppCompatActivity{ 

    ArrayList<Model> arrayList = new ArrayList<>(); 
    ListView list; 
    CustomAdapter adapter; 
    CheckBox selectall; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_contact); 

     list = (ListView)findViewById(R.id.list); 
     Button loadbtn = (Button)findViewById(R.id.loadbtn); 
     loadbtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ 
        askForPermission(Manifest.permission.READ_CONTACTS,1100); 
       }else{ 
        new LoadContactsAyscn().execute(); 
       } 

      } 
     }); 

     Button getbtn = (Button)findViewById(R.id.getbtn); 
     getbtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       String result = "Selected Product are :"; 
       for (Model p : adapter.getBox()) { 
        if (p.box){ 
         result += "\n" + p.price; 
        } 
       } 
       Toast.makeText(ContactsPickerActivity.this, result, Toast.LENGTH_LONG).show(); 
      } 
     }); 

     adapter = new CustomAdapter(ContactsPickerActivity.this, arrayList); 
     list.setAdapter(adapter); 

     selectall = (CheckBox)findViewById(R.id.selectall); 
     selectall.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
       if(b){ 
        int count = list.getAdapter().getCount(); 
        System.out.println("sammy_total_count "+count); 
        for(int i=0; i<count; i++){ 
         adapter.getProduct(i).box=true; 
         LinearLayout itemlay = (LinearLayout)list.getChildAt(i); 
         CheckBox checkBox = (CheckBox)itemlay.findViewById(R.id.cbBox); 
         checkBox.setTag(i); 
         checkBox.setChecked(adapter.getProduct(i).box); 
        } 
       }else{ 
        int count = list.getAdapter().getCount(); 
        System.out.println("sammy_total_count "+count); 
        for(int i=0; i<count; i++){ 
         adapter.getProduct(i).box=false; 
         LinearLayout itemlay = (LinearLayout)list.getChildAt(i); 
         CheckBox checkBox = (CheckBox)itemlay.findViewById(R.id.cbBox); 
         checkBox.setTag(i); 
         checkBox.setChecked(adapter.getProduct(i).box); 
        } 
       } 

      } 
     }); 
    } 

    private void askForPermission(String permission, Integer requestCode) { 
     System.out.println("sammy_reached_askForPermission"); 
     if (ContextCompat.checkSelfPermission(ContactsPickerActivity.this, permission) != PackageManager.PERMISSION_GRANTED) { 

      if(ActivityCompat.shouldShowRequestPermissionRationale(ContactsPickerActivity.this, permission)) { 
       // if (shouldShowRequestPermissionRationale(permission)) { // for fragment 

       ActivityCompat.requestPermissions(ContactsPickerActivity.this, new String[]{permission}, requestCode); 
       // requestPermissions(new String[]{permission}, requestCode); // for fragment 

      } else { 

       ActivityCompat.requestPermissions(ContactsPickerActivity.this, new String[]{permission}, requestCode); 
       // requestPermissions(new String[]{permission}, requestCode); // for fragment 
      } 
     } else { 
      new LoadContactsAyscn().execute(); 
     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     System.out.println("sammy_reached_onRequestPermissionsResult"); 
     if(ActivityCompat.checkSelfPermission(ContactsPickerActivity.this, permissions[0]) == PackageManager.PERMISSION_GRANTED){ 
      if(requestCode==1100){ 
       new LoadContactsAyscn().execute(); 
      } 
      Toast.makeText(ContactsPickerActivity.this, "Permission granted", Toast.LENGTH_SHORT).show(); 
     }else{ 
      Toast.makeText(ContactsPickerActivity.this, "Permission denied", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    class LoadContactsAyscn extends AsyncTask<Void, Void, ArrayList<Model>> { 
     ProgressDialog pd; 

     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 

      pd = ProgressDialog.show(ContactsPickerActivity.this, "Loading Contacts", 
        "Please Wait"); 
     } 

     @Override 
     protected ArrayList<Model> doInBackground(Void... params) { 


      Cursor c = getContentResolver().query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
        null, null, null); 
      while (c.moveToNext()) { 

       String contactName = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
       String phNumber = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 


       arrayList.add(new Model(contactName,phNumber, false)); 

      } 
      c.close(); 

      return arrayList; 
     } 

     @Override 
     protected void onPostExecute(ArrayList<Model> contacts) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(contacts); 

      pd.cancel(); 
      adapter.notifyDataSetChanged(); 


     } 

    } 
} 
+0

где вы инициализируете адаптер? –

+0

Что такое список и где вы его инициализировали? –

+0

в Activty. @RandykaYudhistira –

ответ

0

Изменение, как это,

for(int i=0; i<count; i++){ 
        adapter.getProduct(i).box=true; 
        View rowView = list.getChildAt(i); 
        LinearLayout itemlay = (LinearLayout)rowView.findViewById(R.id.id); 
        CheckBox checkBox = (CheckBox)rowView.findViewById(R.id.cbBox); 
        checkBox.setTag(i); 
        checkBox.setChecked(adapter.getProduct(i).box); 
       } 

Вот вопрос видимых элементов и общих элементов. NPE получает, потому что не все элементы в поле зрения. Так что вам нужно изменить так,

for(int i=0; i<count; i++){ 
        adapter.getProduct(i).box=true; 
        notifyDataSetChanged(); 
       } 

А внутри списка адаптер GetView метод

checkBox.setChecked(adapter.getProduct(i).box); 

Убедитесь, что getProduct (I) значение .box() не равно нулю

+0

Я использовал приведенный выше код, но все же предоставляю NPE @ Exigente05 –

+0

, какой идентификатор вы используете для получения LinearLayout? – Exigente05

+0

R.id.rootlay @ Exigente05 –

1

Лучше вы можете определить один

 ArrayList<ViewHolder> holders = new ArrayList<>(); 

и в адаптере просто добавьте держатели в список как

  holders.add(holder); 

и всякий раз, когда вы нажимаете флажок просто получить держатель и получить флажок и установить состояние флажка, как следующий

(holders.get(POSITION)).checkbox.setChecked(boolean); 

это будет простым и легким сделать ....

Надеюсь, это поможет !!!

0

Я думаю, вы должны изменить "box" в ваших моделях и использовать notifyDataSetChanged().

ListView будет обновлен, а CheckBoxes будет обновлен на поле boolean.