5

我想创建一个与 Gmail android 应用程序功能相似的列表视图。我的意思是您可以通过单击左侧的图像来选择行,或者通过单击行上的其他任何位置来查看电子邮件。我可以靠近,但不完全在那里。

我的自定义行由左侧的 ImageView 和右侧的一些 TextViews 组成。这是我的适配器上 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();
            }
        });
     }

这非常接近!缺少的是在行单击侦听器上突出显示该行。

4

6 回答 6

4

选项 1:使用 listView 的内置choiceMode功能。不幸的是,我从未实施过。所以,不能给你详细的答复。但是您可以从此处和其他答案中获得提示。

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

祝你好运!

于 2013-09-02T10:12:51.400 回答
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);

}

我使用了两个动​​画:

a) 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" />

b) 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/

于 2013-11-24T04:42:11.620 回答
1

您需要设置一个 listSelector。

创建 listSelector 需要做的是一个类似于 Karl 发布的 xml 可绘制对象。

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

如您所见,项目标签甚至可以使用 android:drawable 属性,以防您想要使用 png 来突出显示一行。查找此标签必须提供的所有属性并实现您需要的内容。

最后,为了确保您的 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>);
于 2013-09-02T09:56:38.030 回答
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>

从这里开始:如何在 Android ListView 中设置所选项目的样式?

于 2013-08-28T04:21:22.750 回答
0

您必须为您的 ListView设置一个choiceMode 。

myListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
myListView().setSelector(android.R.color.BLUE);
于 2013-08-25T06:13:05.330 回答
0

这不是像一些带有 imagebuttom 而不是 checkbox 的自定义列表视图吗?

<?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>
于 2013-08-29T21:27:02.823 回答