6

それぞれ異なるビューを持つ異なる xml レイアウトを含むリストビューがあります。メソッド内で、ユーザーがクリックしたアイテム内のビューからデータを取得する方法を知りたいと思っていましたonItemClick

リストビューは複数のレイアウトで構成されているため、onItemClick メソッドが呼び出されたときにどのレイアウトが押されているかを確認できません。たとえば、リストビューのレイアウトの項目の 1 つは次のとおりです。

// list_item.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

    <TextView
        android:id="@+id/lblSub"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:padding="6dp"
        android:layout_marginRight="4dp"
        android:text=""
        android:textColor="#FFFFFF"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/lblMain"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:padding="6dp"
        android:layout_marginLeft="4dp"
        android:text=""
        android:textColor="#FFFFFF"
        android:textSize="18sp" />

</RelativeLayout>

リストビューの別のレイアウトは次のとおりです。

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

    <TextView
        android:id="@+id/lblName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="4dp"
        android:padding="4dp"
        android:text="TextView"
        android:textColor="#FFFFFF"
        android:textSize="28sp" />

</RelativeLayout>

そのため、リストビュー内の任意のレイアウトについて、これらすべてのビューのデータを取得する方法について途方に暮れています。

私の以前の試みはこれでした:

public void onItemClick(AdapterView<?> listView, View view, int position, long id) {            
    Object obj = adapter.getItem(position);
    String value = obj.toString();
}

ただしvalue、この場合、 はこのアイテム内のすべてのビューのすべての値を含む文字列を返します。たとえば、{caption=MobileNumber, value=07000123456}<<< を使用してバラバラにしようとしない限り、この文字列で何もできませんsubstring。ユーザーが作成した可能性があります。

これは私が使用しているアダプターです ( Jeff Sharkeyの功績によるものです。このアダプターは私が作成したものではありません)。

public class SeparatedListAdapter extends BaseAdapter {  

    public final Map<String,Adapter> sections = new LinkedHashMap<String,Adapter>();  
    public final ArrayAdapter<String> headers;  
    public final static int TYPE_SECTION_HEADER = 0;  

    public SeparatedListAdapter(Context context) {  
        headers = new ArrayAdapter<String>(context, R.layout.list_header);  
    }  

    public void addSection(String section, Adapter adapter) {  
        this.headers.add(section);  
        this.sections.put(section, adapter);  
    }
    public void addSectionNoHeader(String section, Adapter adapter) {
        this.sections.put(section, adapter);
    }

    public Object getItem(int position) {  
        for(Object section : this.sections.keySet()) {  
            Adapter adapter = sections.get(section);  
            int size = adapter.getCount() + 1;  

            // check if position inside this section   
            if(position == 0) return section;  
            if(position < size) return adapter.getItem(position - 1);  

            // otherwise jump into next section  
            position -= size;  
        }  
        return null;  
    }  

    public int getCount() {  
        // total together all sections, plus one for each section header  
        int total = 0;  
        for(Adapter adapter : this.sections.values())  
            total += adapter.getCount() + 1;  
        return total;  
    }  

    public int getViewTypeCount() {  
        // assume that headers count as one, then total all sections  
        int total = 1;  
        for(Adapter adapter : this.sections.values())  
            total += adapter.getViewTypeCount();  
        return total;  
    }  

    public int getItemViewType(int position) {  
        int type = 1;  
        for(Object section : this.sections.keySet()) {  
            Adapter adapter = sections.get(section);  
            int size = adapter.getCount() + 1;  

            // check if position inside this section   
            if(position == 0) return TYPE_SECTION_HEADER;  
            if(position < size) return type + adapter.getItemViewType(position - 1);  

            // otherwise jump into next section  
            position -= size;  
            type += adapter.getViewTypeCount();  
        }  
        return -1;  
    }  

    public boolean areAllItemsSelectable() {  
        return false;  
    }  

    public boolean isEnabled(int position) {  
        return (getItemViewType(position) != TYPE_SECTION_HEADER);  
    }  

    @Override  
    public View getView(int position, View convertView, ViewGroup parent) {  
        int sectionnum = 0;  
        for(Object section : this.sections.keySet()) {  
            Adapter adapter = sections.get(section);  
            int size = adapter.getCount() + 1;  

            // check if position inside this section   
            if(position == 0) return headers.getView(sectionnum, convertView, parent);  
            if(position < size) return adapter.getView(position - 1, convertView, parent);  

            // otherwise jump into next section  
            position -= size;  
            sectionnum++;  
        }  
        return null;  
    }  

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

}  

アイテム内のすべてのビューの値を抽出する方法を探しています。しかし、クリックされたアイテムが任意のレイアウトの 1 つである可能性があるという事実は、私を混乱させます。何か案は?

コードでこのアダプターを使用する方法の例を次に示します。

SeparatedListAdapter adapter;
Customer cust;
ListView lvDetails;

public Map<String,?> createDoubleItem(String title, String caption) {  
        Map<String,String> item = new HashMap<String,String>();  
        item.put(ITEM_VALUE, title);  
        item.put(ITEM_CAPTION, caption);  
        return item;  
    }

    public Map<String,?> createSingleItem(String name) {  
        Map<String,String> item = new HashMap<String,String>();  
        item.put(ITEM_VALUE, name);
        return item;
    } 

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

        Intent intent = getIntent();
        cust = Db.Functions.getCustomer(intent.getStringExtra("uuid"));
        lvDetails = (ListView) findViewById(R.id.custdetails);
        adapter = new SeparatedListAdapter(this);
        lvDetails.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> listView, View view, int position, long id) {
                Gen.popup("Item clicked");
            }
        });

        // Name
        List<Map<String,?>> name = new LinkedList<Map<String,?>>();
        if (cust.firstName == null && cust.lastName == null)
            name.add(createSingleItem("Unnamed Customer"));
        else
            name.add(createSingleItem(
                    ((cust.title != null) ? cust.title + " " : "") +
                    ((cust.firstName != null) ? cust.firstName + " " : "") +
                    ((cust.lastName != null) ? cust.lastName : "")));
        adapter.addSection("Name", new SimpleAdapter(this, name, R.layout.list_item_name,   
                new String[] { ITEM_VALUE },
                new int[] { R.id.lblName }));
        // Phones
        if ((cust.mobileNumber != null || cust.homeNumber != null || cust.workNumber != null) && SHOW_PHONES)
        {
            List<Map<String,?>> phone = new LinkedList<Map<String,?>>();
            if (cust.mobileNumber != null)
                phone.add(createDoubleItem(cust.mobileNumber, "Mobile"));
            if (cust.homeNumber != null)
                phone.add(createDoubleItem(cust.homeNumber, "Home"));
            if (cust.workNumber != null)
                phone.add(createDoubleItem(cust.workNumber, "Work"));
            adapter.addSection("Phone", new SimpleAdapter(this, phone, R.layout.list_item,   
                    new String[] { ITEM_VALUE, ITEM_CAPTION },
                    new int[] { R.id.lblSub, R.id.lblMain }));
        }  
        lvDetails.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
}
4

2 に答える 2

1

ここでの私の理解では、あなたには3種類のアイテムがあるということです:

  • areAllItemsSelectableセクションのタイトル (およびメソッドのおかげで無効になっているisEnabledため、クリックできません)
  • 単品
  • ダブルアイテム

また、名前と電話という 2 つのセクションがあるようです。

セクション 1 ( adapter.getItemViewType(position) == 1) は単品、セクション 2 ( ) は単品adapter.getItemViewType(position) == 2です。

どちらの場合も、item オブジェクト ( adapter.getItem(position)) は として宣言Map<String, ?>され、 として定義されていMap<String, String>ます。

つまり、アイテムを次のようにキャストできますMap

Map<String, String> itemAsMap = (Map<String, String>) item;

ITEM_VALUEキーとキーを使用して、マップから値をフェッチしITEM_CAPTIONます。

于 2013-08-08T14:33:53.873 に答える
1

簡単な方法は次のとおりです。これを各 xml ビューに貼り付けます。

android:onClick="someFunction"

次に、この中で次のことをsomeFunction行います。

public void someFunction(View v){

switch (v.getId()){
case R.id.lblSub:
  // This layout was clicked, do something about it
  break;

case R.id.lblMain:
  // This layout was clicked, do something about it
  break;

}
于 2013-08-08T12:29:09.947 に答える