带有复选框的Android多个列表视图

时间:2014-03-22 18:23:29

标签: android

我是Android编程的新手。我需要创建1000个商品列表供用户点击和检查或者他们想要购买的商品。我已经创建了数组列表并将其添加到我的自定义适配器中,并且我还将它添加到了我的列表视图中。我的问题是如何获得所选项目的位置,我需要澄清getView和ViewHolder。我没有使用吐司

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

您必须使用ListView getCheckedItemPositions()

 /**
 * Returns the set of checked items in the list. The result is only valid if
 * the choice mode has not been set to {@link #CHOICE_MODE_NONE}.
 *
 * @return  A SparseBooleanArray which will return true for each call to
 *          get(int position) where position is a checked position in the
 *          list and false otherwise, or <code>null</code> if the choice
 *          mode is set to {@link #CHOICE_MODE_NONE}.
 */
public SparseBooleanArray getCheckedItemPositions() {
    if (mChoiceMode != CHOICE_MODE_NONE) {
        return mCheckStates;
    }
    return null;
}

答案 2 :(得分:0)

当您的屏幕上显示已调整的新列表项时,将调用

getView()方法。这就是为什么你需要好好照顾记忆,setTag()为你膨胀的每一个项目。然后,当再次查看旧项目时,您不会像新项目那样呈现它,而是通过您为该项目提交的标记来获取它。

示例:如果您有1000件商品,屏幕上只会显示其中的一件商品,您的程序会调用getView()来查看那些可见的商品以及几件可见的商品,这样您就不会# 39;在滚动时看到通货膨胀的滞后。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    if(view==null)
       {
         LayoutInflater inflater=getLayoutInflater();
         view=inflater.inflate(R.layout.list, parent, false);
         TextView textView=(TextView)view.findViewById(R.id.text_hint);
         ImageView imageView=(ImageView)view.findViewById(R.id.img);
         // here we will setTag() our view later
       }
    //... (here we will manage the views and set some click listeners)

现在,什么是 viewHolder

ViewHolder 基本上是适配器中的私有类,用于将夸大的布局元素放在一起,并让您在使用后操纵这些视图< strong> findViewById(int resId)。

一些代码:

private class ViewHolder{
     public ImageView imageView;
     public TextView textView;

     public ViewHolder(ImageView imageView,TextView textView) {
        this.imageView = imageView;
        this.textView = textView;
     }
}

现在按照承诺设置setTag()。

view.setTag(new Holder(imageView,textView));

现在考虑到这一点,您可以使用上面的代码和我在代码的第一部分中获得的视图来获取ViewHolder。 (这是我们要写的而不是3点)

    ViewHolder h = (Holder) view.getTag();
    h.textView.setText(ar[position]);
    int resID = getResources().getIdentifier(pic[position], "drawable", getPackageName());
    h.imageView.setImageResource(resID);
    // here I did set some source to my imageView that is in my layout, but 
    // you can do whatever you want with these views. And that is what I'm 
    // going to explain later in this text.
    return view;
}

好的,下一步是什么?

从标记中获取ViewHolder后,您可以将整个布局作为一个可以轻松获取OnClickListener的视图。或者只是一个checkBox可以获得OnCheckedChangeListener

此侦听器的内部方法可以将数据发送给您的控制器(如果您使用的是MVC模型)或托管此视图的活动,您可以在其中保存项目的复选框和标题的状态点击了。

例如,您可以在相应的侦听器方法上执行类似的操作:

(MainActivity)context.markAsChecked(String title);

但在这种情况下,您还需要使用相反的方法取消选中

(MainActivity)context.markAsUnchecked(String title);

您必须通过浏览已选择的数据数组,在MainActivity中正确处理此问题。

第二个解决方案是:

(MainActivity)context.toggleState(String title);

并处理已检查和未选中的事件。

您的Activity中的方法需要执行与此类似的操作:

public void toggleState(String title){
      if (data.contains(title))
          data.remove(title);
      else data.add(title);
}

然后在用户检查他想要的内容之后,您将拥有数据数组中所有已检查的元素,在这种情况下是 ArrayList 。如果你喜欢或其他什么,你也可以使用HashMap。

希望这会有所帮助。 如果还有更多问题,我将非常乐意回答您的所有问题。

在这种情况下,您可能想要考虑控制器实现。这意味着您将使用MVC模型来更好地控制您的应用程序和数据,并将任务委派给负责的类和方法。不要把所有东西放在一个活动中:))

再见