1. 程式人生 > >Android ListView item 選中高亮顯示之高效實現方式

Android ListView item 選中高亮顯示之高效實現方式

之前在一篇文章中提到過  的實現方式,具體可以檢視這篇博文,這裡提供另外一種更為高效的方式。

先看效果

未選中時


選中某一項時


下面通過一段程式碼來講解實現過程

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <ListView
        android:id="@+id/mListView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:choiceMode="singleChoice"
        android:dividerHeight="1dp"
        android:divider="#d4d4d4"/>

</RelativeLayout>

list_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/list_item_bg_normal" android:state_activated="false"/>
    <item android:drawable="@drawable/list_item_bg_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/list_item_bg_pressed" android:state_activated="true"/>

</selector>
list_item_bg_normal.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <gradient
      android:startColor="@color/white"
      android:endColor="@color/white"
      android:angle="90" />

</shape>
list_item_bg_pressed.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    
	<gradient
      android:startColor="@color/right_bg"
      android:endColor="@color/right_bg"
      android:angle="90" />
</shape>


list_item.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="wrap_content"
    android:background="@drawable/list_selector"
    android:paddingBottom="5dp"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="5dp" >

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginRight="5dp"
        android:src="@drawable/wechat_icon" />

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/iv_icon"
        android:textColor="@color/black"
        android:textSize="15sp" />

    <TextView
        android:id="@+id/tv_msg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/iv_icon"
        android:layout_alignLeft="@id/tv_title"
        android:ellipsize="end"
        android:singleLine="true"
        android:textColor="@color/grey" />

    <TextView
        android:id="@+id/tv_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@id/tv_title"
        android:textColor="@color/grey" />

</RelativeLayout>


ListView 介面卡 WXAdapter程式碼如下:

package com.example.listviewtest.adapter;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.listviewtest.R;
import com.example.listviewtest.entity.WXMessage;

public class WXAdapter extends BaseAdapter {
    /**
     * 上下文物件
     */
    private Context mContext = null;
    private List<WXMessage> data;

    /**
     * @param mainActivity
     */
    public WXAdapter(Context ctx,List<WXMessage> data) {
        mContext = ctx;
        this.data = data;
    }

    @Override
    public int getCount() {
        return 100;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
    	
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
            holder = new ViewHolder();
            
            holder.iv_icon = (ImageView) convertView.findViewById(R.id.iv_icon);
            holder.tv_title = (TextView)convertView.findViewById(R.id.tv_title);
            holder.tv_msg = (TextView)convertView.findViewById(R.id.tv_msg);
            holder.tv_time = (TextView)convertView.findViewById(R.id.tv_time);
            
            convertView.setTag(holder);
        } else {// 有直接獲得ViewHolder
            holder = (ViewHolder)convertView.getTag();
        }
        
        WXMessage msg = data.get(position);
        
        holder.tv_title.setText(msg.getTitle());
        holder.tv_msg.setText(msg.getMsg());
        holder.tv_time.setText(msg.getTime());
        
        holder.iv_icon.setImageResource(msg.getIcon_id());
        
        return convertView;
    }

    static class ViewHolder {

        TextView tv_title;
        TextView tv_msg;
        TextView tv_time;
        ImageView iv_icon;
    }
}


MainActivity程式碼如下:

package com.example.listviewtest;

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import com.example.listviewtest.adapter.WXAdapter;
import com.example.listviewtest.entity.WXMessage;

public class MainActivity extends Activity implements OnItemClickListener {
	private List<WXMessage> data = new ArrayList<WXMessage>();
	private ListView mListView;

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

		initData();

		findView();
	}

	private void initData() {

		for (int i = 0; i < 50; i++) {
			WXMessage msg = null;
			if (i % 3 == 0) {
				msg = new WXMessage("騰訊新聞", "人民日報刊文:習近平對評價毛澤東提6個重要觀點", "早上8:44");
				msg.setIcon_id(R.drawable.qq_icon);
			} else if (i % 3 == 1) {
				msg = new WXMessage("訂閱號", "CSDN:2013年國內最具技術影響力公司", "早上8:49");
				msg.setIcon_id(R.drawable.wechat_icon);
			} else {
				msg = new WXMessage("微博閱讀", "美女演各款妹子跟男朋友打電話", "昨天晚上");
				msg.setIcon_id(R.drawable.qq_icon);
			}

			data.add(msg);
		}
	}

	private void findView() {

		mListView = (ListView) findViewById(R.id.mListView);

		WXAdapter mAdapter = new WXAdapter(this, data);
		mListView.setAdapter(mAdapter);
		
		mListView.setOnItemClickListener(this);
	}

	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		
		mListView.setItemChecked(position, true);
//		mListView.setSelection(position);
	}

}

這裡我們通過  ListView.setItemChecked(int position, boolean value)方法來選中被點選的Item,這時之前在list_item中設定的android:background="@drawable/list_selector"就開始生效了。

怎麼樣,比之前通過Adapter重新整理整個ListView的效率要高很多吧!


相關推薦

Android ListView item 選中顯示高效實現方式

之前在一篇文章中提到過  的實現方式,具體可以檢視這篇博文,這裡提供另外一種更為高效的方式。 先看效果 未選中時 選中某一項時 下面通過一段程式碼來講解實現過程 activity_main.xml <RelativeLayout xmlns:andro

android listView點選item顯示

實現listView中選擇item高亮的功能,最重要的程式碼就是 adapter.notifyDataSetInvalidated(); 通知觀察者,此條資料不再有效。 其次需要在實現BaseAdapter的類中新增一個方法,紀錄選中的item的id

Android TV 選中顯示

add 頁面 androi radi ren att set lose main 1、開發Android TV APP, 使用遙控器選中按鈕或者選著其它菜單 如果沒有高亮顯示,就看不出選中哪個按鈕或者菜單 2、在drawable 添加 border_red.xml 設置選中

Android搜尋列表關鍵詞顯示

很多App裡面都有搜尋的功能,搜尋的結果列表高亮顯示會使app體驗更好. 採用正則匹配找出字串setSpan設定顏色,當用戶輸入特殊字元時先將特殊字元進行轉義然後再進行匹配變色 話不多說,上程式碼 /** * 文字變色工具類 */ public cla

MyEclipse設定JAVA選中顯示

原文地址:http://trujun.blog.163.com/blog/static/181234097201171621323571/ 1.開啟顯示功能 選擇Windows->Preferences->Java-> Editor-> Mar

Android程式設計心得-ListViewItem顯示的辦法

在我們使用ListView的時候,經常會遇到某一項(Item)需要高亮顯示的情況,如下圖,有人說當我們點選子項的時候會變亮,但有時候業務邏輯需要讓ITEM根據條件自動變亮,下面我來介紹一下我自己的解決辦法 1.首先在layout資料夾對應的xml配置檔案定義一個l

android實現ListView顯示

使用者點選ListView中的item時,有的時候我們想要選中的item高亮顯示,以便提醒使用者。原本以為只需要簡單設定就能實現,但是並非如此。下面我們來介紹如何讓選中的item高亮顯示。 (Sam注:方法一使用是簡單方便,但在使用過程中,如果列表的條目超過一屏,會出現多條

arcgis for android空間查詢 點選某點,選中該點所在區域,顯示

修改mail.xml <com.esri.android.map.MapView android:id="@+id/map" android:layout_width="fill_parent" an

angularjs 水平滾動選中按鈕顯示 swiper和回到頂部指令的實現ionic

cor load sse component 邏輯 return position col href 首先安裝 swiper npm install --save swiper 或者 bower install --save swiper <link rel=

分散式搜尋elasticsearch java API highlighting (對搜尋結果的顯示

搜尋請求的Body如下:: { "query" : {...}, "highlight" : { "fields" : { "title":{}, "intro" : {}

Lucene學習顯示

在搜尋引擎中我們經常會看到這樣的情景: 紅色部分我們稱之為高亮顯示,lucene提供了HighLighter模組來實現這一功能。 高亮顯示模組通常包含兩個獨立的功能,首先是動態拆分,就是從匹配搜尋的大量文字中選取一小部分句子。第二個內容就是高亮顯示。 我們先來看下高亮顯示的原理:

Android中TextView的文字內容中指定關鍵字顯示

讓TextView的文字中指定關鍵字高亮顯示的工具類 public class HighLightKeyWordUtil { /** * @param color 關鍵字

呼叫任意的一級欄目,如何讓選中的二級子欄目實現顯示

class="black-top mini left-nav-prod-pos"><i class="black-top1"></i></span> <ul class="nav">

一步一步跟我學習lucene(11)---lucene搜尋顯示highlighter

highlighter介紹 這幾天一直加班,部落格有三天沒有更新了,望見諒;我們在做查詢的時候,希望對我們自己的搜尋結果與搜尋內容相近的地方進行著重顯示,就如下面的效果 這裡我們搜尋的內容是“一步一步跟我學習lucene”,搜尋引擎展示的結果中對使用者的輸入資訊進行了配色方

ElasticSearch顯示

一 什麼是highlight Highlight就是我們所謂的高亮,即允許對一個或者對個欄位在搜尋結果中高亮顯示。比如字型加粗或者字型呈現和其他文字普通顏色等。 為了執行高亮顯示,該欄位必須有實際的內

Android--MediaPlayer音樂播放器歌詞隨時間顯示

package com.mrzhu.hightlight; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.os

jquery實現帶複選框的表格行選中刪除時顯示

/**  * 設定含有複選框的表格中的背景色  */  $(document).ready(function()  {  /**  * 表格行被單擊的時候改變背景色  */  $("#tablight tr:gt(0)").click(function() //獲取第2行後  {  if ($(this)

android 顯示指定區域

今年的部落格寫的好少,自己是越來越懶了,一轉眼又到年底了,回首年初的計劃,做到的卻寥寥無幾 大家使用app時肯定遇到過本篇主題的效果,當app出了某些新功能需要給使用者以提示時,更新app後高亮顯示需要提示使用者更新的地方,具體怎麼實現呢,其實也蠻簡單的,客官,

Eclipse 顯示選中的相同變數

在 eclipse 中使用快捷鍵或其他原因,不小心按錯了,使得變數的高亮顯示沒了。  1.網友解決方法:  選擇:windows-> preferences->java->Editor->Mark Occurences  選擇最上的複選框

Android 給類及方法自動添加註釋 顯示選中詞

修改作者、日期註釋格式:開啟Windows->Preferences->Java->Code Style->Code Templates 裡面的types 是為當前類新增頭部註釋。在頁面上alt+shift+J即可生成methods 生成的是方法的