2012-12-27 94 views
0

嗨我正在使用自定义列表视图,我的列表项包含复选框。当用现有值更新列表视图时,背景被改变,所以它工作的很好。但是当我点击检查按钮时,在那个时候背景不会改变,加载一些后再改变背景。我的问题是在检查项目时背景需要立即更改。Android中的自定义列表项更改背景

这是我的适配器类。

public class GuestListAdapter extends BaseAdapter implements OnClickListener { 
private String strExe; 
    AlertDialog.Builder builder; 

    Context context; 
    private ArrayList<String> arrayListFirstName; 
    private ArrayList<String> arrayListLastName; 
    private ArrayList<String> arrayListGuests; 
    private ArrayList<String> arrayCustomOne; 
    private ArrayList<String> arTempId; 
    private ArrayList<Boolean> chickinlist; 

    public static ArrayList<Integer> arrCheckedItems; 
    public static ArrayList<Integer> arrUnCheckedItems; 
    Button btnInfo; 
    private  SQLiteAdapter mySqliteAdapter; 
    private GuestListScreen myGuestList; 
    private RelativeLayout views; 

    // private AlertDialog alertDialog = null; 

    private ArrayList<Boolean> checks = new ArrayList<Boolean>(); 

    public GuestListAdapter(Context mcontext, ArrayList<String> arrListFN, 
      ArrayList<String> arrListLN, ArrayList<String> arrListGuest, 
      ArrayList<String> arrTiketID, ArrayList<String> arrCustOne, 
      ArrayList<Boolean> chicklist) { 

     clearAdapter(); 

     arrayListFirstName = new ArrayList<String>(); 
     arrayListLastName = new ArrayList<String>(); 
     arrayListGuests = new ArrayList<String>(); 
     arrayCustomOne = new ArrayList<String>(); 
     arTempId = new ArrayList<String>(); 
     chickinlist = new ArrayList<Boolean>(); 
     arrCheckedItems = new ArrayList<Integer>(); 
     arrUnCheckedItems = new ArrayList<Integer>(); 

     arrayListFirstName = arrListFN; 
     arrayListLastName = arrListLN; 
     arrayListGuests = arrListGuest; 
     arrayCustomOne = arrCustOne; 
     arTempId = arrTiketID; 
     chickinlist = chicklist; 

     context = mcontext; 
     mySqliteAdapter = new SQLiteAdapter(context); 

     for (int i = 0; i < arrayListFirstName.size(); i++) { 
      checks.add(i, false); 
     } 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     Log.d("", "getCount" + arrayListFirstName.size()); 
     return arrayListFirstName.size(); 

    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     Log.d("", "getItem" + arrayListFirstName.size()); 
     return arrayListFirstName.get(position); 
    } 

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

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

     final int pos = position; 
     views = null; 
     LayoutInflater layoutInflator = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     views = (RelativeLayout) layoutInflator.inflate(
       R.layout.guest_list_item, null); 


     final CheckBox chk = (CheckBox) views.getChildAt(0); 
//  Log.d("", "CheckBox Pos "+position); 
     chk.setId(position); 

     TextView txtView = (TextView) views.getChildAt(1); 

     TextView txtView2 = (TextView) views.getChildAt(2); 
     TextView txtView3 = (TextView) views.getChildAt(3); 

     final TextView txtView4 = (TextView) views.getChildAt(4); 
     TextView txtView5 = (TextView) views.getChildAt(6); 
     txtView5.setId(position); 

//  Log.d("", "Button Pos "+position); 
     txtView4.setId(position); 

     txtView4.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(context, InfoScreen.class); 
       intent.putExtra("IDVALUE",arTempId.get(txtView4.getId())); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
       context.startActivity(intent); 
//    System.out.println(v + "##########" + " " + v.getId()); 
//    System.out.println(v + "##########" + " " + arTempId.get(txtView4.getId())); 
//    System.out.println(v + "##########" + " " + chickinlist.get(txtView4.getId())); 
      } 
     }); 
     Log.e("", "****************************************************** "); 
//  Log.v("", "Adapter arr pos " + pos); 
//  Log.v("", "Adapter arr position " + position); 
     Log.v("", "Adapter arr size " + arrayListFirstName.size()); 
     Log.v("", "Passsing arr size " + chickinlist.size()); 
     for (int dd = 0; dd < arrayListFirstName.size(); dd++) { 
      if (position == dd) { 
//    Log.d("", "Passsing arr size " + chickinlist.size()); 
       Boolean result = chickinlist.get(position); 
//    Log.d("", "After " + result); 
       if (result == true) { 
        chk.setChecked(true); 
        arrCheckedItems.add(position); 
        views.setBackgroundResource(R.drawable.list_item_checked); 


       } else { 
        chk.setChecked(false); 
        arrUnCheckedItems.add(position); 
        views.setBackgroundResource(R.drawable.list_item_unchecked); 

       } 

       txtView.setText(arrayListFirstName.get(position)); 
       txtView2.setText(arrayListLastName.get(position)); 
       txtView3.setText("(" + arrayListGuests.get(position) + ")"); 
       if(arrayCustomOne.get(position).equalsIgnoreCase("0")||arrayCustomOne.get(position).equalsIgnoreCase(null)||arrayCustomOne.get(position).equalsIgnoreCase("")) 
       { 
        txtView5.setText(""); 
       }else 
       { 
        txtView5.setText(arrayCustomOne.get(position)); 
       } 

      } 

     } 

     chk.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, 
        boolean isChecked) { 

       strExe = "update ticket_details set checkin_status=1 where tempid="+arTempId.get(chk.getId()); 
//    Log.d("Adapter", "Checked Temp Id "+arTempId.get(chk.getId())); 
       Log.d("", "Position "+chk.getId()+"tempid "+arTempId.get(chk.getId())); 
       if (isChecked) { 

//     views.setBackgroundResource(R.drawable.list_item_checked); 

        AlertDialog.Builder builder = new AlertDialog.Builder(
          context); 
        builder.create(); 
        builder.setMessage(arrayListFirstName.get(chk.getId()) 
          + " " + arrayListLastName.get(chk.getId()) 
          + " has been checked in."); 
        builder.setPositiveButton("Ok", 
          new DialogInterface.OnClickListener() { 

           @Override 
           public void onClick(DialogInterface dialog, 
             int which) { 
//         myGuestList = new GuestListScreen(); 
            mySqliteAdapter.executeCheckQurey(strExe); 
//         myGuestList.ListUpdate(); 
            dialog.dismiss(); 
           } 

          }).show(); 
//     Log.d("", "ID = " + buttonView.getId()); 

       } else { 
//     views.setBackgroundResource(R.drawable.list_item_unchecked); 
        strExe = "update ticket_details set checkin_status=0 where tempid="+arTempId.get(chk.getId()); 
         mySqliteAdapter.executeCheckQurey(strExe); 


//     Toast.makeText(context, "check release", Toast.LENGTH_SHORT) 
//       .show(); 
       } 

      } 
     }); 


     return views; 

    } 

    @Override 
    public void onClick(View view) { 
     // TODO Auto-generated method stub 
     Integer index = (Integer) view.getTag(); 
     boolean state = checks.get(index.intValue()); 

     checks.set(index.intValue(), !state); 
    } 

// private void showADialog(int posit) { 
// 
//  AlertDialog.Builder builder = new AlertDialog.Builder(
//    context); 
//  builder.create(); 
//  builder.setMessage("The clicked row is " 
//    + arrayListFirstName.get(posit)); 
//  builder.setPositiveButton("Ok?", new DialogInterface.OnClickListener() { 
// 
//   @Override 
//   public void onClick(DialogInterface dialog, int which) { 
//    dialog.dismiss(); 
//   } 
// 
//  }).show(); 
// } 

    public void clearAdapter() { 
     if (arrayListFirstName != null) { 
      arrayListFirstName.clear(); 
      arrayListFirstName = null; 
      arrayListLastName.clear(); 
      arrayListLastName = null; 
      arrayListGuests.clear(); 
      arrayListGuests = null; 
      arrayCustomOne.clear(); 
      arrayCustomOne = null; 
      arTempId.clear(); 
      arTempId = null; 
      chickinlist.clear(); 
      chickinlist = null; 
      arrCheckedItems.clear(); 
      arrCheckedItems = null; 
      arrUnCheckedItems.clear(); 
      arrUnCheckedItems = null; 
     } 

    } 

} 

我只是想立即更改选中项目的背景,而无需再次更新列表。

+0

只是关于您的适配器的一般性意见。我建议你阅读一些关于适配器和适配器最佳实践的内容,因为你当然会错过一些东西。 (例如持有者模式,查看回收,您正在创建一个新的ClickListener等等) – Budius

回答

0

我觉得你需要告诉BaseAdapter在你的OnCheckedChanged监听器被调用时刷新数据。

GuestListAdapter.this.notifyDataSetChanged() 
相关问题