簡體   English   中英

在android中取消選擇ListView Item onClick

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM