2013-08-31 2 views
15

Я создал таможню listview, у которой есть ImageView слева и TextView справа. И реализация мультивыбора Listview с контекстным меню 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

<?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)); 

Вам необходимо переопределить onItemCheckedStateChanged

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

Рисунок из образцов @

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

Пример: Измените ниже в соответствии с вашими потребностями

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

Edit:

при разрешении/значения-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):

Android: фон = "Android: атр/activatedBackgroundIndicator"

Чтобы понять, что именно он делает, отметьте это other question.

+0

короткий и точный – kittu88

Смежные вопросы