2013-04-11 26 views
1

我想顯示自定義列表視圖。每一行都包含一個textview和一個imageview。我在這段代碼上嘗試了很多,但仍然無法理解這個問題。問題是,當我滾動列表時,它會選擇列表中的其他項目。簡而言之,它不存儲imageview的以前的狀態。 我需要這種機制,因爲我想讓我的活動像「通過從列表中選擇它們刪除多個項目」一樣工作。 如果有人可以幫助我這個,請...使用textview和imageview滾動自定義列表視圖時出錯

package com.walletapp; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.AlertDialog.Builder; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.pm.ActivityInfo; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class DeleteData extends Activity { 

    Cursor cursor; 
    ListView lv_delete_data; 
    static ArrayList<Integer> listOfItemsToDelete; 
    SQLiteDatabase database; 
    private Category[] categories; 
    ArrayList<Category> categoryList; 
    private ArrayAdapter<Category> listAdapter; 
    ImageView iv_delete; 

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

     this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     manage_reload_list(); 

     listOfItemsToDelete = new ArrayList<Integer>(); 

     iv_delete = (ImageView) findViewById(R.id.imageViewDeleteDataDelete); 
     iv_delete.setClickable(true); 
     iv_delete.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (listOfItemsToDelete.isEmpty()) { 

        Toast.makeText(getBaseContext(), "No items selected.", 
          Toast.LENGTH_SHORT).show(); 
       } 

       else { 
        showDialog(
          "Warning", 
          "Are you sure you want to delete these categories ? This will erase all records attached with it."); 
       } 
      } 
     }); 

     lv_delete_data = (ListView) findViewById(R.id.listViewDeleteData); 
     lv_delete_data.setAdapter(listAdapter); 
    } 

    private void showDialog(String title, String message) { 

     AlertDialog.Builder adb = new Builder(DeleteData.this); 
     adb.setTitle(title); 
     adb.setMessage(message); 
     adb.setIcon(R.drawable.ic_launcher); 
     String btn = "Ok"; 
     if (title.equals("Warning")) { 
      btn = "Yes"; 
      adb.setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
       } 
      }); 
     } 

     adb.setPositiveButton(btn, new DialogInterface.OnClickListener() { 

      public void onClick(DialogInterface arg0, int arg1) { 

       for (int i : listOfItemsToDelete) { 
        // -------first delete from category table----- 

        database.delete("category", "cat_id=?", new String[] { i 
          + "" }); 

        // ---------delete from category_fields 

        database.delete("category_fields", "cat_id=?", 
          new String[] { i + "" }); 

        // ---------delete from records_data------- 

        database.delete("records_data", "cat_id=?", 
          new String[] { i + "" }); 
       } 

       database.close(); 
       manage_reload_list(); 
       lv_delete_data.setAdapter(listAdapter); 
      } 
     }); 

     AlertDialog ad = adb.create(); 
     ad.show(); 
    } 

    protected void manage_reload_list() { 

     loadDatabase(); 

     categoryList = new ArrayList<Category>(); 

     // ------first fetch all categories name list------- 

     cursor = database.query("category", new String[] { "cat_id", 
       "cat_description" }, null, null, null, null, null); 
     if (cursor.getCount() == 0) { 
      showDialog("Error", "No categories found."); 
      cursor.close(); 
     } else { 

      while (cursor.moveToNext()) { 

       categories = new Category[] { new Category(cursor.getInt(0), 
         cursor.getString(1)) }; 
       categoryList.addAll(Arrays.asList(categories)); 
      } 
      cursor.close(); 
     } 
     listAdapter = new CategoryArrayAdapter(this, categoryList); 
    } 

    public static class Category { 
     String cat_name = ""; 
     int cat_id = 0; 
     Boolean checked = false; 

     Category(int cat_id, String name) { 
      this.cat_name = name; 
      this.cat_id = cat_id; 
     } 

     public int getId() { 
      return cat_id; 
     } 

     public String getCatName() { 
      return cat_name; 
     } 

     public Boolean getChecked() { 
      return checked; 
     } 

     public void setChecked(Boolean checked) { 
      this.checked = checked; 
     } 

     public boolean isChecked() { 
      return checked; 
     } 

     public void toggleChecked() { 
      checked = !checked; 
     } 
    } 

    private static class CategoryViewHolder { 
     private ImageView imageViewCheck; 
     private TextView textViewCategoryName; 

     public CategoryViewHolder(ImageView iv_check, TextView tv_category_name) { 
      imageViewCheck = iv_check; 
      textViewCategoryName = tv_category_name; 
     } 

     public ImageView getImageViewCheck() { 
      return imageViewCheck; 
     } 

     public TextView getTextViewCategoryName() { 
      return textViewCategoryName; 
     } 
    } 

    private static class CategoryArrayAdapter extends ArrayAdapter<Category> { 
     private LayoutInflater inflater; 

     public CategoryArrayAdapter(Context context, List<Category> categoryList) { 
      super(context, R.layout.single_row_delete_data, 
        R.id.textViewSingleRowDeleteData, categoryList); 
      inflater = LayoutInflater.from(context); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      Category category = (Category) this.getItem(position); 
      final ImageView imageViewCheck; 
      final TextView textViewCN; 

      if (convertView == null) { 
       convertView = inflater.inflate(R.layout.single_row_delete_data, 
         null); 

       imageViewCheck = (ImageView) convertView 
         .findViewById(R.id.imageViewSingleRowDeleteData); 
       textViewCN = (TextView) convertView 
         .findViewById(R.id.textViewSingleRowDeleteData); 

       convertView.setTag(new CategoryViewHolder(imageViewCheck, 
         textViewCN)); 
      } 

      else { 
       CategoryViewHolder viewHolder = (CategoryViewHolder) convertView 
         .getTag(); 
       imageViewCheck = viewHolder.getImageViewCheck(); 
       textViewCN = viewHolder.getTextViewCategoryName(); 
      } 

      imageViewCheck.setFocusable(false); 
      imageViewCheck.setFocusableInTouchMode(false); 
      imageViewCheck.setClickable(true); 
      imageViewCheck.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
        ImageView iv = (ImageView) v; 
        Category category = (Category) iv.getTag(); 

        if (category.getChecked() == false) { 
         imageViewCheck.setImageResource(R.drawable.set_check); 
         listOfItemsToDelete.add(category.getId()); 
         category.setChecked(true); 
        } else { 
         imageViewCheck 
           .setImageResource(R.drawable.set_basecircle); 
         listOfItemsToDelete.remove((Integer) category.getId()); 
         category.setChecked(false); 
        } 
       } 
      }); 
      imageViewCheck.setTag(category); 
      textViewCN.setText(category.getCatName()); 

      return convertView; 
     } 
    } 

    private void loadDatabase() { 
     database = openOrCreateDatabase("WalletAppDatabase.db", 
       SQLiteDatabase.OPEN_READWRITE, null); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 

      finish(); 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 
} 

這是我的logcat輸出:

04-11 08:32:47.083: D/dalvikvm(1261): GC_FOR_ALLOC freed 735K, 29% free 3332K/4672K, paused 199ms, total 205ms 
04-11 08:32:47.362: E/ActivityThread(1261): Failed to find provider info for com.google.plus.platform 
04-11 08:32:47.632: I/Ads(1261): adRequestUrlHtml: <html><head><script src="http://media.admob.com/sdk-core-v40.js"></script><script>AFMA_getSdkConstants();AFMA_buildAdURL({"preqs":18,"session_id":"5201479258687953639","seq_num":"19","slotname":"a1512f50d8c3692","u_w":320,"msid":"com.walletapp","cap":"m,a","adtest":"on","js":"afma-sdk-a-v6.3.0","bas_off":0,"net":"ed","app_name":"1.android.com.walletapp","hl":"en","gnt":3,"carrier":"310260","u_audio":4,"kw":[],"u_sd":1,"simulator":1,"ms":"5j2LTo7Vhgatbr2zw9EGXbWGmAc8VRgJRTZpfRmRxDNZMDEtohADcdSvAbGyjHBAH6KuyP48dzaU-_Gfkq8adRJMFxu5Oq_46jWdTHBUpf_Fgm5xN1ehJ8NcEhqNpN7oHsV38ukGuVQUNKofxsk0Ij8cY8l0_QddW8iKCAXhz80Ujr2xbTEzUd9nV9NGfq1EBiaZjk732PJPl7Z2Myy1oX61Bk7VZzpSyCtlX5XIzdTM8iyqsNk2yTmjG6sflKdqXykfd1oXnrlrxaDLHnq1C4cSceFeDQZ0Lv-oxG2Xzr76GT9BhyUEWzE7pTYJQ70-KpUOV2Il56LykY3wCH2j2Q","isu":"B3EEABB8EE11C2BE770B684D95219ECB","format":"320x50_mb","oar":0,"ad_pos":{"height":0,"visible":0,"y":0,"x":0,"width":0},"u_h":480,"pt":1,"bas_on":0,"ptime":1851610});</script></head><body></body></html> 
04-11 08:32:48.321: D/webviewglue(1261): nativeDestroy view: 0x2a368740 
04-11 08:32:48.392: I/Choreographer(1261): Skipped 93 frames! The application may be doing too much work on its main thread. 
04-11 08:32:49.052: I/Choreographer(1261): Skipped 396 frames! The application may be doing too much work on its main thread. 
04-11 08:32:55.001: I/Choreographer(1261): Skipped 50 frames! The application may be doing too much work on its main thread. 
04-11 08:33:29.022: E/Ads(1261): JS: Uncaught ReferenceError: AFMA_getSdkConstants is not defined (http://media.admob.com/:1) 
04-11 08:33:29.022: E/Web Console(1261): Uncaught ReferenceError: AFMA_getSdkConstants is not defined at http://media.admob.com/:1 
04-11 08:33:47.529: I/Ads(1261): AdLoader timed out after 60000ms while getting the URL. 
04-11 08:33:47.531: D/webviewglue(1261): nativeDestroy view: 0x2a368740 
04-11 08:33:47.541: I/Ads(1261): onFailedToReceiveAd(A network error occurred.) 
04-11 08:34:47.581: I/Ads(1261): Refreshing ad. 
04-11 08:34:47.622: E/ActivityThread(1261): Failed to find provider info for com.google.plus.platform 
04-11 08:34:47.762: I/Ads(1261): adRequestUrlHtml: <html><head><script src="http://media.admob.com/sdk-core-v40.js"></script><script>AFMA_getSdkConstants();AFMA_buildAdURL({"preqs":19,"session_id":"5201479258687953639","seq_num":"20","slotname":"a1512f50d8c3692","u_w":320,"msid":"com.walletapp","cap":"m,a","adtest":"on","js":"afma-sdk-a-v6.3.0","bas_off":0,"net":"ed","app_name":"1.android.com.walletapp","hl":"en","gnt":3,"carrier":"310260","u_audio":4,"kw":[],"u_sd":1,"simulator":1,"ms":"Trn0wt2c5XiO7OmFyXqrKSLD7ZgZh_ZbxneDNRsJ5MwCcYQbDy7isjpET_A9DTjPoNNPXVDn41qPQDD5Msbcr6ieK1Rchi6ctbf3FTZcO5QSlr054zlHBS2qx7jL-T9VwVNde2CNfbgy_6_w5Ww85XfPo9L2TaZqmg49knQiBxg_gw3fijmphjz0LYqrhjuc8XLVG2K9z27UwQA4_2KGoiM5iwxXsXO0L2LT-3BXz49GyD3r9XZ8qHI4nrIQ2pPsEWUhgznx4I24PAvvwmOEcF0DVLzndhPwaj-HlI5f6-vXHGFQ6hxU6iV58DytEWEbF9eI1Ierr_4Eue0rqFkoyw","isu":"B3EEABB8EE11C2BE770B684D95219ECB","format":"320x50_mb","oar":0,"ad_pos":{"height":0,"visible":0,"y":480,"x":0,"width":0},"u_h":480,"pt":1,"bas_on":0,"ptime":1971778});</script></head><body></body></html> 
04-11 08:35:28.222: E/Ads(1261): JS: Uncaught ReferenceError: AFMA_getSdkConstants is not defined (http://media.admob.com/:1) 
04-11 08:35:28.222: E/Web Console(1261): Uncaught ReferenceError: AFMA_getSdkConstants is not defined at http://media.admob.com/:1 
04-11 08:35:47.714: I/Ads(1261): AdLoader timed out after 60000ms while getting the URL. 
04-11 08:35:47.714: D/webviewglue(1261): nativeDestroy view: 0x2a240398 
04-11 08:35:47.741: I/Ads(1261): onFailedToReceiveAd(A network error occurred.) 

我沒有收到任何類型的錯誤。 我是新手,但仍然盡力在代碼中找到錯誤,但未成功。請幫我...

+0

顯示logcat的輸出,沒有它,沒有人能夠幫助你在這裏。 – 2013-04-11 08:29:52

+0

沒有得到任何錯誤我怎麼能告訴你這個活動的logcat輸出.. !!!我仍然做了一些操作並顯示了輸出。希望這會對你有所幫助。 – 2013-04-11 08:39:09

回答

0

轉換適配器到這個模式,我認爲這可以幫助你,

public class CheckBoxInListAdapter extends BaseAdapter{ 
private Context context=null; 
private List<ArrayListObjects> searchArrayList=null; 
private LayoutInflater mInflater=null; 
private ViewHolder holder=new ViewHolder(); 

public CheckBoxInListAdapter(Context context, List<ArrayListObjects> mData) 
{ 
    this.context=context; 
    searchArrayList = mData; 
    mInflater = LayoutInflater.from(context); 
} 
public int getCount() 
{ 
    return searchArrayList.size(); 
} 
public Object getItem(int position) 
{ 
    return searchArrayList.get(position); 
} 
public long getItemId(int position) 
{ 
    return position; 
} 
public View getView(final int position, View convertView, ViewGroup parent) 
{ 
    if (convertView == null) 
    { 
      convertView = mInflater.inflate(R.layout.sample_layout,null); 
      holder=new ViewHolder(); 
      holder.textView = (TextView) convertView.findViewById(R.id.textView); 
      holder.itemNormalChecked=(CheckBox)convertView.findViewById(R.id.checkBox); 
      convertView.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.textView.setText(searchArrayList.get(position).getItemName()); 
    holder.itemNormalChecked.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      if(searchArrayList.get(position).isItemChecked()) 
      { 
       searchArrayList.get(position).setItemChecked(false); 
      } 
      else 
      { 
       searchArrayList.get(position).setItemChecked(true); 
      } 
     } 
    }); 
    if(searchArrayList.get(position).isItemChecked()) 
    { 
     holder.itemNormalChecked.setChecked(true); 
    } 
    else 
    { 
     holder.itemNormalChecked.setChecked(false); 
    } 
    return convertView; 
} 
static class ViewHolder 
{ 
    TextView textView=null; 
    CheckBox itemNormalChecked=null; 
} 
} 
相關問題