2012-07-23 16 views
5

मेरे पास एक आइटम श्रेणी के ArrayAdapter का विस्तार करने के लिए एडाप्टर क्लास का उपयोग कर एक कस्टम सूचीदृश्य है। मेरे पास कोई, सिंगल और मल्टी के विकल्प मोड के बीच बदलने की क्षमता है। यह सब ठीक काम करता है। जो मैं अब लागू करने की कोशिश कर रहा हूं वह मल्टी पसंद मोड में कई चयनों के साथ सूची दृश्य (और एडाप्टर) से वस्तुओं को हटाने का एक तरीका है। हालांकि मुझे निम्नलिखित में से किसी एक को करते समय इंडेक्सऑटॉफबाउंड अपवाद प्राप्त होते हैं; 1) अंतिम विकल्प मोड में सूचीदृश्य में अंतिम आइटम को हटाएं (नोट: अंतिम आइटम से पहले कुछ भी ठीक है) 2) बहु चयन विकल्प मोड में मैं एक बार फिर अंतिम आइटम 3 को हटा नहीं सकता) फिर से बहु चयन मोड में मैं एकल को हटा सकता हूं अंतिम आइटम से पहले चयनित आइटम लेकिन 2 या अधिक चयनों के परिणामस्वरूप सीमाओं में त्रुटियों से फिर से सूचकांक होता है।एंड्रॉइड - कस्टम लिस्ट व्यू एडाप्टर - मल्टी चयन हटाएं - इंडेक्सआउटफॉउंड्स - क्यों?

मैंने हटाए जाने की स्थिति दिखाने के लिए डीबग लॉग जोड़ा और प्राप्त करने का आकार चेक ItemPositions() और लूप काउंटर के लिए मेरा (उदाहरण के लिए i) और आखिर में आइटम का आइटम शीर्षक हटा दिया गया। यदि मैं वास्तविक listadpter.remove (स्थिति) लाइन पर टिप्पणी करता हूं तो लॉग आउटपुट संकेतक लगता है कि सभी ठीक काम कर रहे हैं इसलिए अब मुझे संदेह है कि समस्या मेरे एडाप्टर क्लास getView विधि में पड़ती है। लेकिन मेरा दिमाग थक गया है और मैं फंस गया हूँ।

MainActivity.class - निकालें ITems विधि बटन बटन ऑब्जेक्ट से बुलाया गया;

private void removeItems() { 
    final SparseBooleanArray checkedItems = listView.getCheckedItemPositions(); 
    //final long[] checkedItemIds = listView.getCheckedItemIds(); 
    final int checkedItemsCount = checkedItems.size(); 

    Log.d("drp", "Adapter Count is: " + Integer.toString(mMyListViewAdapter.getCount())); 
    if (checkedItems != null) { 
     for (int i = checkedItemsCount-1; i >= 0 ; --i) { 
      // This tells us the item position we are looking at 
      // -- 
      final int position = checkedItems.keyAt(i); 
      // This tells us the item status at the above position 
      // -- 
      final boolean isChecked = checkedItems.valueAt(i); 

      if (isChecked) { 
       Item item = mMyListViewAdapter.getItem(position); 
       Log.d("drp", "removing : " + Integer.toString(position) + " of " +Integer.toString(checkedItemsCount) + "-" + Integer.toString(i) + " - Title: " + mMyListViewAdapter.getItem(position).getTitle()); 
       mMyListViewAdapter.remove(item); 

      } 
     } 
    } 
} 

एडाप्टर कक्षा;

public class MyListViewAdapter extends ArrayAdapter<Item> implements OnItemClickListener{ 

private LayoutInflater mInflator; 

/** 
* This is my view holder for getView method so don't need to call 
* findViewById all the time which results in speed increase 
*/ 
static class ViewHolder { 

    public TextView txtTitle; 
    public TextView txtDescription; 
    public TextView txtSessionCount; 
    public ImageView listThumbnailImage; 
    public ImageView listStatusIndicatorImage; 
    public InertCheckBox Checkbox; 
} 

/** 
* Constructor from a list of items 
*/ 
public MyListViewAdapter(Context context, List<Item> items) { 
    super(context, 0, items); 
    mInflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // This is how you would determine if this particular item is checked 
    // when the view gets created 
    // -- 
    final ListView lv = (ListView) parent; 
    final boolean isChecked = lv.isItemChecked(position); 
    final int selectionMode = lv.getChoiceMode(); 

    // The item we want to get the view for 
    // -- 
    Item item = getItem(position); 

    // Re-use the view if possible (recycle) 
    // -- 
    ViewHolder holder = null; 
    if (convertView == null) { 
     convertView = mInflator.inflate(R.layout.listview_row, null); 
     holder = new ViewHolder(); 
     holder.txtTitle = (TextView) convertView.findViewById(R.id.title); 
     holder.txtDescription = (TextView) convertView.findViewById(R.id.description); 
     holder.txtSessionCount = (TextView) convertView.findViewById(R.id.session_count); 
     holder.listThumbnailImage = (ImageView) convertView.findViewById(R.id.list_image); 
     holder.listStatusIndicatorImage = (ImageView) convertView.findViewById(R.id.status); 
     holder.Checkbox = (InertCheckBox) convertView.findViewById(R.id.inertCheckBox); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder)convertView.getTag(); 
    } 
    holder.txtTitle.setText(item.getTitle()); 
    holder.txtDescription.setText(item.getDescription()); 
    holder.txtSessionCount.setText(item.getSessionCount()); 
    holder.listThumbnailImage.setImageBitmap((Bitmap) item.getThumbnailImage());   
    switch (selectionMode) { 
    case ListView.CHOICE_MODE_NONE: 
     holder.Checkbox.setVisibility(InertCheckBox.GONE); 
     holder.listStatusIndicatorImage.setVisibility(ImageView.VISIBLE); 
     holder.listStatusIndicatorImage.setImageBitmap((Bitmap) item.getListIndicatorImage()); 
     break; 
    //case ListView.CHOICE_MODE_SINGLE: case ListView.CHOICE_MODE_MULTIPLE: 
    default: 
     holder.listStatusIndicatorImage.setVisibility(ImageView.GONE); 
     holder.Checkbox.setVisibility(InertCheckBox.VISIBLE); 
     holder.Checkbox.setButtonDrawable(R.drawable.checkbox); 
     holder.Checkbox.setChecked(isChecked); 
     break; 
    }   


    return convertView; 
} 

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

@Override 
public boolean hasStableIds() { 
    return true; 
} 

और आइटम क्लास - पहला आधा;

public class Item implements Comparable<Item> { 

private long id; 
private String title; 
private String description; 
private String session_count; 
private Bitmap listImage; 
private Bitmap statusImage; 

public Item(long id, String title, String description, String session_count, Bitmap listImage, Bitmap statusImage) { 
    super(); 
    this.id = id; 
    this.title = title; 
    this.description = description; 
    this.session_count = session_count; 
    this.listImage = listImage; 
    this.statusImage = statusImage; 
} 

public long getId() { 
    return id; 
} 

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

public String getTitle() { 
    return title; 
} 

यहाँ मेरी डीबग लॉग पर नज़र रखने के आइटम द्वारा निकाली गई दृश्य

07-23 22:59:14.910: D/drp(19104): Adapter Count is: 51 
07-23 22:59:14.910: D/drp(19104): removing : 50 of 4-3 - Title: Test 50 - testing 
07-23 22:59:14.910: D/drp(19104): removing : 49 of 4-2 - Title: Test 49 - testing 
07-23 22:59:14.910: D/drp(19104): removing : 48 of 4-1 - Title: Test 48 - testing 

फिर अगर मैं बाहर टिप्पणी कि "mMyListViewAdapter.remove (आइटम);" मेनएक्टिविटी में लाइन क्रैश नहीं होती है और लॉग की उम्मीद के अनुसार काम करने का संकेत मिलता है। क्या कोई मेरी त्रुटि देख सकता है जिसके परिणामस्वरूप मेरे सूचकांक में बाउंड अपवाद से बाहर निकलता है?

इसके अलावा, मैं उपयोग कर रहा हूँ एसडीके 4.0.4 एपीआई 15.

कई धन्यवाद,

पॉल।

अलावा -

 07-25 00:21:53.235: D/AbsListView(25952): Get MotionRecognitionManager 
     07-25 00:21:53.270: D/dalvikvm(25952): GC_CONCURRENT freed 89K, 3% free 13027K/13383K, paused 1ms+2ms 
     07-25 00:21:53.430: D/dalvikvm(25952): GC_CONCURRENT freed 207K, 4% free 13232K/13703K, paused 3ms+2ms 
     07-25 00:21:53.630: D/CLIPBOARD(25952): Hide Clipboard dialog at Starting input: finished by someone else... ! 
     07-25 00:21:54.930: D/dalvikvm(25952): GC_FOR_ALLOC freed 189K, 4% free 13331K/13767K, paused 10ms 
     07-25 00:21:54.930: I/dalvikvm-heap(25952): Grow heap (frag case) to 13.610MB for 408976-byte allocation 
     07-25 00:21:54.940: D/dalvikvm(25952): GC_FOR_ALLOC freed 6K, 4% free 13724K/14215K, paused 9ms 
     07-25 00:21:54.950: D/dalvikvm(25952): GC_FOR_ALLOC freed 0K, 4% free 13724K/14215K, paused 9ms 
     07-25 00:21:54.950: I/dalvikvm-heap(25952): Grow heap (frag case) to 13.994MB for 408976-byte allocation 
     07-25 00:21:54.960: D/dalvikvm(25952): GC_FOR_ALLOC freed 0K, 4% free 14124K/14663K, paused 9ms 
     07-25 00:21:54.970: D/dalvikvm(25952): GC_FOR_ALLOC freed 0K, 4% free 14124K/14663K, paused 9ms 
     07-25 00:21:54.975: I/dalvikvm-heap(25952): Grow heap (frag case) to 14.384MB for 408976-byte allocation 
     07-25 00:21:54.995: D/dalvikvm(25952): GC_CONCURRENT freed 0K, 4% free 14523K/15111K, paused 1ms+1ms 
     07-25 00:21:55.005: D/dalvikvm(25952): GC_FOR_ALLOC freed 0K, 4% free 14523K/15111K, paused 9ms 
     07-25 00:21:55.005: I/dalvikvm-heap(25952): Grow heap (frag case) to 14.774MB for 408976-byte allocation 
     07-25 00:21:55.020: D/dalvikvm(25952): GC_FOR_ALLOC freed 0K, 5% free 14923K/15559K, paused 9ms 
     07-25 00:21:55.030: D/dalvikvm(25952): GC_FOR_ALLOC freed <1K, 5% free 14923K/15559K, paused 9ms 
     07-25 00:21:55.030: I/dalvikvm-heap(25952): Grow heap (frag case) to 15.165MB for 408976-byte allocation 
     07-25 00:21:55.040: D/dalvikvm(25952): GC_FOR_ALLOC freed 0K, 5% free 15322K/16007K, paused 10ms 
     07-25 00:21:55.055: D/dalvikvm(25952): GC_FOR_ALLOC freed 0K, 5% free 15722K/16455K, paused 9ms 
     07-25 00:21:55.110: D/dalvikvm(25952): GC_FOR_ALLOC freed 157K, 5% free 16145K/16903K, paused 9ms 
     07-25 00:21:56.565: E/SKIA(25952): FimgApiStretch:stretch failed 
     07-25 00:21:56.690: E/SKIA(25952): FimgApiStretch:stretch failed 
     07-25 00:21:56.710: E/SKIA(25952): FimgApiStretch:stretch failed 
     07-25 00:22:00.545: D/drp(25952): Adapter Count is: 51 
     07-25 00:22:00.545: D/drp(25952): removing : 49 of 2-2 - Title: Test 49 - testing 
     07-25 00:22:00.545: D/drp(25952): removing : 48 of 2-1 - Title: Test 48 - testing 
     07-25 00:22:00.545: D/drp(25952): removing : 47 of 2-0 - Title: Test 47 - testing 
     07-25 00:22:00.550: D/AndroidRuntime(25952): Shutting down VM 
     07-25 00:22:00.550: W/dalvikvm(25952): threadid=1: thread exiting with uncaught exception (group=0x40c6f1f8) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): FATAL EXCEPTION: main 
     07-25 00:22:00.560: E/AndroidRuntime(25952): java.lang.IndexOutOfBoundsException: Invalid index 48, size is 48 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at java.util.ArrayList.get(ArrayList.java:304) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:337) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at au.drp.mylistview.MyListViewAdapter.getItemId(MyListViewAdapter.java:107) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.AbsListView.confirmCheckedPositionsById(AbsListView.java:5956) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.AbsListView.handleDataChanged(AbsListView.java:5999) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.ListView.layoutChildren(ListView.java:1535) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.AbsListView.onLayout(AbsListView.java:2254) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.View.layout(View.java:11467) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.ViewGroup.layout(ViewGroup.java:4237) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:925) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.View.layout(View.java:11467) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.ViewGroup.layout(ViewGroup.java:4237) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.FrameLayout.onLayout(FrameLayout.java:431) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.View.layout(View.java:11467) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.ViewGroup.layout(ViewGroup.java:4237) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1502) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.LinearLayout.onLayout(LinearLayout.java:1415) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.View.layout(View.java:11467) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.ViewGroup.layout(ViewGroup.java:4237) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.widget.FrameLayout.onLayout(FrameLayout.java:431) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.View.layout(View.java:11467) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.ViewGroup.layout(ViewGroup.java:4237) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1721) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2678) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.os.Handler.dispatchMessage(Handler.java:99) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.os.Looper.loop(Looper.java:137) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at android.app.ActivityThread.main(ActivityThread.java:4514) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at java.lang.reflect.Method.invokeNative(Native Method) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at java.lang.reflect.Method.invoke(Method.java:511) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 
     07-25 00:22:00.560: E/AndroidRuntime(25952): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 
+0

का पालन करें इस ट्यूटोरियल आप मदद कर सकते हैं http://www.quicktips.in/how-to-create-multi-select-listview-android-with -कस्टम-एडाप्टर/ –

+0

चयन के लिए धन्यवादमोड = lv.getChoiceMode()। मैंने इसके लिए देखा। – CoolMind

उत्तर

0

संपादित के रूप में पूर्ण लॉग उत्पादन:

for (int i = checkedItemsCount-1; i >= 0 ; i--) { 
              ^^^^^ 

insted के

for (int i = checkedItemsCount-1; i >= 0 ; --i) { 
+0

सुझाव के लिए धन्यवाद लेकिन दुर्भाग्यवश मेरे पास अभी भी बाउंड अपवाद से एक ही सूचकांक है। कोई अन्य सुझाव? – luthepa1

+0

अपनी पूरी लॉग-बिल्ली प्रदर्शित करने वाली त्रुटि पोस्ट करें। –

+0

ठीक लॉग आउटपुट पहले पोस्ट के अंत में जोड़ा गया। धन्यवाद। – luthepa1

2

ठीक है, मैं समस्या हल हो जाती !!! वाह!

इंडेक्सऑटॉफबाउंड अपवाद को रोकने के लिए मुझे क्या करना था सूची दृश्य एडाप्टर को रीसेट करना था ताकि सूची दृश्य सामग्री को रीफ्रेश किया जा सके। तो जादू लाइन

listView.setAdapter(mMyListViewAdapter); 

था हालांकि मेरा मानना ​​है कि यह जब एक सूची दृश्य के साथ काम करने और इसके बेहतर एडाप्टर सूची दृश्य से जुड़ा हुआ है की सामग्री को अद्यतन करने के लिए उपयोग करने के लिए सबसे अच्छा अभ्यास नहीं है। लेकिन मुझे पूरा यकीन नहीं है कि इसके बारे में कैसे जाना है?

वैसे भी वह मेरा अद्यतन निकाला विधि कोड है।

private void removeItems() { 
    final SparseBooleanArray checkedItems = listView.getCheckedItemPositions(); 

    if (checkedItems != null) { 
     final int checkedItemsCount = checkedItems.size(); 

     // Lets get the position of the view to scroll to before the first checked 
     // item to restore scroll position 
     //   
     int topPosition = checkedItems.keyAt(0) - 1;    

     listView.setAdapter(null); 
     for (int i = checkedItemsCount - 1; i >= 0 ; i--) { 
      // This tells us the item position we are looking at 
      // -- 
      final int position = checkedItems.keyAt(i); 

      // This tells us the item status at the above position 
      // -- 
      final boolean isChecked = checkedItems.valueAt(i); 
      if (isChecked) { 
       Item item = mMyListViewAdapter.getItem(position); 
       mMyListViewAdapter.remove(item); 
       //mMyListViewAdapter.notifyDataSetChanged(); 

      }    
     } 
     listView.setAdapter(mMyListViewAdapter); 
     //if topPosition is -1 then item zero is positioned by default. 
     listView.setSelection(topPosition); 
    } 
} 
2

वहाँ AbsListView में एक बग है कि इस मुद्दे का कारण बनता है प्रतीत होता है। यह AbsListView के किसी उप-वर्ग के साथ हो सकता है, जिसमें ListView और GridView शामिल हैं।

सिंगल- और बहु-विकल्प मोड में, ListViewconfirmCheckedPositionsById() में चेक किए गए आइटमों के सेट को सत्यापित करके अपने एडाप्टर पर कॉल करता है। चूंकि चुने गए आइटम को उस बिंदु पर डेटासेट से पहले ही हटा दिया गया है, इसलिए एडाप्टर अपवाद फेंक देगा। विशेष रूप से, यह समस्या केवल तभी होती है जब एडाप्टर की hasStableIds() विधि true लौटाती है।

शिथिल तौर पर, यह प्रासंगिक मार्ग है:

  1. आप ListView में एक या अधिक आइटम का चयन
  2. ListView चयनित आइटम की अपनी सूची को अद्यतन करता
  3. आप हटाएँ बटन पर क्लिक
  4. आइटम को आपके डेटासेट
  5. से हटा दिया गया है, आप अपने एडाप्टर पर notifyDataSetChanged() पर कॉल करते हैं, और यह अपने पर्यवेक्षकों को सूचित करता है कि डेटासेट बदल गया है। ListView उन पर्यवेक्षकों में से एक है।
  6. अगली बार ListView फिर से खींचा गया है, यह एडाप्टर की अधिसूचना को देखता है और handleDataChanged() पर कॉल करता है। इस बिंदु पर, ListView अभी भी सोचता है कि हमारी अब-हटाई गई वस्तुओं का चयन और डेटासेट में किया गया है।
  7. handleDataChanged() विधि confirmCheckedPositionsById() पर कॉल करता है, जो बदले में एक stale स्थिति का उपयोग कर एडाप्टर पर getItemId() पर कॉल करने का प्रयास करता है। यदि हटाई गई वस्तु सूची के अंत के पास होती है, तो यह स्थिति सरणी के लिए सीमा से बाहर होने की संभावना है, और एडाप्टर IndexOutOfBoundsException फेंक देगा।

दो संभावित समाधानों इस प्रकार हैं:

  • एक नया अनुकूलक हर बार बनाएं डाटासेट में परिवर्तन, अन्य उत्तर में बताया गया है। वर्तमान स्क्रॉल स्थिति को खोने का दुर्भाग्यपूर्ण प्रभाव है जब तक कि यह मैन्युअल रूप से सहेजा और पुनर्स्थापित नहीं किया जाता है।

  • साफ़ बुला ListView (या GridView) पर clearChoices() इससे पहले कि आप एडाप्टर पर notifyDataSetChanged() फोन द्वारा चयनित आइटम। चयनित आइटम किसी भी तरह से हटा दिए जाएंगे, इसलिए वर्तमान चयन स्थिति को खोना एक समस्या होने की संभावना नहीं है। यह विधि स्क्रॉल स्थिति को संरक्षित रखेगी और सूची अद्यतन होने पर झिलमिलाहट को रोकना चाहिए।

+0

एसीजे, आप सही हैं, पुष्टि करते समय एक बग है जब चेकस्टोनिशनबिइड() को एक पुरानी स्थिति पर बुलाया जाता है। हालांकि, मैंने पाया कि अगर मैं clearChoices() को कॉल करता हूं तो एक्शनमोड # फिनिश बहु-चयन मोड से बाहर निकलने में विफल रहता है। –

+0

@ पीटरट्रान दिलचस्प। मल्टी-सिलेक्ट मोड से बाहर निकलने के लिए 'clearCoices()' और फिर 'एक्शनमोड # फिनिश()' को कॉल करना मेरे लिए काम करता है। (मेरा काम 4.0+ पर रहा है।) अगर आपको कोई कामकाज मिल जाए तो कृपया दोबारा पोस्ट करें। – acj

+0

स्पष्ट विकल्प !!! ठीक है !!! लेकिन डोनॉट फोर्ज सेट चॉइसमोड (ListView.CHOICE_MODE_MULTIPLE); फ़ॉलो करें! – YETI

2

बग में confirmCheckedPositionsById (बुलेट # 7 ACJ के जवाब में) getItemId का कारण बनता है एक बासी स्थिति पर कहा जाता है करने के लिए। हालांकि, इसे लेआउट रीफ्रेश करने के लिए सही स्थिति के साथ फिर से बुलाया जाएगा।जब मैं इस समस्या में पड़ गए मैं अद्यतन कस्टम एडाप्टर के getItemId तो

@Override 
public long getItemId(int position) { 
    return position < getCount() ? getItem(position).getId() : -1; 
} 
+0

धन्यवाद, यह मेरे लिए काम करता है! मुझे नहीं पता, लेकिन हमारे पास 2015 है और अभी भी 'पुष्टि की गई स्थिति' ById' में बग है। – Aitch

0

इस तरह एक प्रलेखित बग, उसके लिए वोट करें जाता है:

https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=64596

मेरे उपयोग के मामले ListView ListView के रूप में विन्यस्त है .CHOICE_MODE_SINGLE, मैंने बिना किसी किस्मत के @ पीटर ट्रैन के सुझाव की कोशिश की। यहाँ वैकल्पिक हल मेरे लिए सफल हुआ है जो:

myAdapter.deleteRow(listView.getCheckedItemPosition()); 
    int checkedIndex = listView.getCheckedItemPosition(); 
    System.out.println("checkedIndex="+checkedIndex); 

    int count=myAdapter.getCount(); 
    if (checkedIndex==count) listView.setItemChecked(count-1, true); 

मेरा परीक्षण मैन्युअल रूप से सूची (गिनती -1) पर अंतिम आइटम का चयन करने के लिए है। मैंने गिनती == 0 मामले के लिए हैंडलिंग छोड़ी लेकिन इसकी सबसे अधिक आवश्यकता होगी। मैंने देखा कि println() हमेशा हटाए गए पंक्ति के सूचकांक को प्रिंट करता है। myAdapter.deleteRow() श्रोताओं को डेटा परिवर्तन की सूचना देता है जो मुझे बताता है ListView अपने चेक किए गए इंडेक्स को सही तरीके से अपडेट नहीं कर रहा है। मैंने इस कोड को hasStableIds() के साथ एक ही परिणाम के साथ कस्टम एडाप्टर से सत्य और गलत दोनों के साथ करने की कोशिश की है।

0

AlertDialog.Builder का उपयोग कर फ़िल्टर पूरी तरह से अनुकूलित: -

((TextView) TabBarWithCustomStack.vPublic.findViewById(R.id.tv_edit)) .setVisibility(View.GONE); 
    class DialogSelectionClickHandler implements 
      DialogInterface.OnMultiChoiceClickListener { 
     public void onClick(DialogInterface dialog, int clicked, 
       boolean selected) { 
      Log.i("ME", hosts.toArray()[clicked] + " selected: " + selected); 
     } 
    } 

    class DialogButtonClickHandler implements 
      DialogInterface.OnClickListener { 
     public void onClick(DialogInterface dialog, int clicked) { 
      switch (clicked) { 
      case DialogInterface.BUTTON_POSITIVE: 
       filteredList.clear(); 
       statusesSelected.clear(); 

       for (int i = 0; i < statusesStringArray.length; i++) { 
        // Log.i("ME", statuses.toArray()[ i ] + " selected: " 
        // + isSelectedStatuses[i]); 

        if (isSelectedStatuses[i] == true) { 

         if (statuses.get(i).toString() 
           .equalsIgnoreCase("Accepted")) { 
          statusesSelected.add("1"); 
         } else if (statuses.get(i).toString() 
           .equalsIgnoreCase("Rejected")) { 
          statusesSelected.add("2"); 
         } else if (statuses.get(i).toString() 
           .equalsIgnoreCase("Pending")) { 
          statusesSelected.add("3"); 
         } 

        } 
        isSelectedStatuses[i] = false; 
       } 

       Calendar currentCalender = Calendar.getInstance(Locale 
         .getDefault()); 

       Date currentDate = new Date(
         currentCalender.getTimeInMillis()); 

       if (listSelected == 0) { 
        for (int j = 0; j < arr_BLID.size(); j++) { 
         if (Helper.stringToDate(
           arr_BLID.get(j).getStart_ts().toString(), 
           Helper.SERVER_FORMAT).after(currentDate)) { 
          if (statusesSelected.contains(arr_BLID.get(j) 
            .getStatus())) { 
           filteredList.add(arr_BLID.get(j)); 
          } 
         } 
        } 

       } else { 
        for (int j = 0; j < arr_BLID.size(); j++) { 
         if (currentDate.after(Helper.stringToDate(arr_BLID 
           .get(j).getStart_ts().toString(), 
           Helper.SERVER_FORMAT))) { 
          if (statusesSelected.contains(arr_BLID.get(j) 
            .getStatus())) { 
           filteredList.add(arr_BLID.get(j)); 
          } 
         } 
        } 

       } 

       lvBeeps.setAdapter(new EventsAdapter(ctx)); 

       break; 

      case DialogInterface.BUTTON_NEGATIVE: { 

       currentCalender = Calendar.getInstance(Locale.getDefault()); 

       currentDate = new Date(currentCalender.getTimeInMillis()); 

       if (listSelected == 0) { 

        filteredList.clear(); 
        for (int i = 0; i < arr_BLID.size(); i++) { 
         if (Helper.stringToDate(
           arr_BLID.get(i).getStart_ts().toString(), 
           Helper.SERVER_FORMAT).after(currentDate)) { 
          filteredList.add(arr_BLID.get(i)); 
         } 

         if (i < isSelectedStatuses.length) { 
          isSelectedStatuses[i] = false; 
         } else { 
          continue; 
         } 
        } 

        lvBeeps.setAdapter(new EventsAdapter(ctx)); 
       } else { 

        filteredList.clear(); 
        for (int i = 0; i < arr_BLID.size(); i++) { 
         if (currentDate.after(Helper.stringToDate(arr_BLID 
           .get(i).getStart_ts().toString(), 
           Helper.SERVER_FORMAT))) { 
          filteredList.add(arr_BLID.get(i)); 
         } 

         if (i < isSelectedStatuses.length) { 
          isSelectedStatuses[i] = false; 
         } else { 
          continue; 
         } 

        } 

        lvBeeps.setAdapter(new EventsAdapter(ctx)); 

       } 
      } 
       break; 
      } 
     } 
    } 

    btnHost = (Button) view.findViewById(R.id.btnHost); 
    btnHost.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      // ((TextView)((RelativeLayout)getActivity().getLayoutInflater().inflate(R.layout.event_filter_title, 
      // null)).findViewById(R.id.tvDialogTitle)).setText("Hosts"); 

      // Log.d("Dialog object", 
      // " static made dialog in checkbox--> "+((TextView)((RelativeLayout)getActivity().getLayoutInflater().inflate(R.layout.event_filter_title, 
      // null)).findViewById(R.id.tvDialogTitle)).getText()); 

      final LayoutInflater inflater123 = (LayoutInflater) getActivity() 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      final View view123 = inflater123.inflate(
        R.layout.event_filter_title, null); 

      // Log.d("Dialog object", 
      // " static made dialog in view123--> "+view123); 
      // 
      // Log.d("Dialog object", 
      // " static made dialog in checkbox--> "+((CheckBox)view123.findViewById(R.id.cbSelectAll))); 
      // 
      // Log.d("Dialog object", 
      // " static made dialog in checkbox--> "+((CheckBox)inflater.inflate(R.layout.event_filter_title, 
      // (ViewGroup) ((AlertDialog) 
      // BeepsFragment.dialog).getCurrentFocus(), 
      // true).findViewById(R.id.cbSelectAll))); 
      // 
      // Log.d("Dialog object", 
      // " static made dialog in checkbox--> "+((CheckBox)(((RelativeLayout)getActivity().getLayoutInflater().inflate(R.layout.event_filter_title, 
      // null)).findViewById(R.id.cbSelectAll)))); 
      hostsDialog = new AlertDialog.Builder(getActivity()) 
        .setCustomTitle(/* 
            * Html.fromHtml(
            * "<b><font color=\"purple\"> Host</font></b>" 
            *) 
            */view123) 
        .setIcon(
          getActivity().getResources().getDrawable(
            R.drawable.add_host)) 
        .setMultiChoiceItems(hostsStringArray, isSelectedHosts, 
          new OnMultiChoiceClickListener() { 

           // android.content.DialogInterface.OnShowListener 
           // ocl = new 
           // DialogInterface.OnShowListener() { 
           // 
           // @Override 
           // public void onShow(DialogInterface 
           // dialog) { 
           // // TODO Auto-generated method stub 
           // BeepsFragment.dialog = dialog; 
           // } 
           // }; 

           public void onClick(DialogInterface dialog, 
             int clicked, boolean selected) { 

            boolean all = true; 
            Log.i("ME", hosts.toArray()[clicked] 
              + " selected: " + selected); 

            // for (int i = 0; i < 
            // isSelectedHosts.length; i++){ 
            // 
            // if(isSelectedHosts[i]==true){ 
            // all = true; 
            // }else{ 
            // all = false; 
            // } 
            // } 
            // 
            // Log.i("ME", all + " selected:--- " 
            // +((CheckBox)view123.findViewById(R.id.cbSelectAll))); 
            // 
            // if(all = true){ 
            // ((CheckBox)view123.findViewById(R.id.cbSelectAll)).setChecked(true); 
            // }else{ 
            // ((CheckBox)view123.findViewById(R.id.cbSelectAll)).setChecked(false); 
            // } 

            Log.d("Dialog object", 
              " static made dialog --> " 
                + BeepsFragment.dialog 
                + " from parameter dialog --> " 
                + dialog); 

           } 

          }) 
        .setPositiveButton(
          Html.fromHtml("<b><font color=\"purple\">Apply Filter</font></b>"), 
          new DialogButtonClickHandler() { 

           // android.content.DialogInterface.OnShowListener 
           // ocl = new 
           // DialogInterface.OnShowListener() { 
           // 
           // @Override 
           // public void onShow(DialogInterface 
           // dialog) { 
           // // TODO Auto-generated method stub 
           // BeepsFragment.dialog = dialog; 
           // } 
           // }; 

           public void onClick(DialogInterface dialog, 
             int clicked) { 
            switch (clicked) { 
            case DialogInterface.BUTTON_POSITIVE: 

             filteredList.clear(); 
             hostsSelected.clear(); 

             for (int i = 0; i < hostsStringArray.length; i++) { 
              Log.i("ME", 
                hosts.toArray()[i] 
                  + " selected: " 
                  + isSelectedHosts[i] 
                  + "\n\n\t hostStringArray-->" 
                  + hostsStringArray[i]); 

              if (isSelectedHosts[i] == true) { 

               hostsSelected.add(hosts 
                 .get(i)); 
               isSelectedHosts[i] = false; 
              } 
              // isSelectedHosts[i] = false; 
             } 

             Calendar currentCalender = Calendar 
               .getInstance(Locale 
                 .getDefault()); 

             Date currentDate = new Date(
               currentCalender 
                 .getTimeInMillis()); 

             if (listSelected == 0) { 
              for (int j = 0; j < arr_BLID 
                .size(); j++) { 
               if (Helper 
                 .stringToDate(
                   arr_BLID.get(
                     j) 
                     .getStart_ts() 
                     .toString(), 
                   Helper.SERVER_FORMAT) 
                 .after(currentDate)) { 
                if (hostsSelected 
                  .contains(arr_BLID 
                    .get(j) 
                    .getHost_name())) { 
                 filteredList 
                   .add(arr_BLID 
                     .get(j)); 
                } 
                if (hostsSelected 
                  .contains("Me")) 
                 if (BeepApplication 
                   .getSelfId() == arr_BLID 
                   .get(j) 
                   .getHost_id()) 
                  filteredList 
                    .add(arr_BLID 
                      .get(j)); 
               } 
              } 

             } else { 
              for (int j = 0; j < arr_BLID 
                .size(); j++) { 
               if (currentDate.after(Helper 
                 .stringToDate(
                   arr_BLID.get(
                     j) 
                     .getStart_ts() 
                     .toString(), 
                   Helper.SERVER_FORMAT))) { 
                if (hostsSelected 
                  .contains(arr_BLID 
                    .get(j) 
                    .getHost_name())) { 
                 filteredList 
                   .add(arr_BLID 
                     .get(j)); 
                } 
                if (hostsSelected 
                  .contains("Me")) 
                 if (BeepApplication 
                   .getSelfId() == arr_BLID 
                   .get(j) 
                   .getHost_id()) 
                  filteredList 
                    .add(arr_BLID 
                      .get(j)); 
               } 
              } 

             } 
             lvBeeps.setAdapter(new EventsAdapter(
               ctx)); 
             break; 
            } 
           } 

          }) 
        .setNegativeButton(
          Html.fromHtml("<b><font color=\"purple\">Remove Filter</font></b>"), 
          new DialogButtonClickHandler() { 

           public void onClick(
             final DialogInterface dialog, 
             int clicked) { 

            Calendar currentCalender = Calendar 
              .getInstance(Locale 
                .getDefault()); 

            Date currentDate = new Date(
              currentCalender 
                .getTimeInMillis()); 

            if (listSelected == 0) { 

             filteredList.clear(); 
             for (int i = 0; i < arr_BLID.size(); i++) { 
              if (Helper.stringToDate(
                arr_BLID.get(i) 
                  .getStart_ts() 
                  .toString(), 
                Helper.SERVER_FORMAT) 
                .after(currentDate)) { 
               filteredList.add(arr_BLID 
                 .get(i)); 
               if (i < isSelectedHosts.length) { 
                isSelectedHosts[i] = false; 
               } else { 
                continue; 
               } 
              } 
             } 

             lvBeeps.setAdapter(new EventsAdapter(
               ctx)); 
            } else { 

             filteredList.clear(); 
             for (int i = 0; i < arr_BLID.size(); i++) { 
              if (currentDate.after(Helper 
                .stringToDate(
                  arr_BLID.get(i) 
                    .getStart_ts() 
                    .toString(), 
                  Helper.SERVER_FORMAT))) { 
               filteredList.add(arr_BLID 
                 .get(i)); 
               if (i < isSelectedHosts.length) { 
                isSelectedHosts[i] = false; 
               } else { 
                continue; 
               } 
              } 
             } 

             lvBeeps.setAdapter(new EventsAdapter(
               ctx)); 

            } 
           } 
          }); 

      final AlertDialog dlg = hostsDialog.create(); 

      dlg.show(); 

      ((TextView) view123.findViewById(R.id.tvDialogTitle)) 
        .setText("Hosts"); 

      ((CheckBox) view123.findViewById(R.id.cbSelectAll)) 
        .setOnCheckedChangeListener(new OnCheckedChangeListener() { 

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

          if (isChecked == true) { 

           ListView list = dlg.getListView(); 
           for (int i = 0; i < list.getCount(); i++) { 

            isSelectedHosts[i] = true; 
            list.setItemChecked(i, true); 

           } 

          } 

          else if (isChecked == false) { 

           ListView list = dlg.getListView(); 
           for (int j = 0; j < list.getCount(); j++) { 

            isSelectedHosts[j] = false; 
            list.setItemChecked(j, false); 
           } 
           // } 
          } 

         } 
        }); 

     } 
    }); 

    btnStatus = (Button) view.findViewById(R.id.btnStatus); 
    btnStatus.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      LayoutInflater inflater123 = (LayoutInflater) getActivity() 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      View view123 = inflater123.inflate(R.layout.event_filter_title, 
        null); 

      statusDialog = new AlertDialog.Builder(getActivity()) 
        .setIcon(
          getActivity().getResources().getDrawable(
            R.drawable.add_host)) 
        .setCustomTitle(/* 
            * Html.fromHtml(
            * "<b><font color=\"purple\"> Status</font></b>" 
            *) 
            */view123) 
        .setIcon(
          getActivity().getResources().getDrawable(
            R.drawable.add_host)) 
        .setMultiChoiceItems(statusesStringArray, 
          isSelectedStatuses, 
          new DialogSelectionClickHandler()) 
        .setPositiveButton(
          Html.fromHtml("<b><font color=\"purple\">Apply Filter</font></b>"), 
          new DialogButtonClickHandler() { 

          }) 
        .setNegativeButton(
          Html.fromHtml("<b><font color=\"purple\">Remove Filter</font></b>"), 
          new DialogButtonClickHandler()); 

      final AlertDialog dlg = statusDialog.create(); 

      dlg.show(); 

      ((TextView) view123.findViewById(R.id.tvDialogTitle)) 
        .setText("Status"); 
      ((CheckBox) view123.findViewById(R.id.cbSelectAll)) 
        .setOnCheckedChangeListener(new OnCheckedChangeListener() { 

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

          if (isChecked == true) { 

           ListView list = dlg.getListView(); 
           for (int i = 0; i < list.getCount(); i++) { 

            isSelectedStatuses[i] = true; 
            list.setItemChecked(i, true); 

           } 

          } 

          else if (isChecked == false) { 

           ListView list = dlg.getListView(); 
           for (int j = 0; j < list.getCount(); j++) { 

            isSelectedStatuses[j] = false; 
            list.setItemChecked(j, false); 
           } 
           // } 
          } 

         } 
        }); 

     } 
    }); 
संबंधित मुद्दे