Android:自定义列表视图中的单选按钮 [英] Android: Radio button in custom list view

查看:45
本文介绍了Android:自定义列表视图中的单选按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个应用程序,我需要在其中实现列表视图中的单选按钮.我想实现一个列表视图,每行有一个单选按钮和两个文本视图.一键确定"在列表视图下方.

I am developing an application in which I need to implement radio buttons in list view. I want to implement a list view having one radio button and two text views in each row. And one button "Ok" below listview.

我所做的是创建了一个列表视图和一个自定义适配器.listview的代码如下:

What I have done is created a list view and a custom adapter. The code of listview is as:

<ListView
    android:id="@+id/listview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:cacheColorHint="#00000000"
    android:overScrollMode="never"
    tools:ignore="NestedScrolling"
    android:choiceMode="singleChoice" >
</ListView>

我创建了一个自定义适配器布局:

And I created a custom adapter layout as:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TableRow
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        tools:ignore="UselessParent" >

        <RadioButton
            android:id="@+id/radiobutton"
            android:layout_width="0sp"
            android:layout_height="wrap_content"
            android:layout_weight=".1" />

        <TextView
            android:id="@+id/textview1"
            android:layout_width="0sp"
            android:layout_height="wrap_content"
            android:layout_weight=".3" />

        <TextView
            android:id="@+id/textview2"
            android:layout_width="0sp"
            android:layout_height="wrap_content"
            android:layout_weight=".3" />

    </TableRow>

</TableLayout>

fragment的java代码如下:

The java code of fragment is as follows:

ListView listView = (ListView) view.findViewById(R.id.listview);

// values is a StringArray holding some string values.
CustomAdapter customAdapter = new CustomAdapter (getActivity(), values);
listView.setAdapter(customAdapter );
listView.setOnItemClickListener(this);

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {}

适配器代码如下:

public class CustomAdapter extends ArrayAdapter<String> {   
    /** Global declaration of variables. As there scope lies in whole class. */
    private Context context;
    private String[] listOfValues;

    /** Constructor Class */
    public CustomAdapter (Context c,String[] values) {
        super(c,R.layout.adapter_layout,values);
        this.context = c;
        this.listOfValues = values;
    }

    /** Implement getView method for customizing row of list view. */
    public View getView(final int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        // Creating a view of row.
        View rowView = inflater.inflate(R.layout.adapter_layout, parent, false);
            
            TextView textView1 = (TextView)rowView.findViewById(R.id.textview1);
            TextView textView2 = (TextView)rowView.findViewById(R.id.textview2);

            RadioButton radioButton = (RadioButton) rowView.findViewById(R.id.radiobutton);

            radioButton.setOnClickListener(new OnClickListener() {          
            @Override   
            public void onClick(View v) {
                Toast.makeText(context, CustomAdapter[position], Toast.LENGTH_SHORT).show();
            }
        });
    
        return review;
    }
}    

textview1 的数据是从 SQLite 数据库填充的,而 textview2 的数据是状态关闭".并且在选择或单击任何单选按钮时,文本视图的文本将更改为状态打开".

The data of textview1 are populated from SQLite database and on textview2 the data are "Status Closed". And on the selection of or by clicking any radio button the text of text view gets changed to "Status Open".

问题是: 应用程序的需要是只选择一个单选按钮并且 textview2 的数据在选择时发生变化.当用户单击另一个单选按钮时,它会被选中,而前一个按钮应该被取消选中,textview2 的文本将更改为状态关闭".之前选择的单选按钮,然后单击单选按钮状态打开".

The Issue is: The need of application is that only one radio button should get selected and data of textview2 get a change on selection. And when the user clicks on the other radio button it gets select and the previous one should get deselect and the text of textview2 gets changed to "Status Closed" of a previously selected radio button and clicked radio button to "Status Open".

编辑 1:

然后单击确定"按钮 我想获取列表视图 textview1 和 textview2 的位置、文本,因为我想将该文本保存在 SQLite 数据库中的评论中.

And click on the "OK" button I want to get the position, text of list view textview1, and textview2, as I want to save that text in SQLite database in the review.

请指导我应该遵循哪些步骤.我正在申请中.需要您的宝贵指导.

Please guide me on what steps should I follow. I am in the middle of my application. Your valuable guidance is required.

推荐答案

这里是关键的想法

  • 当检查 RadioButton 时,我们必须调用 notifyDataSetChanged(),以便更新所有视图.
  • 当一个RadioButton被选中时,我们必须设置一个selectedPosition,以跟踪哪个RadioButton被选中
  • Views 在 ListViews 内被回收.因此,它们在 ListView 中的绝对位置发生了变化.因此,在ListAdapter#getView() 中,我们必须在每个RadioButton 上调用setTag().这允许我们在点击 RadioButton 时确定 RadioButton 在列表中的当前位置.
  • RadioButton#setChecked() 必须在 getView() 内更新以获取新的或预先存在的 View s.
  • when a RadioButton is checked we must call notifyDataSetChanged(), so that all views get updated.
  • when a RadioButton is checked we must set a selectedPosition, to keep track of which RadioButton is selected
  • Views are recycled inside ListViews. Therefore, their absolute position changes in the ListView. Therefore, inside ListAdapter#getView(), we must call setTag() on each RadioButton. This allows us to determine the current position of the RadioButton in the list when the RadioButton is clicked.
  • RadioButton#setChecked() must be updated inside getView() for new or pre-existing Views.

这是我编写和测试的示例 ArrayAdapter 以演示这些想法

Here is an example ArrayAdapter I wrote and tested in order to demonstrate these ideas

public class MainActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // I do no use these values anywhere inside the ArrayAdapter. I could, but don't.
        final Integer[] values = new Integer[] {1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,};

        ArrayAdapter<Integer> adapter = new ArrayAdapter<Integer>(this, R.layout.row, R.id.textview, values) {

            int selectedPosition = 0;

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View v = convertView;
                if (v == null) {
                    LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi.inflate(R.layout.row, null);
                    RadioButton r = (RadioButton)v.findViewById(R.id.radiobutton);
                }
                TextView tv = (TextView)v.findViewById(R.id.textview);
                tv.setText("Text view #" + position);
                RadioButton r = (RadioButton)v.findViewById(R.id.radiobutton);
                r.setChecked(position == selectedPosition);
                r.setTag(position);
                r.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        selectedPosition = (Integer)view.getTag();
                        notifyDataSetChanged();
                    }
                });
                return v;
            }

        };
        setListAdapter(adapter);
    }
}

这篇关于Android:自定义列表视图中的单选按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆