【问题标题】:Highlight custom listview item when long click长按时突出显示自定义列表视图项
【发布时间】:2013-09-04 03:34:50
【问题描述】:

我创建了一个自定义listview,它的左侧有一个ImageView,右侧有一个TextView。并使用actionbar 上下文菜单实现多选Listview

问题是,当我长按一个项目时,它没有被突出显示。

这是我在ListFragment 中设置listview 的方法

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;
}

}

密码列表项

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

【问题讨论】:

    标签: android listview android-listview


    【解决方案1】:

    使用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>
    

    快照

    因为您怀疑它是否适用于自定义适配器

    编辑:

    在res/values-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"
    

    【讨论】:

    • 这个例子适用于只有文本的列表视图,因为我们设置了 android.R.layout.simple_list_item_activated_1,但在自定义列表视图中它不起作用
    • @MohammedIsa 我怎么知道你在用你发布的细节做了什么
    • @MohammedIsa 检查它对自定义列表视图所做的编辑
    • 是的,我知道它是这样工作的,我已经得到了这个结果,但问题在于“突出显示”所选项目,而不是选择它们
    • @subi 是的,为什么不呢?片段由活动托管。顶部是上下文操作栏。 developer.android.com/guide/topics/ui/menus.html#context-menu
    【解决方案2】:

    在列表的布局文件中设置(在顶级组件中,通常是LinearLayout或RelativeLayout):

    android:background="?android:attr/activatedBackgroundIndicator"

    要了解它的确切作用,请查看other question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 2013-02-18
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多