2017-08-09 67 views
-1

我使用自定义列表视图复选框和text.Data来自服务器,如果有任何项目是可用的服务器上显示为列表view.but检查,但如果我取消选择一些项目(复选框)在滚动列表视图后再次被选中。 任何建议都会有所帮助。 这是我的适配器类:复选框再次滚动列表视图后检查

public class SetWorkAdapter extends BaseAdapter { 
    Context mContext; 
    public ArrayList<SubStkMarket> mSubStkMarkets; 
    checkBoxListener checkBoxListener; 
    ArrayList<MarketNameUID> arrayList; 

    public SetWorkAdapter(Context mContext, ArrayList<SubStkMarket> mSubStkMarkets,ArrayList<MarketNameUID> arrayList) { 
     this.mContext = mContext; 
     this.mSubStkMarkets = mSubStkMarkets; 
     this.arrayList=arrayList; 
    } 
    public interface checkBoxListener { 
     public void onCheckBoxClick(int position, boolean isChecked, ArrayList<MarketNameUID> mList); 
    } 
    public void setCustomButtonListner(checkBoxListener listener) { 
     this.checkBoxListener = listener; 
    } 
    @Override 
    public int getCount() { 
     return mSubStkMarkets.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return null; 
    } 

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

    @Override 
    public View getView(final int position, View view, ViewGroup viewGroup) { 
     View convertview; 
     TextView code, name; 
     final CheckBox checkBox; 
     convertview = LayoutInflater.from(mContext).inflate(R.layout.set_work_type_item, null); 
     code = (TextView) convertview.findViewById(R.id.set_work_type_item_market_code); 
     name = (TextView) convertview.findViewById(R.id.set_work_type_item_market_name); 
     checkBox = (CheckBox) convertview.findViewById(R.id.set_work_type_item_market_checkbox); 
     SubStkMarket subStkMarket = mSubStkMarkets.get(position); 
     checkBox.setChecked(subStkMarket.isSelected()); 
     code.setText(String.valueOf(subStkMarket.getSubStkUID())); 
     name.setText(subStkMarket.getMarketName()); 
     if(arrayList!=null) 
     { 
      for(int i=0;i<arrayList.size();i++) 
      { 
       String marketName = arrayList.get(i).getMarketName(); 
       if(marketName.equalsIgnoreCase(subStkMarket.getMarketName())) 
       { 
        checkBox.setChecked(true); 
       } 
      } 
      int cnt=arrayList.size(); 
     } 
     checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 

       if (checkBoxListener != null) { 


        checkBoxListener.onCheckBoxClick(position,isChecked,arrayList); 
       } 
      } 
     }); 

     return convertview; 
    } 


    } 
+1

是什么'onCheckBoxClick'的实施?你并没有改变'subStkMarket'的'selected'状态,但它不是很清楚'arraylist'是什么 – Yazan

+0

更好地使用recyclerview –

回答

0

更改选择从ArrayList对象状态。

checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 

      if (checkBoxListener != null) { 
       checkBoxListener.onCheckBoxClick(position,isChecked,arrayList); 
       subStkMarket.setSelected(isChecked); 
      } 
     } 
    }); 

您可能需要声明subStkMarketfinal

0

我建议你阅读列表视图和适配器。请参阅此article。您必须将检查的状态存储在模型中的数组或ArrayList中,并将其置回getView之内。下面是一个代码示例:

 //define your custom adapter 
    private class CustomAdapter extends ArrayAdapter<HashMap<String, Object>> 
    { 
       // boolean array for storing 
       //the state of each CheckBox 
       boolean[] checkBoxState; 
        
       
       ViewHolder viewHolder; 
        
       public CustomAdapter(Context context, int textViewResourceId, 
       ArrayList<HashMap<String, Object>> players) { 
      
        //let android do the initializing :) 
        super(context, textViewResourceId, players); 
         
      //create the boolean array with 
       //initial state as false 
      checkBoxState=new boolean[players.size()]; 
      } 
      
      
        //class for caching the views in a row  
     private class ViewHolder 
     { 
       ImageView photo; 
       TextView name,team; 
       CheckBox checkBox; 
     } 
      
        
      
     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      
       if(convertView==null) 
        { 
       convertView=inflater.inflate(R.layout.players_layout, null); 
       viewHolder=new ViewHolder(); 
      
        //cache the views 
        viewHolder.photo=(ImageView) convertView.findViewById(R.id.photo); 
        viewHolder.name=(TextView) convertView.findViewById(R.id.name); 
        viewHolder.team=(TextView) convertView.findViewById(R.id.team); 
        viewHolder.checkBox=(CheckBox) convertView.findViewById(R.id.checkBox); 
      
         //link the cached views to the convertview 
        convertView.setTag(viewHolder); 
         
      
      } 
      else 
       viewHolder=(ViewHolder) convertView.getTag(); 
      
                 
      int photoId=(Integer) players.get(position).get("photo"); 
      
      //set the data to be displayed 
      viewHolder.photo.setImageDrawable(getResources().getDrawable(photoId)); 
      viewHolder.name.setText(players.get(position).get("name").toString()); 
      viewHolder.team.setText(players.get(position).get("team").toString()); 
         
       //VITAL PART!!! Set the state of the 
       //CheckBox using the boolean array 
            viewHolder.checkBox.setChecked(checkBoxState[position]); 
                  
               
               //for managing the state of the boolean 
               //array according to the state of the 
               //CheckBox 
                
               viewHolder.checkBox.setOnClickListener(new View.OnClickListener() { 
          
       public void onClick(View v) { 
        if(((CheckBox)v).isChecked()) 
         checkBoxState[position]=true; 
        else 
         checkBoxState[position]=false; 
           
        } 
       }); 
      
       //return the view to be displayed 
       return convertView; 
      } 
      
     } 
0

只是防止你RecyclerView使用回收:

recyclerView.getRecycledViewPool().setMaxRecycledViews(0,0); 

但它可以使一些滚动时滞后,最好的办法是保存内部的HashMapCheckBox检查状态像这样的Singleton内:

HashMap<Integer, Boolean> map = new HashMap<>();// key is the position, value is status. 

例如:

​​

和适配器内:

checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       MySingleton.getInstance.map.put(position, isChecked); 
      } 
     }); 

那么当加载调用HashMap

if (MySingleton.getInstance().map.containsKey(position)) { 
     checkBox.setChecked(map.get(position)); 
} 
0

你明白我的问题是因为在Android重用UI对象名单。

更改此:

for(int i=0;i<arrayList.size();i++) 
     { 
      String marketName = arrayList.get(i).getMarketName(); 
      if(marketName.equalsIgnoreCase(subStkMarket.getMarketName())) 
      { 
       checkBox.setChecked(true); 
      } 
     } 

这样:

  for(int i=0;i<arrayList.size();i++) 
       { 
        String marketName = arrayList.get(i).getMarketName(); 
        if(marketName.equalsIgnoreCase(subStkMarket.getMarketName())) 
        { 
         checkBox.setChecked(true); 
        }else{ 
         checkBox.setChecked(false); 
        } 
       } 
-1

这帮助我

for(int i=0;i<arrayList.size();i++) 
     { 
      String marketName = arrayList.get(i).getMarketName(); 
      if(marketName.equalsIgnoreCase(subStkMarket.getMarketName())) 
      { 

       if(subStkMarket.isSelected()==true) 
       { 
        subStkMarket.setSelected(true); 
        checkBox.setChecked(true); 
       } 

      } 
     } 
相关问题