【问题标题】:Set RadioButton for Custom Adapter and GridView为自定义适配器和 GridView 设置 RadioButton
【发布时间】:2016-05-01 14:09:15
【问题描述】:

我有一个项目,我想在其中设置我的自定义View,而不是简单的Android GridView。 我做到了,现在我想为每一行设置RadioButton。 我看到了this

但我无法在此回复中指定布尔数组。 这是我的代码。 先Items Layout

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="1"
    android:layout_marginTop="30dp">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Small Text"
        android:id="@+id/textView2"
        android:layout_x="12dp"
        android:layout_y="2dp"
        android:textColor="#000"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_marginLeft="20dp"
        android:id="@+id/textView"
        android:layout_x="157dp"
        android:layout_y="0dp"
        android:textColor="#000"/>
<RadioGroup
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/radiogroup"></RadioGroup>

    <RadioButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/radioButton"
        android:layout_x="302dp"
        android:layout_y="0dp"
        android:checked="false" />

</AbsoluteLayout>

还有简单的GridViewButton

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".DisplayActivity">

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:weightSum="1"
    android:layout_marginTop="30dp">
    <GridView
        android:layout_width="wrap_content"
        android:layout_height="387dp"
        android:id="@+id/gridView"
        android:background="#abc"
        android:layoutDirection="ltr"
        android:choiceMode="singleChoice"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test"
        android:id="@+id/button" />
</LinearLayout>

在我的适配器类中:

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.GridView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

import java.util.ArrayList;
import  android.widget.RadioButton;

public class CarAdapter extends ArrayAdapter<Car> {
    RadioButton radioButton;
    RadioGroup radioGroup;
    ArrayList<Boolean> booleans = new ArrayList<Boolean>();
public CarAdapter(Context context, int resource, ArrayList<Car> carArrayList, ArrayList<Boolean> mlist) {
    super(context, resource, carArrayList);
    this.booleans = mlist;
}
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Car car = getItem(position);
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_car, parent, false);
        }
        RadioGroup radioGroup = (RadioGroup)convertView.findViewById(R.id.radiogroup);
        radioButton = (RadioButton)convertView.findViewById(R.id.radioButton);
        TextView carName = (TextView) convertView.findViewById(R.id.textView2);
        TextView carSIM = (TextView) convertView.findViewById(R.id.textView);
        carName.setText(car.getName());
        carSIM.setText(car.getSIM());

        return convertView;

    }
    RadioButton.OnCheckedChangeListener mListener = new RadioButton.OnCheckedChangeListener() {

        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            booleans.set((Integer) buttonView.getTag(), isChecked); // get the tag so we know the row and store the status
        }
    };

}

我在getView 中试过这个方法:

    radioButton.setTag(Integer.valueOf(position));
    radioButton.setChecked(booleans.get(position));
    radioButton.setOnCheckedChangeListener(mListener);

mListener 是:

    RadioButton.OnCheckedChangeListener mListener = new RadioButton.OnCheckedChangeListener() {

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        booleans.set((Integer) buttonView.getTag(), isChecked); // get the tag so we know the row and store the status
    }
};

但它给了我

java.lang.IndexOutOfBoundsException at line `radioButton.setChecked(booleans.get(position));`

这里是Main Activity

import android.app.Activity;
import android.media.Image;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.CheckedTextView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;

import java.util.ArrayList;

public class DisplayActivity extends Activity {
    CarAdapter carAdapter;
    Car car;
    Car car2;
    ArrayList<Car> carArrayList;
    GridView gridView;
    Button test;
    ArrayList<Boolean> booleans;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display);

        carArrayList = new ArrayList<Car>();
        car = new Car("Davie", "Smith");
        car2 = new Car("Enrique", "Wall");
        carArrayList.add(car);
        carArrayList.add(car2);
         booleans = new ArrayList<Boolean>(carArrayList.size());
        carAdapter = new CarAdapter(getApplicationContext(), android.R.layout.simple_list_item_checked, carArrayList, booleans);
        gridView = (GridView) findViewById(R.id.gridView);
        gridView.setAdapter(carAdapter);
        test = (Button) findViewById(R.id.button);


    test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (gridView.isItemChecked(gridView.getCheckedItemPosition())) {
                String name = (carAdapter.getItem(gridView.getCheckedItemPosition())).getName();
                Toast.makeText(getApplicationContext(), "Here is " + name, Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getApplicationContext(), "This is not true", Toast.LENGTH_SHORT).show();
            }
        }
    });
    }
}

【问题讨论】:

    标签: android android-adapter android-gridview


    【解决方案1】:

    您将booleans ArrayList 分配给mlist ArrayList,它可以是,因此您得到IndexOutOfBoundsException..您必须将mlist 分配给booleans ArrayList

    mlist = this.booleans;
    

    应该是..

    this.booleans = mlist;
    

    在您的 CarAdapter 构造函数中。

    【讨论】:

    • 不,这不是原因。我不知道为什么我会这样写。
    • 如果你的booleans 是不会得到booleans.get(position)
    • 你到底是什么意思?我不明白。
    • 当您初始化boolean 时,它是空的。现在,当您将mList(其中包含值)传递给构造函数时,它应该像上面那样分配给boolean 所以@987654334 @ 应该获得包含在您的 mList 中的所有值,但是您将 boolean(empty) 分配给 mList 所以当您获取位置时它不会获得位置并抛出异常..
    • 先生。我在我的代码中这样做了:this.booleans = mlist;我在我的主要活动中做到了这一点: ArrayList boolArray = new ArrayList();然后将其传递给我的适配器。但仍然是那个例外。声明时我应该做些什么吗?
    【解决方案2】:

    在你的 CarAdapter 中修改这个...

    public CarAdapter(Context context, int resource, ArrayList<Car> carArrayList, ArrayList<Boolean> mlist) {
            super(context, resource, carArrayList);
            mlist = this.booleans;
        }
    

    public CarAdapter(Context context, int resource, ArrayList<Car> carArrayList, ArrayList<Boolean> mlist) {
            super(context, resource, carArrayList);
            this.booleans= mlist ;
        }
    

    【讨论】:

    • 不,这不是原因。我不知道我为什么要这样写。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多