Java 从ListAdapter取消显示的自定义图像视图
好的,我的问题与此类似 但是,在普通ImageView上使用setImageResource可以解决此问题,但我希望在列表的所有元素上都存在动画,如果没有允许动画运行的自定义ImageView类,这是无法实现的。有人知道为什么在列表视图中滚动后这些图像会消失,以及如何修复吗?非常感谢 这是我的ListAdapter:Java 从ListAdapter取消显示的自定义图像视图,java,android,animation,imageview,Java,Android,Animation,Imageview,好的,我的问题与此类似 但是,在普通ImageView上使用setImageResource可以解决此问题,但我希望在列表的所有元素上都存在动画,如果没有允许动画运行的自定义ImageView类,这是无法实现的。有人知道为什么在列表视图中滚动后这些图像会消失,以及如何修复吗?非常感谢 这是我的ListAdapter: package com.mmgworldwide.layout.listadapters; import java.io.IOException; import java
package com.mmgworldwide.layout.listadapters;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import com.mmgworldwide.R;
import com.mmgworldwide.customviews.SpinLoadingAnim;
import com.mmgworldwide.data.FWREvent;
import com.mmgworldwide.data.ImageThreadLoader;
import com.mmgworldwide.data.ImageThreadLoader.ImageLoadedListener;
import com.mmgworldwide.layout.ListDivider;
import com.mmgworldwide.data.Personality;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class PersonalityListAdapter extends ArrayAdapter<Object>{
private Context parentContext;
public ArrayList<Object> items_list_ref;
private ImageThreadLoader imageLoader = new ImageThreadLoader();
public PersonalityListAdapter(Context context, int resource, int textViewResourceId, ArrayList<Object> items_list) {
super(context, resource, textViewResourceId, items_list);
items_list_ref = items_list;
parentContext = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Object node = (Object) items_list_ref.get(position);
LayoutInflater inflater = (LayoutInflater) parentContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(node instanceof ListDivider){
//make new div bar
View div = inflater.inflate(R.layout.list_bar, parent, false);
TextView div_label = (TextView) div.findViewById(R.id.div_label);
div_label.setText(((ListDivider) node).label.toUpperCase());
return div;
}
View row = inflater.inflate(R.layout.picture_list, parent, false);
TextView name_txt = (TextView) row.findViewById(R.id.name_txt);
TextView title_txt = (TextView) row.findViewById(R.id.title_txt);
final ImageView portrait_img = (ImageView) row.findViewById(R.id.portrait);
final ImageView load_cnt = (ImageView) row.findViewById(R.id.portrait_loadDisplay);
name_txt.setText(((Personality) node).getName());
SpannableString title_underlined = new SpannableString(((Personality) node).getTitle());
title_underlined .setSpan(new UnderlineSpan(), 0, title_underlined.length(), 0);
title_txt.setText(title_underlined);
load_cnt.setVisibility(View.VISIBLE);
return row;
}
这是我的布局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="#FFFFFF"
android:gravity="center_vertical"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<ImageView android:layout_width="60dp" android:layout_height="60dp" android:id="@+id/portrait" android:layout_centerVertical="true"></ImageView>
<com.mmgworldwide.customviews.SpinLoadingAnim
android:id="@+id/portrait_loadDisplay"
android:layout_width="20dp" android:layout_height="20dp"
android:background="#939598"
android:layout_centerVertical="true" android:layout_marginLeft="20dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true" />
<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_centerVertical="true" android:id="@+id/arrow" android:src="@drawable/list_arrow" android:layout_alignParentRight="true"></ImageView>
<LinearLayout android:layout_toRightOf="@id/portrait" android:layout_toLeftOf="@id/arrow" android:layout_centerVertical="true" android:orientation="vertical" android:layout_height="wrap_content" android:layout_width="wrap_content" android:baselineAligned="true" android:paddingLeft="15dp" android:paddingRight="15dp">
<TextView android:text="CHEF NAME" android:id="@+id/name_txt" android:layout_width="wrap_content" android:textColor="#000000" android:textStyle="bold"
android:layout_height="wrap_content" android:paddingBottom="2dp" android:textSize="15sp"></TextView>
<TextView android:text="Chef Title" android:id="@+id/title_txt" android:layout_width="wrap_content" android:textColor="#000000"
android:layout_height="wrap_content" android:textSize="13sp"></TextView>
</LinearLayout>
</RelativeLayout>
每第五个“预加载”图形仍在消失,但感谢米歇尔,这已经帮助了很多,使事情更干净
package com.mmgworldwide.layout;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.mmgworldwide.R;
import com.mmgworldwide.data.DataConnection;
import com.mmgworldwide.data.ImageThreadLoader;
import com.mmgworldwide.data.Personality;
//http://code.google.com/p/and-conference/source/browse/trunk/src/com/totsp/conference/PresentationList.java
public class Personalities extends Activity{
private ListView listView;
private ArrayAdapter<Object> adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.personalities);
listView = (ListView) findViewById(R.id.personalitylistview);
listView.setDrawingCacheEnabled(false);
addListAdapter();
setFooterView("more");
}
private void addListAdapter(){
ArrayList<Object> adaptList = makeAdaptList();
adapter = new PersonalityListAdapter(this, 0, adaptList);
listView.setAdapter(adapter);
}
private ArrayList<Object> makeAdaptList(){
ArrayList<Object> adaptList = new ArrayList<Object>();
String currentDivDate = " ";
for(Personality aEvent : DataConnection.fwrInfo.getPersonalityList()){
adaptList.add(aEvent);
}
return adaptList;
}
private void setFooterView(String highlight){
Footer footer = (Footer) findViewById(R.id.footer);
footer.setHighlight(highlight);
}
//***********************************************************************************************************************************************
//ViewHolder
//***********************************************************************************************************************************************
static class ViewHolder {
private TextView tView1;
private TextView tView2;
private ImageView iView1;
}
//***********************************************************************************************************************************************
//PersonalityListAdapter
//***********************************************************************************************************************************************
private class PersonalityListAdapter extends ArrayAdapter<Object>{
LayoutInflater vi = (LayoutInflater) Personalities.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
private Context parentContext;
public ArrayList<Object> items_list_ref;
private ImageThreadLoader imageLoader = new ImageThreadLoader();
public PersonalityListAdapter(final Context context, final int resId, final ArrayList<Object> presentations) {
super(context, resId, presentations);
this.items_list_ref = presentations;
parentContext = context;
}
@Override
public int getCount() {
return items_list_ref.size();
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//Log.d("TROY", "adding view");
View v = convertView;
if (v == null) {
//Log.d("TROY", "inflation");
v = vi.inflate(R.layout.picture_list, parent, false);
ViewHolder viewHolder = new ViewHolder();
viewHolder.tView1 = (TextView) v.findViewById(R.id.name_txt);
viewHolder.tView2 = (TextView) v.findViewById(R.id.title_txt);
viewHolder.iView1 = (ImageView) v.findViewById(R.id.portrait);
v.setTag(viewHolder);
}
Object p = items_list_ref.get(position);
if (p != null) {
//Log.d("TROY", "setting stuff");
ViewHolder viewHolder = (ViewHolder) v.getTag();
viewHolder.tView1.setText("hi");
}
return v;
}
}
}
package com.mmgworldwide.layout;
导入java.util.ArrayList;
导入android.app.Activity;
导入android.content.Context;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.ListView;
导入android.widget.TextView;
导入com.mmgworldwide.R;
导入com.mmgworldwide.data.DataConnection;
导入com.mmgworldwide.data.ImageThreadLoader;
导入com.mmgworldwide.data.Personality;
//http://code.google.com/p/and-conference/source/browse/trunk/src/com/totsp/conference/PresentationList.java
公众阶层的人物扩大了活动范围{
私有列表视图列表视图;
专用阵列适配器;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.personalies);
listView=(listView)findViewById(R.id.personalitylistview);
listView.setDrawingCacheEnabled(false);
addListAdapter();
setFooterView(“更多”);
}
私有void addListAdapter(){
ArrayList adaptList=makeAdaptList();
适配器=新的PersonalityListAdapter(此,0,适配器列表);
setAdapter(适配器);
}
私有ArrayList MakeAdapterlist(){
ArrayList AdapterList=新的ArrayList();
字符串currentDivDate=“”;
for(Personality-aEvent:DataConnection.fwrInfo.getPersonalityList()){
AdapterList.add(aEvent);
}
返回列表;
}
私有void setFooterView(字符串高亮显示){
Footer Footer=(Footer)findviewbyd(R.id.Footer);
footer.setHighlight(突出显示);
}
//***********************************************************************************************************************************************
//观众
//***********************************************************************************************************************************************
静态类视窗夹{
私有文本视图tView1;
私有文本视图tView2;
私有ImageView iView1;
}
//***********************************************************************************************************************************************
//个性化静态适配器
//***********************************************************************************************************************************************
私有类PersonalityListAdapter扩展了ArrayAdapter{
LayoutInflater vi=(LayoutInflater)personals.this.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
私人语境;
公共阵列列表项\u列表\u参考;
私有ImageThreadLoader imageLoader=新ImageThreadLoader();
公共PersonalityListAdapter(最终上下文、最终整数剩余、最终数组列表演示){
超级(上下文、剩余、演示);
this.items\u list\u ref=演示文稿;
parentContext=context;
}
@凌驾
public int getCount(){
返回项目列表参考大小();
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//Log.d(“特洛伊”,“添加视图”);
视图v=转换视图;
如果(v==null){
//Log.d(“特洛伊”、“通货膨胀”);
v=vi.充气(R.布局.图片列表,父项,假);
ViewHolder ViewHolder=新ViewHolder();
viewHolder.tView1=(TextView)v.findViewById(R.id.name_txt);
viewHolder.tView2=(TextView)v.findViewById(R.id.title_txt);
viewHolder.iView1=(ImageView)v.findViewById(R.id.crative);
v、 setTag(视图持有者);
}
对象p=项目列表参考获取(位置);
如果(p!=null){
//Log.d(“特洛伊”,“设置东西”);
ViewHolder ViewHolder=(ViewHolder)v.getTag();
viewHolder.tView1.setText(“hi”);
}
返回v;
}
}
}
下面是正在进行的屏幕截图(为什么第五个预加载图形没有显示?):
编辑------
好的,我添加了getCount和getItemId覆盖,但是仍然有相同的问题,我想我应该从头开始一个项目,然后用一个listView再试一次,同样的问题,我已经建立了一个测试项目来演示这个令人沮丧的问题。在这个测试中,我甚至没有向适配器添加任何数据,动画只对其中一些适配器有效,就像我的主项目一样
非常感谢你的耐心和帮助,米歇尔,你真是太棒了
列表视图是高度优化的数据结构。您应该使用viewholder来遵守列表的规则,并使系统的使用更加方便 滚动列表视图时,系统会将项目缓存在保持架中以提高性能。 阅读 您也可以尝试设置
yourListView.setDrawingCacheEnabled(false);
编辑:确定,然后尝试使用xml设置动画
比如:
<!-- Animation frames are wheel0.png -- wheel5.png files inside the
res/drawable/ folder -->
<animation-list android:id="selected" android:oneshot="false">
<item android:drawable="@drawable/wheel0" android:duration="50" />
<item android:drawable="@drawable/wheel1" android:duration="50" />
<item android:drawable="@drawable/wheel2" android:duration="50" />
<item android:drawable="@drawable/wheel3" android:duration="50" />
<item android:drawable="@drawable/wheel4" android:duration="50" />
<item android:drawable="@drawable/wheel5" android:duration="50" />
</animation-list>
<!-- Animation frames are wheel0.png -- wheel5.png files inside the
res/drawable/ folder -->
<animation-list android:id="selected" android:oneshot="false">
<item android:drawable="@drawable/wheel0" android:duration="50" />
<item android:drawable="@drawable/wheel1" android:duration="50" />
<item android:drawable="@drawable/wheel2" android:duration="50" />
<item android:drawable="@drawable/wheel3" android:duration="50" />
<item android:drawable="@drawable/wheel4" android:duration="50" />
<item android:drawable="@drawable/wheel5" android:duration="50" />
</animation-list>
@Override
public int getCount() {
return <yourdatastructure>.getSize();
}
@Override
public long getItemId(int position) {
return position;
}