2012-01-12 9 views
18

मैं जीमेल ऐप में ListView के साथ Google ने क्या किया है उसे फिर से बनाने की कोशिश कर रहा हूं। विशेष रूप से, मैं प्रत्येक सूची आइटम में एक चेकबॉक्स और दो टेक्स्ट व्यू (दूसरे के शीर्ष पर एक) शामिल करना चाहता हूं। मुझे श्रोताओं की आवश्यकता होती है जब चेकबॉक्स चेक किया जाता है (या क्लिक किया जाता है) और जब सूची आइटम पर कहीं और क्लिक किया जाता है। आखिरकार, मैं एक्शनबार को यह प्रतिबिंबित करना चाहता हूं कि आइटम चुने गए हैं और विकल्प चुनें, सभी का चयन करें, कोई भी नहीं चुनें, आदि (this screenshot देखें)।चेकबॉक्स के साथ जीमेल जैसी सूची दृश्य (और एक्शनबार का उपयोग करके)

enter image description here

अब तक, यहां लेआउट मैं के साथ आया है।

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

    <CheckBox android:id="@+id/checkBox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical|center_horizontal" /> 

    <LinearLayout android:id="@+id/linearLayout1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:padding="6dp" 
     android:focusable="true" 
     android:clickable="true" > 

     <TextView android:id="@+id/titleTextView" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:textSize="16sp" /> 

     <TextView android:id="@+id/dateTextView" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:textSize="12sp" /> 

    </LinearLayout> 

</LinearLayout> 

यह ठीक से सब कुछ को प्रदर्शित करता है, लेकिन मैं कैसे के लिए दो दृश्य (@ + id/चेकबॉक्स और @ + id/linearLayout1) श्रोताओं को सेट करने के संकेत दिए की जरूरत है। मैंने List16 API demo पर देखा है, लेकिन वे simple_list_item_activated_1 लेआउट का उपयोग कर रहे हैं और मुझे यकीन नहीं है कि इसके लिए एक्सएमएल कैसा दिखता है। उनके कोड पता चलता है, मैं एक ModeCallback वर्ग को लागू करने वाली ListView.MultiChoiceModeListener बनाया है और मैं CHOICE_MODE_MULTIPLE_MODAL को ListView की पसंद मोड सेट है, लेकिन मैं यह कैसे के साथ काम करने के लिए अपने लेआउट में चेकबॉक्स का चयन करें पता नहीं है।

क्या किसी ने सफलतापूर्वक जीमेल ऐप के लिस्ट व्यू व्यवहार की प्रतिलिपि बनाई है? मैंने काफी खोज की है और कुछ भी नहीं आ सकता है (कई अन्य प्रश्न पूछने के बावजूद, like this one - अधिकांश उत्तर सिर्फ उसी एपीआई डेमो पर इंगित करते हैं)।

इसके अलावा, संदर्भ के लिए, मैं सूची में SQLite डेटाबेस से डेटा लोड कर रहा हूं और मैंने अपना स्वयं का कर्सर एडाप्टर बनाया है (जो ठीक काम करता है)। मुझे एहसास है कि मुझे इस कक्षा में श्रोताओं को newView() और bindView() विधियों में स्थापित करने की आवश्यकता है, लेकिन मैंने जो कुछ भी किया है, वह काम नहीं कर पाया है।

कोई विचार?

+0

क्या मुझे अपने प्रश्न को बेहतर तरीके से समझाने की ज़रूरत है, या क्या मैं बस इतना पूछ रहा हूं? :/ – mturco

उत्तर

7

आकृति में मोड को क्रिया मोड कहा जाता है। यदि आप अपने कस्टम पंक्ति दृश्य और कस्टम एडाप्टर का उपयोग कर रहे हैं, तो आपको एक्शन मोड शुरू करने के लिए CHOICE_MODE_MULTIPLE_MODAL का उपयोग करने की आवश्यकता नहीं है। मैंने इसे एक बार कोशिश की और असफल रहा, और मुझे संदेह है कि इसका उपयोग अंतर्निहित एडाप्टर के लिए किया जाता है।

अपने कोड में स्वयं द्वारा एक्शन मोड को कॉल करने के लिए, कॉल विधि प्रारंभ करें किसी भी श्रोता विधि में किसी भी श्रोता विधि में कॉल करें, इसे चेकबॉक्स, टेक्स्टव्यू या ऐसा कुछ दें। फिर आप मोडकॉलबैक को पैरामीटर के रूप में पास करते हैं, और मोडकॉलबैक क्लास में जो भी ऑपरेशन करना चाहते हैं, वह करें।

मुझे नहीं लगता कि यह प्री-3.0 एंड्रॉइड पर काम करेगा हालांकि।

यहां एक संक्षिप्त उदाहरण है। मैं एक विस्तार योग्य सूची गतिविधि है और जब उपयोगकर्ता चेक/चेकबॉक्स का चयन रद्द, और यहाँ मेरी getChildView विधि अपने कस्टम एडाप्टर कक्षा में है कार्रवाई मोड मेनू बाहर कॉल करने के लिए करना चाहते हैं:

public View getChildView(int groupPosition, int childPosition, 
      boolean isLastChild, View convertView, ViewGroup parent) { 

     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.childrow, null); 
     } 
     CheckBox cb = (CheckBox)convertView.findViewById(R.id.row_check); 
     cb.setChecked(false); // Initialize 
     cb.setTag(groupPosition + "," + childPosition); 
     cb.setFocusable(false); // To make the whole row selectable 
     cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       String tag = (String)buttonView.getTag(); 
       String[] pos = tag.split(","); 
       if (isChecked) { 
        if (mActionMode == null) mActionMode = startActionMode(mMultipleCallback);      
       } 
       else { 
        if (mActionMode != null) { // Only operate when mActionMode is available 

         mActionMode.finish(); 
         mActionMode = null; 
        } 
       } 
      } 
     }); 

     TextView tvTop = (TextView)convertView.findViewById(R.id.row_text_top); 
     TextView tvBottom = (TextView)convertView.findViewById(R.id.row_text_bottom); 
     tvTop.setText(mChildren.get(groupPosition).get(childPosition)); 
     tvBottom.setText(mChildrenSize.get(groupPosition).get(childPosition)); 
     return convertView; 
    } 
+0

धन्यवाद! मैं आज रात कोशिश करूँगा और देख सकता हूं कि मैं इसे काम कर सकता हूं या नहीं। इसे तब तक उत्तर के रूप में चिह्नित करना। – mturco

2

में इसके अलावा tocnbuff410 के जवाब निम्न का उपयोग अद्यतन करने के लिए कोड आइटम गिनती

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
if (isChecked) { 
    ++checkBoxCount; 
} else { 
    --checkBoxCount; 
} 
... 

if (mActionMode != null) { 
    mActionMode.setSubtitle(checkBoxCount + " item(s) selected."); 
} 

मैं पुष्टि कर सकता है कि निम्नलिखित कोड कस्टम listviews के चेक बॉक्स पर काम नहीं होगा की जाँच की।हालांकि, लंबी प्रेस अभी भी काम करेगी:

listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
listView.setMultiChoiceModeListener(new ModeCallback()); 

कस्टम ListView पर चेकबॉक्स का चयन एक्शनमोड ट्रिगर नहीं करेगा। केवल इनबिल्ट लिस्ट व्यू उदा। सूचीकरण को विस्तारित करना स्वचालित रूप से ऐसा करेगा।

+0

भी बहुत उपयोगी है। धन्यवाद! – mturco

11

यह एसडीके 7 (एंड्रॉइड 2.1) और उच्चतर में काम करेगा। (शेरलॉकएक्शनबार के साथ)

टोटली नकली जीमेल सूचीबॉक्स अनुभव।

मैं टचवेन्ट पर ओवरराइड करता हूं इसलिए बाएं कोने में दबाएं चयन मोड को सक्रिय करेगा; मैच बेहतर तो छोटे चेकबॉक्स पर क्लिक करने की कोशिश कर रहा है।

मैं प्रदर्शन को ओवरराइड करता हूंइटम क्लिक करें ताकि बाईं ओर न दबाएं नियमित प्रेस कार्रवाई के रूप में कार्य करे।

मैं सेट इटैम चेक ओवरराइड करता हूं ताकि यह आवश्यकतानुसार मैक्शनमोड अपडेट कर सके।

public class SelectListView extends ListView { 

    private SherlockFragmentActivity mActivity; 
    ActionMode mActionMode; 

     public SelectListView(Context context) { 
    this(context, null, 0); 
} 

public SelectListView(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
} 


public SelectListView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    mActivity = (SherlockFragmentActivity) context; 
} 

    @Override 
    public boolean performItemClick(View view, int position, long id) { 
     OnItemClickListener mOnItemClickListener = getOnItemClickListener(); 
     if (mOnItemClickListener != null) { 
      playSoundEffect(SoundEffectConstants.CLICK); 
      if (view != null) 
       view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); 
      mOnItemClickListener.onItemClick(this, view, position, id); 
      return true; 
     } 
     return false; 
    } 

    boolean mSelectionMode = false; 
    int mStartPosition; 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 

     final int action = ev.getAction(); 
     final int x = (int) ev.getX(); 
     final int y = (int) ev.getY(); 

     if (action == MotionEvent.ACTION_DOWN && x < getWidth()/7) { 
      mSelectionMode = true; 
      mStartPosition = pointToPosition(x, y); 
     } 
     if (!mSelectionMode) 
      return super.onTouchEvent(ev); 
     switch (action) { 
     case MotionEvent.ACTION_DOWN: 
      break; 
     case MotionEvent.ACTION_MOVE: 
      if (pointToPosition(x, y) != mStartPosition) 
       mSelectionMode = false; 
      break; 
     case MotionEvent.ACTION_CANCEL: 
     case MotionEvent.ACTION_UP: 
     default: 
      mSelectionMode = false; 
      int mItemPosition = pointToPosition(x, y); 
      if (mStartPosition != ListView.INVALID_POSITION) 
       setItemChecked(mItemPosition, !isItemChecked(mItemPosition)); 
     } 

     return true; 
    } 

    @Override 
    public void setItemChecked(int position, boolean value) { 
     super.setItemChecked(position, value); 
     // boolean r = getAdapter().hasStableIds(); 
     int checkedCount = getCheckItemIds().length; 

     if (checkedCount == 0) { 
      if (mActionMode != null) 
       mActionMode.finish(); 
      return; 
     } 
     if (mActionMode == null) 
      mActionMode = mActivity.startActionMode(new ModeCallback()); 

     mActionMode.setTitle(checkedCount + " selected"); 

    } 

    class ModeCallback implements ActionMode.Callback { 

     @Override 
     public boolean onCreateActionMode(ActionMode mode, Menu menu) { 

      menu.add(getResources().getString(R.string.aBar_remove)).setIcon(R.drawable.ic_action_trash) 
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 

      return true; 
     } 

     @Override 
     public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
      return true; 
     } 

     @Override 
     public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
      Toast.makeText(mActivity, "Delted items", Toast.LENGTH_SHORT).show(); 
      mode.finish(); 
      return true; 
     } 

     @Override 
     public void onDestroyActionMode(ActionMode mode) { 
      mActionMode = null; 
      clearChecked(); 
     } 

    } 

    public void clearChecked() { 
     SparseBooleanArray CItem = getCheckedItemPositions(); 
     for (int i = 0; i < CItem.size(); i++) 
      if (CItem.valueAt(i)) 
       super.setItemChecked(CItem.keyAt(i), false); 
    } 

} 

आप किसी भी सूची बॉक्स एडाप्टर का उपयोग कर सकते हैं जो आपको चाहिए।

आप इस तरह अपने एडाप्टर हद तक अपने list_item_layout tou की जरूरत पर एक चेकबॉक्स है, तो:

ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(this, R.layout.simple_list_item_multiple_choice, 
      R.id.text1, Cheeses.sCheeseStrings) { 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View v = super.getView(position, convertView, parent); 
      CheckBox checkBox = (CheckBox) v.findViewById(R.id.CheckBox); 
      checkBox.setChecked(((ListView)parent).isItemChecked(position)); 
      return v; 
     } 

    }; 

एंड्रॉयड का उपयोग करने के लिए मत भूलना: अपने list_item_layout.xml

पर पृष्ठभूमि = "attr/activatedBackgroundIndicator?"
+0

जब मैं सूचीदृश्य स्क्रॉल करता हूं तो मैं चेक बॉक्स के साथ प्रासंगिक क्रिया पट्टी को कार्यान्वित करता हूं, फिर एक्शनबार पर चेकबॉक्स गिनती सेट को बनाए रखता हूं। कोई मदद? –

+0

एक आकर्षण की तरह काम करता है। : डी – Uzair

संबंधित मुद्दे