1. 程式人生 > >Android ListView 多個ItemViewType 導致View型別混亂的解決辦法

Android ListView 多個ItemViewType 導致View型別混亂的解決辦法

關於ListView的基本使用,應該都很清楚。無非就是用一個ViewHolder快取,然後重用convertView。如下:

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder viewHolder = null;
			if (convertView == null) {
				convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.chat_left_item_text, null);
				viewHolder = new ViewHolder();
				viewHolder.imageView = (ImageView) convertView.findViewById(R.id.chat_head_iv);
				convertView.setTag(viewHolder);
			} else {
				viewHolder = (ViewHolder) convertView.getTag();
			}
			return convertView;
		}

		class ViewHolder {
			ImageView imageView;
		}

但是這次在做一個即時通訊的專案是,ListView中要放的ItemViewType 有十幾個之多。然後,同樣的使用上面的快取方法,如下:
private class ChatHeadAdapter extends BaseAdapter {

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

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

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

		@Override
		public int getItemViewType(int position) {
			return position % 2;// Type 兩種 0和1
		}

		@Override
		public int getViewTypeCount() {
			return 2;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			int viewType = getItemViewType(position);
			LeftViewHolder leftViewHolder = null;
			RightViewHolder rightViewHolder = null;
			if (convertView == null) {
				if (viewType == 0) {// left
					convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.chat_left_item_text, null);
					leftViewHolder = new LeftViewHolder();
					leftViewHolder.leftImageView = (ImageView) convertView.findViewById(R.id.chat_head_iv);
					convertView.setTag(leftViewHolder);
				} else {
					convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.chat_right_item_text, null);
					rightViewHolder = new RightViewHolder();
					rightViewHolder.rightImageView = (ImageView) convertView.findViewById(R.id.chat_head_iv);
					convertView.setTag(rightViewHolder);
				}
			} else {
				if (viewType == 0) {// left
					leftViewHolder = (LeftViewHolder) convertView.getTag();
				} else {
					rightViewHolder = (RightViewHolder) convertView.getTag();
				}
			}

			if (viewType == 0) {// left
				leftViewHolder.leftImageView.setImageResource(R.drawable.head_temp_left);
			} else {
				rightViewHolder.rightImageView.setImageResource(R.drawable.head_temp_right);
			}

			return convertView;
		}

		class LeftViewHolder {
			ImageView leftImageView;
		}

		class RightViewHolder {
			ImageView rightImageView;
		}
	}

當然實際情況比上面的要複雜的多,上面只是一個簡單的例子。

不知道是由於什麼原因,用了類似上面的方法來處理我的十幾個ItemViewType,還是會經常出現ViewItem的型別不正確,查詢很久也沒發現原因。

然後只能通過下面的設定,解決這個問題。

@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			int viewType = getItemViewType(position);
			LeftViewHolder leftViewHolder = null;
			RightViewHolder rightViewHolder = null;
			if (convertView == null||((Integer) convertView.getTag(R.id.tag_key_chat_item_type))!=viewType) {
				if (viewType == 0) {// left
					convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.chat_left_item_text, null);
					leftViewHolder = new LeftViewHolder();
					leftViewHolder.leftImageView = (ImageView) convertView.findViewById(R.id.chat_head_iv);
					convertView.setTag(R.id.tag_key_chat_item_view,leftViewHolder);
				} else {
					convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.chat_right_item_text, null);
					rightViewHolder = new RightViewHolder();
					rightViewHolder.rightImageView = (ImageView) convertView.findViewById(R.id.chat_head_iv);
					convertView.setTag(R.id.tag_key_chat_item_view,rightViewHolder);
				}
				convertView.setTag(R.id.tag_key_chat_item_type, viewType);
			} else {
				if (viewType == 0) {// left
					leftViewHolder = (LeftViewHolder) convertView.getTag(R.id.tag_key_chat_item_view);
				} else {
					rightViewHolder = (RightViewHolder) convertView.getTag(R.id.tag_key_chat_item_view);
				}
			}
			
			if (viewType == 0) {// left
				leftViewHolder.leftImageView.setImageResource(R.drawable.head_temp_left);
			} else {
				rightViewHolder.rightImageView.setImageResource(R.drawable.head_temp_right);
			}

			return convertView;
		}

R.id.tag_key_chat_item_type和R.id.tag_key_chat_item_view是在ids.xml中定義的兩個普通的id

相關推薦

Android ListView ItemViewType 導致View型別混亂解決辦法

關於ListView的基本使用,應該都很清楚。無非就是用一個ViewHolder快取,然後重用convertView。如下: @Override public View getView(int position, View convertView, ViewGrou

Android listview載入資料後沒有立即重新整理的解決辦法

最近用到listview顯示從伺服器拉取回來的json資料,主要是圖片和文字資源。      Listview在載入完資料後,當我們需要ListView進行重新整理的時候,我們需要呼叫Adapter.

android ANR產生原因(三總常見型別)和解決辦法

轉載:http://blog.csdn.net/lonlylove/article/details/42006285 記得好久之前,面試時候,面試官問我,造成ANR的原因有哪些?   答:  自我感覺良好的我,就說了好多(包括了經典中兩個),最後面試官說了句,其實就三

Android Listview中Button按鈕點選事件衝突解決辦法

 今天做專案時,ListView中含有了Button元件,心裡一早就知道肯定會有衝突,因為以前就遇到過,並解決過,可惜當時沒有記錄下來。 今天在做的時候,繼續被這個問題鬱悶了一把,後來解決後,趕緊來記錄下,以便日後參考。   首先,其實Listview中Button按

AndroidView同時動畫

本文主要是記錄開發過程中遇到的坑 動畫是為了提高互動性而在應用裡增加的,單個動畫的實現有好幾種方式,比如 (View).animate().scaleY(0.5f).alpha(0.5f).translationX(100f).setDuration(500).start(

Android ListView佈局 , 三不同佈局的listView展示在一個頁面 ,非常獨特的一個列表展示

使用listview多佈局會出現一點問題:由於多個item佈局給單一的item佈局是不一樣的,使用起來,contentview的複用會出現問題。避免出現問題的有這幾個方法:1.重寫 getViewTypeCount() – 該方法返回多少個不同的佈局2.重寫 getItemV

android專案引用library導致引用android-support-v4.jar衝突

         今天碰到的問題是當前的專案A引用了兩個Library B,Library C專案,本身該專案libs裡面就有android-support-v4.jar,然後這兩個Library又都

Android ListView布局講解

androidListview優化是一個老生常談的事情了,其優化的方面也有很多種,例如,布局重用、在getView()中減少邏輯計算、減少在頁面滑動的時候加在圖片,而是在頁面停止滾動的時候再加在圖片。而今天要介紹的是另一種方式,那就是多布局。一般使用的場景有一下兩種情況:① 當一個item有多重布局的情況下,

Android ListView選模式

ListViewListView使用多選模式好處 交互與數據分離,在多選狀態下不需要修改數據源,在最後確定的時候獲取選擇索引來確定選擇的數據。 ListView模式 CHOICE_MODE_NONE:普通模式; CHOICE_MODE_SINGLE:單選模式; CHOICE_MODE_MULTIPLE:多選

Android入門 Activity之間切換原理介紹

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android視訊檔案拼接為一個檔案

正文 利用android的2個類MediaExtractor(抽取音/視訊幀) + MediaMuxer (將音視訊重新寫入一個多媒體檔案,完成封裝)。 合成檔案為MP4。為啥是MP4? 因為android支援最好的就是這個格式。MediaMuxer的native實現者是MPE

pandas DataFrame高效程式設計方法: 根據列的值做判斷,生成新的列值,其中列的值是包含值的資料型別

一.遇到的問題描述: 我遇到問題的資料比較複雜,下面以比較簡單的資料為例說明問題,所以這些資料的含義是沒有意義的,可以忽略資料的的具體意義。資料如下所示: import numpy as np import pandas as pd data = {'city': [{'Beijing':1

Android recyclerview 佈局 item資料錯亂

這個問題困擾了兩三天,recyclerview在採用多種佈局的情況下,在onBindViewHolder繫結的時候會,會將不會顯示的佈局用View.GONE隱藏起來,看似沒有問題!但是上下滑動的時候會發生item顯示錯亂! 原本的item資料顯示,在滑動幾次後,顯示條數只剩下幾條 走了

Android 支援APK同時錄音

Android4.4 修改方法 原始碼路徑: sdk\hardware\libhardware_legacy\audio\AudioPolicyManagerBase.cpp audio_io_handle_t AudioPolicyManagerBase::

Android Studiomodule匯入AAR庫

介紹 有時候由於需要一些自定義之後的開源庫,無法使用jCenter裡面的官方庫,又懶得自己搭建Maven倉庫,所以我們想要自己在專案裡面直接匯入本地的AAR庫。 通用方法和問題 網上通用的AAR匯入Gradle的方法很簡單: repositories { fl

一個伺服器搭tomcat導致session丟失,或者同一個IP不同埠,應用的session會衝突解決方法

 一個伺服器上搭建了多個tomcat或者weblogic,埠不一樣,同時啟動訪問時session丟失。如:A,B兩個服務,在瀏覽器中登入訪問A後,當前開啟的瀏覽器上在開一個選項卡訪問B服務後,回過來點選訪問A時session丟失,需要重新登入A才可以訪問。經過資料查詢,發

android listView層巢狀listView顯示不全問題

最近在做專案,需要用到listVIew多層巢狀listVIew的需求,先發現已下兩個處理辦法比較好用 第一種:public class ListViewNesting extends ListView { public ListViewNesting(Context c

AndroidActivity之間利用bundle傳遞數值

安卓中的Activity相當於vb,mfc中的窗體,在多個Activity之間傳遞資料是一個相當核心的功能。下面舉個例子來說明這個問題。 一、基本目標 使用者在兩個輸入框中輸入使用者名稱、密碼之後,跳到另一個Activity當中,顯示其輸入的內容, 然後這兩個Activi

Android 支援VideoView聲音調節

有個場景就是一個頁面裡有多個VideoView播放視訊,然後每個視訊都有一個音量值,但是VideoView並不支援直接設定音量,而是要通過調節系統音量來實現,那麼這樣的話,就不能實現為每個視訊獨立調節音量了我們知道MediaPlayer+SurfaceView也能實現視訊的

Android webview頁面goback無法銷燬當前activity的處理

webview載入一個網頁,這個網頁會連結到另一個網頁,這兩個網頁頂部都有h5寫的返回圖示,點選返回之前是這樣的: @JavascriptInterface public void goBack() { finish();