2014-10-04 47 views
1

這裏是我的自定義ListViewAdapter如何更新TextView的文本取決於複選框的狀態在列表視圖

public class ListViewAdapter extends BaseAdapter{ 


    Viewholder holder; 
    public ArrayList<HashMap<?, ?>>list; 
    public ArrayList<Integer> add; 
    Activity activity; 
    boolean [] checkedItems; 

    String []ckboxTextAdd; 
    DbAdapter db; 
    /* 
    * Constructor Calling 
    */ 

    public ListViewAdapter(Activity activity,ArrayList<HashMap<? , ?>>list) { 
     // TODO Auto-generated constructor stub 
     super(); 
     this.activity=activity; 
     this.list=list; 
     add=new ArrayList<Integer>(list.size()); 
     db=new DbAdapter(activity); 
     db.open(); 
     checkedItems= new boolean[list.size()]; 

     ckboxTextAdd=new String[list.size()]; 
     for(int i=0;i<list.size();i++) 
     { 
      checkedItems[i]=false; 
      ckboxTextAdd[i]="Add"; 

     } 

    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return list.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public View getView(final int position, View convertview, ViewGroup parent) { 
     // TODO Auto-generated method stub 

     LayoutInflater layoutInflater=activity.getLayoutInflater(); 
     final HashMap<?, ?> map=list.get(position); 
     if(convertview==null) 
     { 
     convertview=layoutInflater.inflate(R.layout.l_view,parent,false); 
     holder = new Viewholder(); 
     holder.title=(TextView) convertview.findViewById(R.id.serving_size_grams); 
     holder.servingsize=(TextView) convertview.findViewById(R.id.tvprotiendesclabel); 
     holder.Fiber=(TextView)convertview.findViewById(R.id.Fiberview); 

     holder.carbs=(TextView)convertview.findViewById(R.id.carbsview); 
     holder.sodium=(TextView)convertview.findViewById(R.id.sodiumview); 
     holder.proteins=(TextView)convertview.findViewById(R.id.Protienview); 
     holder.calories=(TextView)convertview.findViewById(R.id.caloriesview); 
     holder.img_serve_size=(ImageView)convertview.findViewById(R.id.image_serve_eqivalent); 

     holder.calories_val=(TextView)convertview.findViewById(R.id.cal_desc_val); 
     holder.Fiber_val=(TextView)convertview.findViewById(R.id.Fiber_desc_val); 
     holder.sodium_val=(TextView)convertview.findViewById(R.id.sodium_desc_val); 
     holder.proteins_val=(TextView)convertview.findViewById(R.id.prot_desc_val); 
     holder.carbs_val=(TextView)convertview.findViewById(R.id.carbs_desc_val); 
     holder.tvbrand=(TextView)convertview.findViewById(R.id.item_brand_name); 
     holder.ckbox=(CheckBox)convertview.findViewById(R.id.save_item_box); 
     holder.tvckboxText=(TextView)convertview.findViewById(R.id.ckboxAdd); 



     convertview.setTag(holder); 
     } 
     else 
     { 
       holder=(Viewholder)convertview.getTag(); 
     } 


     holder.ckbox.setOnCheckedChangeListener(null); 
     holder.ckbox.setChecked(checkedItems[position]); 
     holder.tvckboxText.setText(ckboxTextAdd[position]); 
     holder.ckbox.setTag(R.id.save_item_box, position); 
     //On Check Box Check Events 



     holder.ckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 



      @Override 
       public void onCheckedChanged(final CompoundButton buttonview, boolean isChecked) { 
        // TODO Auto-generated method stub 

        final int position = (Integer) buttonview 
           .getTag(R.id.save_item_box); 

         if (isChecked) 
         { 
          Log.i(String.valueOf(position), String.valueOf(isChecked)); 


          checkedItems[position] = true; 
          ckboxTextAdd[position]="Added"; 

         //holder.ckbox.setText(ckboxTextAdd[position]); 
         Log.i("value of Somple List", list.get(position).toString()); 
         Log.i("value of listitr", list.get(position).toString()); 
         Log.i("value of text box",ckboxTextAdd[position]); 
         final HashMap<?, ?> map=list.get(position); 
         map.get(Constants.NF_CALORIES); 

         String item_name =map.get(Constants.ITEM_NAME).toString().replace('\'', ' '); 
         String brand_name =map.get(Constants.BRAND_NAME).toString().replace('\'',' '); 
         Cursor cursor= db.fetch_data(item_name,brand_name); 
         if(cursor.getCount()>0) 
         { 
          AlertDialog.Builder builder = new AlertDialog.Builder(activity); 
          builder.setMessage("Already Saved") 
            .setPositiveButton("Replace", new DialogInterface.OnClickListener() 
            { 
             public void onClick(DialogInterface dialog, int id) 
             { 

                 checkedItems[position] = true; 
                 ckboxTextAdd[position]="Added"; 

                 Log.i("value of text box trey",ckboxTextAdd[position]); 
                 // holder.ckbox.setText(ckboxTextAdd[position]); 
             } 
            }) 
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
            { 
             public void onClick(DialogInterface dialog, int id) 
             { 


              checkedItems[position] = false; 
              ckboxTextAdd[position]="Add"; 

               Log.i("value of text box false",ckboxTextAdd[position]); 
              //holder.ckbox.setText(ckboxTextAdd[position]); 

             } 
            }); 

          AlertDialog alertDialog = builder.create(); 
          alertDialog.show(); 
         } 
         else 
          { 


          Log.i("value of Calories",map.get(Constants.NF_CALORIES).toString()); 
          db.createSave(
            position 
            ,brand_name 
            ,item_name 
            ,map.get("path").toString() 
            ,map.get(Constants.NF_SERVING_SIZE_QTY).toString() 
            ,map.get(Constants.NF_SERVING_SIZE_UNIT).toString() 
            ,map.get(Constants.NF_CALORIES).toString() 
            ,map.get(Constants.NF_PROTEINS).toString() 
            ,map.get(Constants.NF_SODIUM).toString() 
            ,map.get(Constants.NF_TOTAL_FAT).toString() 
            ,map.get(Constants.NF_TOTAL_CARBOHYDRATES).toString() 
            ,map.get(Constants.NF_SATURATED_FAT).toString() 
            ,map.get(Constants.NF_CHOLESTEROL).toString() 
            ,map.get(Constants.NF_VITAMIN_A).toString() 
            ,map.get(Constants.NF_VITAMIN_C).toString() 
            ,map.get(Constants.NF_IRON).toString() 
            ,map.get(Constants.NF_CALCIUM).toString() 
            ,map.get(Constants.NF_SERVING_WEIGHT_GRAMS).toString() 
           ); 
          } 
         } 
         else 
         { 
          Log.i(String.valueOf(position), String.valueOf(isChecked)); 
          //buttonview.setChecked(false); 
          //buttonview.setText("Save"); 
          ckboxTextAdd[position]="Add"; 

           Log.i("value of text box false",ckboxTextAdd[position]); 
         // holder.ckbox.setText(ckboxTextAdd[position]); 
//       holder.ckbox.setText("Save"); 
//       holder.ckbox.setBackgroundColor(Color.rgb(198, 228, 225)); 
          checkedItems[position] = false; 
          //holder.ckbox.setText(ckboxTextAdd[position]); 
          db.deleteUnChecked(position); 
         } 
       } 
      }); 
} 
     return convertview; 
    } 
private class Viewholder extends Activity 
    { 
     TextView title; 
     TextView servingsize; 
     //TextView status; 
     TextView carbs; 
     TextView proteins; 
     TextView calories; 
     ImageView img_serve_size; 
     TextView sodium; 
     TextView Fiber; 

     TextView carbs_val; 
     TextView proteins_val; 
     TextView calories_val; 
     TextView sodium_val; 
     TextView Fiber_val; 
     CheckBox ckbox; 
     TextView tvbrand; 


     TextView tvckboxText; 
    } 

我想在複選框被點擊列表視圖即時更新我的​​TextView現在什麼 但到現在爲止它行得做的期望,但是當我向下滾動,並採取alook所檢查的項目,然後TextView的更新

請幫我在此先感謝

+0

您數據模型是基於sqlite的? – pskink 2014-10-04 07:03:51

+1

哦,哥們我沒有從數據庫中檢索這個值,它是以json的形式進來的,這些是分析數據,我正在做的是點擊複選框,我將值保存到數據庫中,但無法顯示狀態那行的列表視圖和我想要的 – 2014-10-04 07:09:01

回答

1

istesd使用

holder.ckbox.setText(checkedItems[position]?"Added","Add"); 

,並刪除

holder.tvckboxText.setText(ckboxTextAdd[position]?"Added","Add");); 

這一點,因爲你爲什麼不使用[簡單] CursorAdapter的,因爲它可能不支持橫向視圖

1

問題:

當您更新數組的值以映射已選中或未選中的狀態時,您不會更新TextView,因爲CheckBox的檢查或取消選中可以實施api ,但TextView的文字需要更新。

解決方案:

您需要手動更新TextView的文字,或直接致電notifyDataSetChanged(),只要你選中或取消選中的項目,這將讓適配器的getView()打來電話,將迫使刷新行基於更新後的值。

建議/改進:

  1. 您可以維護布爾的單個陣列而已,沒有必要保持增加的String數組或添加,同時顯示文本,檢查布爾是真實的,設置文字爲「增加」,否則「添加」是這樣的:

    holder.ckbox.setChecked(checkedItems[position]); 
    holder.tvckboxText.setText(checkedItems[position]?"Added":"Add"); 
    
  2. 無需實現匿名CompoundButton.OnCheckedChangeListener,實現它向一流水平,並設置爲this,截至目前的找你e每次滾動列表時創建多個CompoundButton.OnCheckedChangeListener對象。

  3. 你在哪裏關閉分貝?它不matter though,但它有一個關閉點。

+0

謝謝ui沒有詞語解釋這個真棒回答謝謝你 – 2014-10-06 05:58:06

+0

holder.tvckboxText.setText(checkedItems [position]?「Added」:「Add」);設備配置更改時出現此錯誤 – 2014-10-10 12:16:09

+0

Nullpointer異常請幫助 – 2014-10-10 12:16:36

相關問題