2016-11-24 63 views
0

說明: 我有一個對話框。其中,我有listview所有的數據被設置到列表視圖並顯示在對話框中。我能夠從列表視圖中選擇多個值,然後點擊應用按鈕我得到了選定的數據。如何在列表視圖中選擇多個值?

問題

問題是,當我再次打開該對話框我以前選擇不會在我的代碼中選擇。

我想要什麼?

當我再次打開對話框時,我的上一個選擇仍然在列表視圖項中被選中。我怎樣才能做到這一點?

item_dialog.xml

<?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="wrap_content" 
    android:background="#333044"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_above="@+id/ll_btn_actions"> 
     <ListView 
      android:id="@+id/item_list" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/ll_btn_actions" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true"> 

     <Button 
      android:id="@+id/btn_cancel" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/cancel" 
      android:background="@android:color/transparent" 
      android:textColor="@color/white" 
      android:textSize="@dimen/meet_details_fs" 
      android:gravity="center" 
      android:textAllCaps="false" 
      android:layout_weight="1"/> 
     <Button 
      android:id="@+id/btn_submit" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/apply" 
      android:background="@android:color/transparent" 
      android:textColor="@color/white" 
      android:textSize="@dimen/meet_details_fs" 
      android:gravity="center" 
      android:textAllCaps="false" 
      android:layout_weight="1"/> 
    </LinearLayout> 
</RelativeLayout> 

當我按下按鈕,對話框將在這裏開是打開的對話框中的代碼。

public void setitemDialog(final Activity activity, final List<Brand> compactStoreItemList) { 
     itemDialog = new Dialog(activity); 
     itemDialog.setContentView(R.layout.item_dialog); 
     itemDialog.setCancelable(true); 
     itemDialog.setTitle("Select Brands"); 
     itemDialog.setCanceledOnTouchOutside(true); 

     Button btnSubmit = (Button) itemDialog.findViewById(R.id.btn_submit); 
     Button btnCancel=(Button)itemDialog.findViewById(R.id.btn_cancel); 

     final ListView itemList = (ListView) itemDialog.findViewById(R.id.item_list); 
     final BrandAdapter adapter = new BrandAdapter(activity, compactStoreItemList, prefManager); 
     itemList.setAdapter(adapter); 

     itemList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       adapter.selectItem(position); 
      } 
     }); 
     btnCancel.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (itemDialog.isShowing()) { 
        itemDialog.dismiss(); 
       } 
      } 
     }); 
     btnSubmit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       brandList = new ArrayList<>(); 
       String brandNames = ""; 
       for (Brand a : adapter.getBox()) { 
        if (a.isChecked) { 
         Log.e(TAG, "BRAND IDS=>" + a.getId()); 
         brandList.add(a); 
//      tempArr.add(a); 
         brandNames += a.getBrandName() + ","; 
        } 
       } 
//    for(Brand b:tempArr){ 
// 
//     brandNames += b.getBrandName() + ","; 
//    } 
       spiBrand.setText(brandNames); 
       if (itemDialog.isShowing()) { 
        itemDialog.dismiss(); 
       } 
      } 
     }); 
     adapter.notifyDataSetChanged(); 
     itemDialog.show(); 
    } 

下面是由對話框調用並將值設置到listview中的適配器。

public class BrandAdapter extends BaseAdapter { 

    public static final String TAG=BrandAdapter.class.getSimpleName(); 

    public Activity activity; 
    private List<Brand> brandList; 
    private LayoutInflater inflater; 
    PreferenceSetting prefManager; 

    public BrandAdapter(Activity activity, List<Brand> brandList, PreferenceSetting preferenceSetting){ 
     this.activity=activity; 
     this.brandList=brandList; 
     prefManager=PreferenceSetting.getInstance(activity); 
     inflater=(LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

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

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

    public void selectItem(int position){ 
     brandList.get(position).isChecked = !brandList.get(position).isChecked; 
     notifyDataSetChanged(); 
    } 
    public ArrayList<Brand> getBox() { 
     ArrayList<Brand> box = new ArrayList<>(); 
     for (Brand p : brandList) { 
      if (p.isChecked) 
       box.add(p); 
     } 
     return box; 
    } 
    private class Holder{ 
     TextView brandName; 
     CheckBox checkBox; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     Holder holder; 
     if(convertView==null){ 
      holder=new Holder(); 
      convertView=inflater.inflate(R.layout.ac_problems_list,parent,false); 

      holder.brandName=(TextView)convertView.findViewById(R.id.txt_cooling); 
      holder.checkBox=(CheckBox)convertView.findViewById(R.id.cb_cooling); 

      convertView.setTag(holder); 
     } 
     else{ 
      holder=(Holder)convertView.getTag(); 
     } 

     final Brand brand=brandList.get(position); 
     holder.brandName.setText(brand.getBrandName()); 
//  for(Brand brand1:MeetingActivity.tempArr){ 
//   if(brand.getId()==brand1.getId()){ 
//    holder.checkBox.setChecked(brand1.isChecked); 
//    Log.e(TAG, "IS CHECKED=>" + brand.isChecked); 
//   } 
     holder.checkBox.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       selectItem(position); 
      } 
     }); 
     return convertView; 
    } 
} 

Brand.java

public class Brand { 

    public static final String BRAND_ID="id"; 
    public static final String BRAND_NAME="brand_name"; 
    public static final String USER_ID="user_id"; 
    public static final String DELETE_STATUS="delete_status"; 
    public static final String DISABLE_STATUS="disable_status"; 
    public static final String CREATED_ON="created_on"; 

    private int id; 
    private String brandName; 
    private String userId; 
    private String deleteStatus; 
    private String disableStatus; 
    private String createdOn; 
    public boolean isChecked = false; 

    public Brand(){} 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getBrandName() { 
     return brandName; 
    } 

    public void setBrandName(String brandName) { 
     this.brandName = brandName; 
    } 

    public String getUserId() { 
     return userId; 
    } 

    public void setUserId(String userId) { 
     this.userId = userId; 
    } 

    public String getDeleteStatus() { 
     return deleteStatus; 
    } 

    public void setDeleteStatus(String deleteStatus) { 
     this.deleteStatus = deleteStatus; 
    } 

    public String getDisableStatus() { 
     return disableStatus; 
    } 

    public void setDisableStatus(String disableStatus) { 
     this.disableStatus = disableStatus; 
    } 

    public String getCreatedOn() { 
     return createdOn; 
    } 

    public void setCreatedOn(String createdOn) { 
     this.createdOn = createdOn; 
    } 
} 

我怎樣才能做到這一點?請幫助我。

回答

0

在您的getView方法中,您應該檢查品牌對象上的isChecked並實現其中的邏輯。 (示出其價值器isChecked正確的設計狀態)

我做了一些與此類似,在這裏:

@Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
     Contract currentContract = mDataset.get(position); 
    if (app.isContractSelected()) { 
       if (currentContract.getContractNr() == app.getSelectedContract().getContractNr()) { 
        contractViewHolder.selector.setVisibility(View.VISIBLE); 
        contractViewHolder.listItem.setBackgroundColor(ContextCompat.getColor(mContext, R.color.veryLightGrey)); 
       } else { 
        contractViewHolder.selector.setVisibility(View.INVISIBLE); 
        TypedValue outValue = new TypedValue(); 
        mContext.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true); 
        contractViewHolder.listItem.setBackgroundResource(outValue.resourceId); 
       } 
      }} 
+0

當我再次打開對話框我的適配器刷新這是主要的問題。 –

+0

是的,但每次重新打開對話框時都會調用適配器的getView()。如果每次選擇/取消選擇時更新品牌對象的isChecked,並在getView中讀取它的值,則應該能夠實現您想要的效果 – estoke

+0

但是,我怎麼能實現我不知道的? –

0

可以爲您節省的複選框的狀態,例如在SharedPreferences當你的對話框關閉(自然之前),然後當對話框再次重新啓動時,您需要從SharedPreferences中讀取這些值,然後在對話框的初始化中設置這些值。您可以將布爾值置於sharedpreferences中,然後在創建對話框時再次讀取它們。

相關問題