2014-10-30 57 views
8

我遵循了一個很好的教程,做了一些更改,創建了一個自定義ListView,這將允許我爲ListView中的每一行顯示多個圖像。我想通過選擇列表中的多個項目來突出顯示,然後通過選擇我的選項菜單上的選項對所有這些列表項目執行某種操作。但是,我似乎遇到的問題是,我無法選擇多個項目,即使我已將android:choiceMode="multipleChoice"添加到.xml文件中的ListView中。我意識到這可以使用複選框或單選按鈕來完成,但我寧願避免這種情況。下面附上了我的源代碼。任何幫助,將不勝感激。最後,感謝http://custom-android-dn.blogspot.com/提供了一個很好的教程。謝謝。使用自定義適配器在列表視圖中選擇/突出顯示多個項目 - Android

CustomlistviewActivity.java

package DucNguyen.example.customlistview; 

public class CustomlistviewActivity extends Activity { 

    private ListView listViewFootballLegend; 
    private Context ctx; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_customlistview);   
     ctx=this; 
     List<FootballLegend> legendList= new ArrayList<FootballLegend>(); 
     legendList.add(new FootballLegend("Pele","October 23, 1940 (age 72)","pele","brazil")); 
     legendList.add(new FootballLegend("Diego Maradona","October 30, 1960 (age 52)","maradona","argentina")); 
     legendList.add(new FootballLegend("Johan Cruyff","April 25, 1947 (age 65)","cruyff","netherlands")); 
     legendList.add(new FootballLegend("Franz Beckenbauer","September 11, 1945 (age 67)","beckenbauer","germany")); 
     legendList.add(new FootballLegend("Michel Platini","June 21, 1955 (age 57)","platini","france")); 
     legendList.add(new FootballLegend("Ronaldo De Lima","September 22, 1976 (age 36)","ronaldo","brazil")); 

     listViewFootballLegend = (ListView) findViewById(R.id.FootballLegend_list); 
     listViewFootballLegend.setAdapter(new FootballLegendListAdapter(ctx, R.layout.legend_row_item, legendList)); 

     // Click event for single list row 
     listViewFootballLegend.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       FootballLegend o = (FootballLegend) parent.getItemAtPosition(position); 
       Toast.makeText(CustomlistviewActivity.this, o.getName().toString(), Toast.LENGTH_SHORT).show(); 
      } 
     });  
    } 
} 

FootballLegendListAdapter.java

package DucNguyen.example.customlistview; 

public class FootballLegendListAdapter extends ArrayAdapter<FootballLegend> { 
    private int    resource; 
    private LayoutInflater inflater; 
    private Context   context; 
    public FootballLegendListAdapter (Context ctx, int resourceId, List<FootballLegend> objects) { 
     super(ctx, resourceId, objects); 
     resource = resourceId; 
     inflater = LayoutInflater.from(ctx); 
     context=ctx; 
    } 
    @Override 
    public View getView (int position, View convertView, ViewGroup parent) { 
     convertView = (RelativeLayout) inflater.inflate(resource, null); 
     FootballLegend Legend = getItem(position); 
       TextView legendName = (TextView) convertView.findViewById(R.id.legendName); 
     legendName.setText(Legend.getName()); 

     TextView legendBorn = (TextView) convertView.findViewById(R.id.legendBorn); 
     legendBorn.setText(Legend.getNick()); 

     ImageView legendImage = (ImageView) convertView.findViewById(R.id.legendImage); 
     String uri = "drawable/" + Legend.getImage(); 
     int imageResource = context.getResources().getIdentifier(uri, null, context.getPackageName()); 
     Drawable image = context.getResources().getDrawable(imageResource); 
     legendImage.setImageDrawable(image); 

     ImageView NationImage = (ImageView) convertView.findViewById(R.id.Nation); 
     uri = "drawable/" + Legend.getNation(); 
     imageResource = context.getResources().getIdentifier(uri, null, context.getPackageName()); 
     image = context.getResources().getDrawable(imageResource); 
     NationImage.setImageDrawable(image); 

     return convertView; 
    } 
} 

FootballLegend.java

package DucNguyen.example.customlistview; 
public class FootballLegend { 
    public FootballLegend(String name, String born, String image, String nation) { 
     super(); 
     this.name = name; 
     this.born = born; 
     this.image = image; 
     this.nation = nation; 
    } 
    private String name; 
    private String born; 
    private String image; 
    private String nation; 

    public String getName() { 
     return name; 
    } 
    public void setName(String nameText) { 
     name = nameText; 
    } 
    public String getNick() { 
     return born; 
    } 
    public void setNick(String born) { 
     this.born = born; 
    } 
    public String getImage() { 
     return image; 
    } 
    public void setImage(String image) { 
     this.image = image; 
    } 
     public String getNation() { 
     return nation; 
    } 
    public void setNation(String image) { 
     this.image = nation; 
    } 
} 

legend_row_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:padding="5dip" > 

    <!-- ListRow Left side Thumbnail image --> 
    <LinearLayout android:id="@+id/thumbnail" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="3dip" 
     android:layout_alignParentLeft="true" 
     android:layout_marginRight="5dip"> 
     <ImageView 
      android:id="@+id/legendImage" 
      android:layout_width="50dip" 
      android:layout_height="50dip" /> 
    </LinearLayout> 

    <TextView 
     android:id="@+id/legendName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignTop="@+id/thumbnail" 
     android:layout_toRightOf="@+id/thumbnail" 
     android:textColor="#040404" 
     android:typeface="sans" 
     android:textSize="15dip" 
     android:textStyle="bold"/> 

    <TextView 
     android:id="@+id/legendBorn" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/legendName" 
     android:textColor="#343434" 
     android:textSize="10dip" 
     android:layout_marginTop="1dip" 
     android:layout_toRightOf="@+id/thumbnail" /> 

    <ImageView 
     android:id="@+id/Nation" 
     android:layout_width="45dp" 
     android:layout_height="30dp" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="5dp" 
     android:layout_centerVertical="true" /> 

</RelativeLayout> 

activity_customlistview.xml

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

    <ListView 
     android:id="@+id/FootballLegend_list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:paddingTop="5dp" 
     android:choiceMode="multipleChoice" > 
    </ListView> 

</LinearLayout> 

回答

8
  1. 根,你將顯示列表必須實現Checkable每個項目的View。當實現這個接口的時候也更新View的可繪製狀態。請參閱this answer瞭解如何操作。

  2. 設置一個<selector>可繪製爲此根View的背景。檢查狀態和正常狀態的不同顏色/繪圖。

  3. 設置ListView的選擇模式爲單選或多選。

  4. 在列表適配器中,使用上面創建的視圖作爲父級佈局提供項目視圖。

現在,ListView將負責在其項目視圖中設置選中/未選中狀態。您也可以致電getCheckedItemIds()getCheckedItemPositions()ListView獲得當前選定的項目。

+0

如果我實現可以檢查我的列表,列表中是否沒有複選框?這正是我想要避免的。謝謝 – Willis 2014-10-30 13:31:14

+1

@Willis號'Checkable'是一個Java接口。無論實現它,承諾有'setChecked(boolean)'和'toggle()'方法。它完全取決於你想要在視圖中顯示的內容。 – 2014-10-31 04:19:34

+0

謝謝。我相信這是我所需要的。 – Willis 2014-10-31 16:02:32

相關問題