2013-08-31 6 views
15

पर क्लिक करें, मैंने एक कस्टम listview बनाया है जिसमें बाईं ओर ImageView और दाईं ओर TextView है। और actionbar संदर्भ मेनू के साथ एक बहु-चयन Listview लागू करना।कस्टम सूचीदृश्य आइटम को हाइलाइट करें जब

समस्या यह है कि, जब मैं किसी आइटम पर लंबे समय तक क्लिक करता हूं तो इसे हाइलाइट नहीं किया जाता है।

यहाँ है मैं कैसे सेटअप मेरी ListFragment

PasswordsFragment.java

package mohd.itcs.safewallet; 

import android.os.Bundle; 
import android.support.v4.app.ListFragment; 
import android.view.ActionMode; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AbsListView.MultiChoiceModeListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemLongClickListener; 
import android.widget.ListView; 

public class PasswordsFragment extends ListFragment { 

private String titles[] = { "item1", "item2", "item3" }; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setListAdapter(new CustomPasswordsList(getActivity(), titles)); 

} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    /* 
    * Setup Multiple Selection Mode 
    */ 
    getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
    getListView().setOnItemLongClickListener(new OnItemLongClickListener() { 

     @Override 
     public boolean onItemLongClick(AdapterView<?> listview, View item, 
       int position, long id) { 
      getListView().setItemChecked(position, true); 
      return true; 
     } 

    }); 

    getListView().setMultiChoiceModeListener(new MultiChoiceModeListener() { 

     @Override 
     public boolean onActionItemClicked(ActionMode arg0, MenuItem arg1) { 
      // TODO Auto-generated method stub 
      return false; 
     } 

     /* 
     * Inflate Actionbar Menu for Passwords Multiple Selection 
     */ 
     @Override 
     public boolean onCreateActionMode(ActionMode arg0, Menu menu) { 
      getActivity().getMenuInflater().inflate(
        R.menu.passwords_context_menu, menu); 
      return true; 
     } 

     @Override 
     public void onDestroyActionMode(ActionMode arg0) { 
     } 

     @Override 
     public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) { 
      return false; 
     } 

     @Override 
     public void onItemCheckedStateChanged(ActionMode actionMode, 
       int position, long id, boolean arg3) { 
      /* 
      * Change Title bar to number of selection 
      */ 
      int checkedItems = getListView().getCheckedItemCount(); 
      actionMode.setTitle(String.valueOf(checkedItems) + " Selected"); 
     } 
    }); 

} 

} 

CustomPasswordsList.java

package mohd.itcs.safewallet; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class CustomPasswordsList extends ArrayAdapter<String> { 

private final Context context; 
private final String values[]; 

public CustomPasswordsList(Context context, String[] values) 
{ 
    super(context, R.layout.password_list_item, values); 
    this.context = context; 
    this.values = values; 
} 

public View getView(int position, View convertView, ViewGroup parent) 
{ 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View rowView = inflater.inflate(R.layout.password_list_item, parent, false); 
    TextView passwordTitle = (TextView) rowView.findViewById(R.id.textView_passwordTitle); 
    ImageView passwordIcon = (ImageView) rowView.findViewById(R.id.imageView_passwordIcon); 

    passwordTitle.setText(values[position]); 

    passwordIcon.setImageResource(R.drawable.facebook); 


    return rowView; 
} 

} 

passwords_list_item में listview

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

<ImageView 
    android:id="@+id/imageView_passwordIcon" 
    android:layout_height="60dp" 
    android:contentDescription="@string/imageView_passwordIcon" 
    android:layout_width="60dp" /> 

<TextView 
    android:id="@+id/textView_passwordTitle" 
    android:layout_height="wrap_content" 
    android:layout_width="0dp" 
    android:paddingLeft="10dp" 
    android:paddingTop="15dp" 
    android:textSize="16sp" 
    android:textColor="#000000" 
    android:layout_weight="1" /> 

</LinearLayout> 

उत्तर

20

getActivity() का उपयोग कर के लिए पर्याप्त है

setListAdapter(new CustomPasswordsList(getActivity(), titles)); 

आप उन नमूनों से ड्राइंग @

android-sdk-linux/samples/android-17/ApiDemos/src/com/example/android/apis/view/List16 

उदाहरण onItemCheckedStateChanged

public void onItemCheckedStateChanged(ActionMode mode, 
      int position, long id, boolean checked) { 
     final int checkedCount = getListView().getCheckedItemCount(); 
     // get checked items count 

ओवरराइड करने के लिए की जरूरत है: नीचे अपनी आवश्यकताओं के अनुसार संशोधित

public class MainActivity extends ListActivity { 
    String[] GENRES = new String[] { 
      "Action", "Adventure", "Animation", "Children", "Comedy", 
     "Documentary", "Drama", 
      "Foreign", "History", "Independent", "Romance", "Sci-Fi", 
     "Television", "Thriller" 
     }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ListView lv = getListView(); 
     lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
     lv.setMultiChoiceModeListener(new ModeCallback()); 
     setListAdapter(new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_activated_1, GENRES)); 
    } 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     getActionBar().setSubtitle("Long press to start selection"); 
    } 

    private class ModeCallback implements ListView.MultiChoiceModeListener { 

     public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
      MenuInflater inflater = getMenuInflater(); 
      inflater.inflate(R.menu.list_select_menu, menu); 
      mode.setTitle("Select Items"); 
      return true; 
     } 

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

     public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
      switch (item.getItemId()) { 
      case R.id.share: 
       Toast.makeText(MainActivity.this, "Shared " + getListView().getCheckedItemCount() + 
         " items", Toast.LENGTH_SHORT).show(); 
       mode.finish(); 
       break; 
      default: 
       Toast.makeText(MainActivity.this, "Clicked " + item.getTitle(), 
         Toast.LENGTH_SHORT).show(); 
       break; 
      } 
      return true; 
     } 

     public void onDestroyActionMode(ActionMode mode) { 
     } 

     public void onItemCheckedStateChanged(ActionMode mode, 
       int position, long id, boolean checked) { 
      final int checkedCount = getListView().getCheckedItemCount(); 
      switch (checkedCount) { 
       case 0: 
        mode.setSubtitle(null); 
        break; 
       case 1: 
        mode.setSubtitle("One item selected"); 
        break; 
       default: 
        mode.setSubtitle("" + checkedCount + " items selected"); 
        break; 
      } 
     } 

    } 
} 

list_select_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/share" 
      android:title="share" 
      android:icon="@android:drawable/ic_menu_share" 
      android:showAsAction="always" /> 
</menu> 

स्नैप

enter image description here

गोली मार दी जब से तुम पर शक कर रहे हैं कि क्या यह कस्टम एडाप्टर के साथ काम करेगा

enter image description here

संपादित करें:

0,123,

रेस के तहत/मूल्यों-v11/styles.xml

<resources> 

    <style name="AppTheme" parent="android:Theme.Holo.Light"></style> 

    <style name="activated" parent="AppTheme"> 
     <item name="android:background">?android:attr/activatedBackgroundIndicator</item> 
    </style> 

</resources> 

मूल तत्व के लिए कस्टम लेआउट में अपनी सूची के पंक्ति के लेआउट फ़ाइल में जोड़ने

style="@style/activated" 
+0

यह उदाहरण केवल टेक्स्ट के साथ एक सूचीदृश्य के साथ ठीक काम करता है, क्योंकि हम android.R.layout सेट करते हैं।simple_list_item_activated_1, लेकिन कस्टम सूचीदृश्य में यह –

+0

@MohammedIsa काम नहीं करता है यदि आप तदनुसार संशोधित करते हैं तो यह काम करेगा। – Raghunandan

+0

किस भाग को संशोधित करें? –

12

सेट (शीर्ष में स्तर घटक, आम तौर पर एक LinearLayout या RelativeLayout):

एंड्रॉयड: पृष्ठभूमि = "एंड्रॉयड: attr/activatedBackgroundIndicator"

यह समझने के लिए कि यह वास्तव में क्या करता है, यह other question देखें।

+0

लघु और सटीक – kittu88

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