首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从arrayList类的适配器中获取listView值

从arrayList类的适配器中获取listView值
EN

Stack Overflow用户
提问于 2016-06-13 06:54:37
回答 2查看 929关注 0票数 1

如果单击复选框,我已经将一些值存储在数组中,但我很难从listView类获得它。我怎么能得到它。另外,如果我将clickListener放在包含复选框和textView的视图中,则复选框单击不起作用,但如果在textview中单击,则会工作。如何修复它。下面是我的密码。提前感谢

singlerow_compare.xml

代码语言:javascript
复制
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:id="@+id/singleRow" android:gravity="center">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textViewCompare" />

    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageViewCompare"/>

</RelativeLayout>

listview xml:

代码语言:javascript
复制
<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/listViewCompare" />

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Compare"
    android:id="@+id/compare"
    android:layout_alignParentBottom="true"/>

ListView.java

代码语言:javascript
复制
listView = (HorizontalListView) findViewById(R.id.listViewCompare);
compareBtn = (Button) findViewById(R.id.compare);
listView.setAdapter(new CustomAdapter(this, nameList, imageList)); 
compareBtn.setOnClickListener(new View.OnClickListener()
    {   @Override
            public void onClick(View view) {
            //I need to have addCheckBoxValue arraylist from adapter here
            }
    }

CustomAdapter.java

代码语言:javascript
复制
public class CustomAdapter extends BaseAdapter {
ArrayList result;
Context context;
Drawable [] imageId;
protected ArrayList<String> addCheckBoxValue;

private static LayoutInflater inflater=null;
public CustomAdapter(CompareListView mainActivity, ArrayList nameList, Drawable[] imageList) {
    result=nameList;
    context=mainActivity;
    imageId=imageList;
    inflater = ( LayoutInflater )context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public class Holder
{
    TextView tv;
    ImageView img;
    CheckBox checkBox;
}

@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
    addCheckBoxValue = new ArrayList();
    final Holder holder=new Holder();
    View rowView;
    rowView = inflater.inflate(R.layout.singlerow_compare, null);
    holder.tv=(TextView) rowView.findViewById(R.id.textViewCompare);
    holder.checkBox = (CheckBox) rowView.findViewById(R.id.imageViewCompare);
    holder.tv.setText(result.get(i).toString());
    holder.checkBox.setButtonDrawable(imageId[i]);
    final String selectedCbValue = holder.tv.getText().toString();
    holder.checkBox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            boolean checked = ((CheckBox) view).isChecked();
            if(checked){
                if (!addCheckBoxValue.contains(selectedCbValue))
                    addCheckBoxValue.add(selectedCbValue);
            }else{
                if (addCheckBoxValue.contains(selectedCbValue))
                    addCheckBoxValue.remove(selectedCbValue);
            }
        }
    });
    rowView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
     //if i click on textView, it works but when i click on checkbox here, it doesnt work why?? So i have clicklistener in checkbox abov
        }
    });
    return rowView;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-13 07:04:45

CustomAdapter类中创建以下方法:

代码语言:javascript
复制
public  ArrayList<String> getCheckBoxValue(){
    return addCheckBoxValue;
}

在你的ListActivity里。更改您的活动代码如下:

代码语言:javascript
复制
private CustomAdapter listAdapter; // declare this before on create

现在,在您的on create中设置适配器时,请编写以下代码:

代码语言:javascript
复制
listAdapter = new CustomAdapter(this, nameList, imageList)
// set Adapter like this:
listView.setAdapter(listAdapter);

单击代码上的按钮应该如下所示:

代码语言:javascript
复制
compareBtn.setOnClickListener(new View.OnClickListener()
    {   @Override
            public void onClick(View view) {
            //I need to have addCheckBoxValue arraylist from adapter here
             listAdapter.getCheckBoxValue(); // do whatever you want to do here

            }
    }

编码愉快!

票数 1
EN

Stack Overflow用户

发布于 2016-06-13 07:07:10

我建议您为复选框创建布尔数组,并以这样的方式维护它,这对我来说是有效的。

代码语言:javascript
复制
public class CustomAdapter extends BaseAdapter {
    private final LayoutInflater inflater;
    private final Context context;
    private List<ModelPooja> listData;

    public CustomAdapter(Context mainActivity, List<ModelPooja> listData) {
        context = mainActivity;
        this.listData = listData;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return listData.size();
    }

    @Override
    public Object getItem(int position) {
        return listData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.list_item_poojaselection, null);
            holder.tv = (TextView) convertView.findViewById(R.id.list_item_poojaname);
            holder.checks = (CheckBox) convertView.findViewById(R.id.list_item_poojacheck);
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.checks.setOnCheckedChangeListener(null);
        holder.checks.setFocusable(false);

        if (listData.get(position).isselected) {
            holder.checks.setChecked(true);
        } else {
            holder.checks.setChecked(false);
        }

        holder.checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton cb, boolean b) {

                if (checkMaxLimit()) {

                    if (listData.get(position).isselected && b) {
                        holder.checks.setChecked(false);
                        listData.get(position).isselected = false;

                    } else {
                        holder.checks.setChecked(false);
                        listData.get(position).isselected = false;
                        Toast.makeText(context, "Max limit reached", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    if (b) {
                        listData.get(position).isselected = true;
                    } else {
                        listData.get(position).isselected = false;
                    }
                }
            }
        });

        holder.tv.setText(listData.get(position).getPOOJA_LISTING_NAME());
        return convertView;
    }

    public boolean checkMaxLimit() {
        int countermax = 0;
        for(ModelPooja item : listData){
            if(item.isselected){
                countermax++;
            }
        }
        return countermax >= 5;
    }

    public class ViewHolder {
        TextView tv;
        public CheckBox checks;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37783456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档