1

カスタム アダプターを使用する ListView があります。ListView の各要素には、RadioButton と TextView が含まれています。

これが私のアダプターです。Employees の ArrayList (現在は名前のみを含むオブジェクト) を取ります。

public class EmployeeAdapter extends ArrayAdapter<Employee> {

    private ArrayList<Employee> listEmployees;

    // Give the adapter the context and layout we are operating it, as well as a list of employees to put in the list.
    public EmployeeAdapter(Context context, int layout, ArrayList<Employee> listEmployees) {  
            super(context, layout, listEmployees);  
            this.listEmployees = listEmployees;
            }  

    // We override the basic getView function since our list is custom.
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {  
        View v = convertView;


        // If there is nothing left to put in the view, inflate the view in the rowemployee layout.
        if (v == null){
            LayoutInflater vi;
            vi = LayoutInflater.from(getContext());
            v = vi.inflate(R.layout.rowemployees, null);
        }

        Employee i = listEmployees.get(position);

        // Check if there's still an employee in the list.
        if (i != null){
            TextView name = (TextView) v.findViewById(R.id.text_employeename);
            name.setText(i.getName());

        }

        // Alternate row colors.
        if (position % 2 == 0) {
              v.setBackgroundColor(Color.parseColor("#FFFFFF"));
            } else {
                v.setBackgroundColor(Color.parseColor("#e5fff4"));
            }



        return v;

    }
}

私の XML レイアウトのリストビュー宣言は次のとおりです。

<ListView android:id="@+id/employees_list"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:paddingLeft="2dp"
                    android:paddingRight="1dp"
                    android:background="@drawable/borderlist"
                    android:choiceMode="singleChoice" 
                    android:listSelector="#48ad82"
                    android:layout_below="@id/employees_header">
                </ListView>

ListView のすべての項目のレイアウトは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/row_employee"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="10dp"
    android:paddingTop="13dp"
    android:paddingBottom="13dp"
    android:descendantFocusability="blocksDescendants">

    <RadioButton android:id="@+id/radio_employee"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:focusable="false"/>

    <TextView
        android:id="@+id/text_employeename"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_toRightOf="@id/radio_employee"
        android:layout_marginTop="3dp"
        android:layout_marginLeft="5dp"
        android:focusable="false" />

</RelativeLayout> 

一連の Employee オブジェクトを ArrayList に入力し、これをアダプターにプッシュしてから、リストに setOnItemClickListener を設定します。リスナーには次のコードが含まれています。

OnItemClickListener onItemClickListener_employee
    = new OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id){
            Toast.makeText(getApplicationContext(), String.valueOf(view.isSelected()) , Toast.LENGTH_SHORT).show();
        }


    };

view.isSelected() は常に false を返します。なんで?TextView 以外のものを含むリストの要素を数時間選択する方法を見つけようとしましたが、SDK のドキュメントはあまり役に立ちません。これは古くなっています。

リストの項目を押すと、代わりに TextView または RadioButton が押されたように見えます。focusable="false" はこれを防ぐべきではありませんか ( Android カスタム ListView はアイテムをクリックできません)?

4

1 に答える 1

1

アイテムを選択するには、次のメソッドをアダプターに追加します (テストされていないコード)。

public Employee getItemAt(int position){
    return listEmployees.get(position);
}

次に、ハンドラーで、位置を上記の新しいアダプター メソッドに渡します。

public void onItemClick(AdapterView<?> parent, View view, int position, long id){
    Employee e = adapter.getItemAt(position); //or whatever your adapter instance is named
    Toast.makeText(getApplicationContext(), e.getName(), Toast.LENGTH_SHORT).show();
}

ビューはデータを表示するためだけのものなので、ビュー自体を気にする必要はありません (ビューを削除したり、ハイライトしたりしない限り)。

于 2013-07-11T03:31:35.457 に答える