[英]Unselect the ListView Item onClick in android
發生了什么我有一個列表視圖,我將背景顏色更改放在選擇上。默認情況下,我將第一個列表視圖項目選擇為
public class OneWayFlightResult extends BaseAdapter {
private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;
public OneWayFlightResult(Activity a, ArrayList<HashMap<String, String>> d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.row, null);
TextView flightTime = (TextView)vi.findViewById(R.id.flightTime); // title
TextView flightCompanyName = (TextView)vi.findViewById(R.id.flightCompanyName); // title
TextView flightNumber = (TextView)vi.findViewById(R.id.flightNumber); // title
ImageView flightLogo = (ImageView)vi.findViewById(R.id.flightLogo);
HashMap<String, String> flight = new HashMap<String, String>();
flight = data.get(position);
flightTime.setText(flight.get(TestActivity.FlightTime));
flightCompanyName.setText(TestActivity.FlightCompanyName);
flightNumber.setText(TestActivity.FlightNumber);
if(position == 0){
vi.setBackgroundResource(R.drawable.selection_effect);
vi.setSelected(true);
}
return vi;
}
這是我在此selection_effect.xml 中使用的 XML 文件
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<shape>
<solid android:color="#ffffff" />
</shape>
</item>
<item>
<shape>
<solid android:color="#00a7eb" />
</shape>
</item>
</selector>
所以默認情況下,第一個列表視圖被選中。現在當用戶選擇另一個列表視圖項目時,第一個保持選中狀態,另一個也得到相同的效果。那么如何動態更改點擊列表視圖項目的效果。意味着默認情況下,當用戶選擇其他項目時,會選擇第一個項目,其他項目被選中,默認效果被刪除
我得到了你的問題的解決方案。 做如下。
1) 打開您創建的ListView 的主布局文件。
添加android:choiceMode="singleChoice"
。 這將如下所示。
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:choiceMode="singleChoice" >
</ListView>
2) 打開你的list_item.xml布局文件。 在您的根視圖中,添加android:background="?android:attr/activatedBackgroundIndicator"
。 在我的示例項目中,它如下所示。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/activatedBackgroundIndicator"
android:orientation="vertical" >
//your views
</LinearLayout>
3) 打開您的活動文件。 將適配器設置為ListView
,添加list.setSelector(R.drawable.selection_effect);
. 這將如下所示。
ListView ls = (ListView) findViewById(R.id.listView1);
ListAdapter adapter = new ListAdapter(this, data);
ls.setAdapter(adapter);
ls.setSelector(R.drawable.selection_effect);
在這里, selection_effect
是您在drawable
目錄中創建的drawable
文件。 我測試了我的代碼。 哪個工作正常。
4) 要默認選擇第一個視圖,請在完成第 3 步后刪除BaseAdapter
中的代碼並BaseAdapter
以下代碼。
ls.setItemChecked(0,true);
你需要把它放在上面的代碼之后,如下所示。
ListAdapter adapter = new ListAdapter(data);
ls.setAdapter(adapter);
ls.setSelector(R.drawable.selection_effect);
ls.setItemChecked(0, true);
解釋
ls.setSelector(R.drawable.selection_effect);
這將根據您在 drawable 目錄中定義的selector
選擇行項目。
ls.setItemChecked(0, true);
這將在第一次運行時默認選擇第一項。 之后您可以通過單擊來選擇其他項目。
您可以只為單擊的項目聲明一個 int,它默認為開始單擊的第一個項目,然后在 onclick 中相應地更新。
int selected = <default>;
在 oncreate 等中設置
然后你可以有 onItemClicked 偵聽器並執行此操作,
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if (selected != i){
<listView>.getChildAt(selected).setBackgroundColor(getResources().getColor(android.R.color.background_dark));
<listView>.getChildAt(i).setBackgroundColor(getResources().getColor(android.R.color.holo_blue_light));
selected = i;
}
}
這會將先前選擇的項目的背景顏色更改回(在我的情況下)默認的 android 深色主題顏色,將新選擇的背景顏色設置為漂亮的亮藍色,並更新所選的 int 以反映新選擇的項目。
你可以這樣試試:
在為 ListView 設置適配器設置位置為 0 后,默認選擇即listView.setSelection(0);
並在onItemClick
獲得項目的選定位置(第三個參數),因此在 onItemClick 中寫入listView.setSelection("that 3rd param");
我在 ListView 上遇到了類似的問題,您所做的就是在單擊項目時調用適配器上的方法, adadpter.SetPosition(position) {mSelectedPsoiton = position; notifyDataSetChanged();}
adadpter.SetPosition(position) {mSelectedPsoiton = position; notifyDataSetChanged();}
,並在您的 getView 函數中檢查位置是否等於 selectedPosition,然后相應地設置背景這永遠不會失敗,焦點在觸摸模式下始終不起作用
//adapter class
public override View GetView(int position, View convertView, ViewGroup parent) { TextView view = null; int lookupPos = position; if (null == convertView) { view = new TextView(_context); view.SetTextSize(ComplexUnitType.Sp, 20); view.SetPadding(_pixels, _pixels, _pixels, _pixels); } else { view = convertView as TextView; }
if (position == mSelectedPos )
{
view.SetBackgroundResource(Android.Resource.Color.HoloBlueDark);
}
else
{
view.SetBackgroundResource(Resource.Drawable.listItemSelector);
}
return view;
}
public void SetSelectedPosition(int position) { mSelectedPos = position;
}
private int mSelectedPos = -1;
// ListView code, _adapter is adapter of listview
listView.SetOnItemClickListener (new OnItemClickListener() { @Override public void onItemClick(AdapterView adapter, View view, int pos, long id) { _adapter.SetSelectionPostion(pos); }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.