我是Android编程的新手。我需要创建1000个商品列表供用户点击和检查或者他们想要购买的商品。我已经创建了数组列表并将其添加到我的自定义适配器中,并且我还将它添加到了我的列表视图中。我的问题是如何获得所选项目的位置,我需要澄清getView和ViewHolder。我没有使用吐司
答案 0 :(得分:0)
请参阅以下教程
http://sunil-android.blogspot.in/2013/04/android-listview-checkbox-example.html
http://developerandro.blogspot.in/2013/09/listview-with-checkbox-android-example.html
http://aboutyusata.blogspot.in/2013/11/how-to-make-listview-with-checkbox-in.html
希望它有所帮助。
答案 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模型来更好地控制您的应用程序和数据,并将任务委派给负责的类和方法。不要把所有东西放在一个活动中:))
再见