2013-08-25 8 views
5

मैं एक सूचीदृश्य बनाना चाहता हूं जो जीमेल एंड्रॉइड ऐप की कार्यक्षमता में समान है। इसके द्वारा मेरा मतलब है कि आप बायीं ओर एक छवि पर क्लिक करके पंक्तियों का चयन कर सकते हैं या पंक्ति पर कहीं और क्लिक करके ईमेल देख सकते हैं। मैं करीब आ सकता हूं, लेकिन यह काफी नहीं है।जीमेल शैली सूचीदृश्य

मेरी कस्टम पंक्ति में बाईं ओर एक छवि दृश्य और दाईं ओर कुछ टेक्स्ट व्यू शामिल हैं। मेरे एडाप्टर पर getView का सारांश यहां दिया गया है।

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View row = super.getView(position, convertView, parent); 

     imageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       getListView().setItemChecked(position, !getListView().isItemChecked(position)); 
      } 
     }); 

     row.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(getActivity(), "" + position, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

यह बहुत करीब आता है! क्या गायब है पंक्ति पंक्ति श्रोता पर पंक्ति की हाइलाइटिंग है।

+0

आप के बारे में 'प्रासंगिक Menus' बात कर रहे हैं? –

+0

नहीं। जीमेल ऐप खोलें, यदि आप पंक्ति के बाईं ओर क्लिक करते हैं तो पंक्ति का चयन किया जाता है। यदि आप कहीं और क्लिक करते हैं तो आपको विस्तार दृश्य (ईमेल की सामग्री) पर ले जाया जाता है। – user140550

+0

क्या आपको एनीमेशन मिलता है जो इस छवि के साथ आपकी छवि को चेक-बॉक्स में फ़्लिप करता है? मैं ऐसा करने की कोशिश कर रहा हूं, लेकिन मैं कल्पना नहीं कर सकता कि यह इतना आसान होगा? चयन के लिए आपको अपनी पंक्ति ऑब्जेक्ट का पृष्ठभूमि रंग सेट करने की आवश्यकता होती है जब पंक्ति वास्तव में चुनी जाती है और इसके लिए आपको चयन राज्यों को स्वयं सहेजने की आवश्यकता होती है। चाणू का जवाब बिल्कुल वही लगता है जो आपको चाहिए? – 3c71

उत्तर

0

आपको अपनी सूची दृश्य में choiceMode सेट करना होगा।

myListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
myListView().setSelector(android.R.color.BLUE); 
+0

यह नहीं है। मैं पसंद मोड को 'CHOICE_MODE_MULTIPLE_MODAL' पर सेट कर रहा हूं - मैं इसे जीमेल ऐप की तरह काम करना चाहता हूं इसलिए मुझे कई पंक्तियों का चयन करने में सक्षम होना चाहिए। – user140550

0

क्या अनुपलब्ध है पंक्ति क्लिक श्रोता पर पंक्ति के हाइलाइटिंग है।

लगता है कि आपने विषय सूचीदृश्य पंक्ति की जरूरत है ...

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" 
     <shape> 
      <solid android:color="#929292" /> 
     </shape> 
    </item> 

    <item> 
     <shape> 
      <solid android:color="#FFFFFF" /> 
     </shape> 
    </item> 
</selector> 

यहाँ से: How do I style selected item in Android ListView?

0

कि बजाय imagebuttom चेकबॉक्स के साथ कुछ कस्टम सूचीदृश्य की तरह नहीं है?

<?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="wrap_content" 
android:orientation="horizontal" > 

<ImageView 
    android:id="@+id/ivImage" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/ic_launcher" 
    android:layout_gravity="left" 
    android:contentDescription="@string/app_name" > 
</ImageView> 

<LinearLayout 
    android:id="@+id/linearLayout1" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="5dp" 
    android:orientation="vertical" 
    android:layout_weight="1" > 

    <TextView 
     android:id="@+id/tvDescr" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_margin="5dp" 
     android:text="" 
     android:textSize="20sp" > 
    </TextView> 

    <TextView 
     android:id="@+id/tvPrice" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="5dp" 
     android:text="" > 
    </TextView> 
    </LinearLayout> 


    </LinearLayout> 
+0

हाँ, लेकिन इस कस्टम लेआउट में पोस्ट किए गए कोड को लागू करें और फिर इसे जीमेल ऐप से तुलना करें। ImageView पर क्लिक ठीक काम करता है लेकिन यदि आप पंक्ति पर कहीं और क्लिक करते हैं तो यह सामान्य पर क्लिक करें पर क्लिक नहीं करता है ITemListClick हैंडलर करता है। यहां एक ठोस उदाहरण दिया गया है: जीमेल में 2 ईमेल हाइलाइट करें और फिर गैर-चयन क्षेत्र में क्लिक करें। पंक्ति नीली चमकती है और आपको विवरण दृश्य में लाया जाता है। जब आप गैर-चयन क्षेत्र पर क्लिक करते हैं तो इस तरह के लेआउट के साथ मेरा कोड नीला नहीं होता है। – user140550

1

आपको सूची चयन करने के लिए क्या चाहिए। चयनकर्ता।

सूची बनाने के लिए आपको क्या करने की आवश्यकता होगी चयनकर्ता एक एक्सएलएल ड्रॉबल है जिसे एक कार्ल पोस्ट किया गया है। drawable विशेषता मामले आप एक PNG है आप एक पंक्ति हाइलाइट करने के लिए उपयोग करना चाहते में:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true"> 
     <shape> 
      <solid android:color="#929292" /> 
     </shape> 
    </item> 
    <!-- if you need even a disabled state --> 
    <item android:state_enabled="false" android:drawable="@drawable/my_drawable" /> 
    <item> 
     <shape> 
      <solid android:color="#FFFFFF" /> 
     </shape> 
    </item> 
</selector> 

आप देख सकते हैं, आइटम टैग भी एंड्रॉयड उपयोग कर सकते हैं। इस टैग को प्रदान करने वाले सभी विशेषताओं की खोज करें और आपको जो चाहिए वह लागू करता है।

अंत में, सुनिश्चित करें कि आपके ListView इस चयनकर्ता का उपयोग करता है बनाने के लिए, आप XML लेआउट के अंदर यह सेट करना होगा:

<ListView 
    android:id="@id/android:list" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:choiceMode="multipleChoice" 
    android:listSelector="@drawable/enel_list_selector"/> 

या कोड के माध्यम से:

ListView listView = (ListView) <activity|view>.findViewById(android.R.id.list); 
listView.setSelector(R.drawable.<nameOfYourXmlDrawable>); 
4

विकल्प 1: उपयोग ListView की इनबिल्ट choiceMode सुविधा। दुर्भाग्य से, मैंने कभी लागू नहीं किया है। तो, आपको एक विस्तृत उत्तर नहीं दे सकता है। लेकिन आप here और अन्य उत्तरों से एक संकेत ले सकते हैं।

विकल्प 2: इसे अपने आप लागू करें। array/list या किसी भी कार्य-आसपास को परिभाषित करें जो आपकी सूची के चयनित तत्व की अनुक्रमणिका रखता है। और उसके बाद getView() में पृष्ठभूमि फ़िल्टर करने के लिए इसका उपयोग करें। यहां एक कामकाजी उदाहरण है:

public class TestAdapter extends BaseAdapter { 

List<String> data; 
boolean is_element_selected[]; 

public TestAdapter(List<String> data) { 
    this.data = data; 
    is_element_selected = new boolean[data.size()]; 
} 

public void toggleSelection(int index) { 
    is_element_selected[index] = !is_element_selected[index]; 
    notifyDataSetChanged(); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    //Initialize your view and stuff 

    if (is_element_selected[position]) 
     convertView.setBackgroundColor(context.getResources().getColor(R.color.blue_item_selector)); 
    else 
     convertView.setBackgroundColor(Color.TRANSPARENT); 

    imageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       toggleSelection(position); 
      } 
     }); 

     row.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //get to detailed view page 
      } 
     }); 

    return convertView; 
} 

शुभकामनाएँ!

2

तरह जीमेल का उपयोग कर इस तरह मैं अपने getview विधि बनाया आप मदद कर सकते हैं:

public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 

    LayoutInflater inflater = (LayoutInflater) context.getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.list_item, null); 
     holder = new ViewHolder(); 
     holder.title = (TextView) convertView.findViewById(R.id.title); 
     holder.selectBox = (ImageView) convertView.findViewById(R.id.selectBox); 
     convertView.setTag(holder); 
    } 

    holder = (ViewHolder) convertView.getTag(); 

    holder.title.setText(getItem(position).getTitle()); 
    holder.selectBox.setTag("" + position); 
    holder.selectBox.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ivFlip = (ImageView) v; 
      ivFlip.clearAnimation(); 
      ivFlip.setAnimation(animation1); 
      ivFlip.startAnimation(animation1); 
      setAnimListners(mailList.get(Integer.parseInt(v.getTag().toString()))); 
     } 

    }); 

    if (mailList.get(position).isChecked()) { 
     holder.selectBox.setImageResource(R.drawable.cb_checked); 
     convertView.setBackgroundColor(context.getResources().getColor(R.color.list_highlight)); 

    } else { 
     holder.selectBox.setImageResource(R.drawable.cb_unchecked); 
     convertView.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.list_selector)); 

    } 

    return convertView; 

} 

private void setAnimListners(final MyListItem curMail) { 
    AnimationListener animListner; 
    animListner = new AnimationListener() { 

     @Override 
     public void onAnimationStart(Animation animation) { 
      if (animation == animation1) { 
       if (curMail.isChecked()) { 
        ivFlip.setImageResource(R.drawable.cb_unchecked); 
       } else { 
        ivFlip.setImageResource(R.drawable.cb_checked); 
       } 
       ivFlip.clearAnimation(); 
       ivFlip.setAnimation(animation2); 
       ivFlip.startAnimation(animation2); 
      } else { 
       curMail.setIsChecked(!curMail.isChecked()); 
       setCount(); 
       setActionMode(); 
      } 
     } 

     // Set selected count 
     private void setCount() { 
      if (curMail.isChecked()) { 
       checkedCount++; 
      } else { 
       if (checkedCount != 0) { 
        checkedCount--; 
       } 
      } 

     } 

     // Show/Hide action mode 
     private void setActionMode() { 
      if (checkedCount > 0) { 
       if (!isActionModeShowing) { 
        mMode = ((MainActivity) context).startActionMode(new MainActivity.AnActionModeOfEpicProportions(context)); 
        isActionModeShowing = true; 
       } 
      } else if (mMode != null) { 
       mMode.finish(); 
       isActionModeShowing = false; 
      } 

      // Set action mode title 
      if (mMode != null) 
       mMode.setTitle(String.valueOf(checkedCount)); 

      notifyDataSetChanged(); 

     } 

     @Override 
     public void onAnimationRepeat(Animation arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onAnimationEnd(Animation arg0) { 
      // TODO Auto-generated method stub 

     } 
    }; 

    animation1.setAnimationListener(animListner); 
    animation2.setAnimationListener(animListner); 

} 

और मुझे दो एनिमेशन का प्रयोग किया:

ए) to_middle.xml:

<?xml version="1.0" encoding="utf-8"?> 
<scale xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="200" 
    android:fromXScale="1.0" 
    android:fromYScale="1.0" 
    android:pivotX="50%" 
    android:pivotY="50%" 
    android:toXScale="0.0" 
    android:toYScale="1.0" /> 

ख) from_middle.xml:

<?xml version="1.0" encoding="utf-8"?> 
<scale xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="200" 
    android:fromXScale="1.0" 
    android:fromYScale="1.0" 
    android:pivotX="50%" 
    android:pivotY="50%" 
    android:toXScale="0.0"/> 

आशा इस लिंक आप आगे मदद मिलेगी: http://techiedreams.com/gmail-like-flip-animated-multi-selection-list-view-with-action-mode/