Android 如何根据需要准备用于显示ImageView而不是TextView的适配器

Android 如何根据需要准备用于显示ImageView而不是TextView的适配器,android,listview,android-listview,adapter,Android,Listview,Android Listview,Adapter,我的聊天应用程序有一个ListView,有时我需要删除TextView并根据数据输入加载一个图像,为了实现这一点,我有一些想法,我已经尝试过了,但ListView在我添加图像时会出错,不管怎样,我想也许可以从一些善良的人那里获得一些经验,请问什么是正确的方法?我认为这些方法是: 1.创建2个ViewHolder和ConvertViews集,每次加载1个集 2.将listView中的imageView设置为不可见,并在需要时显示它这一次我尝试了,但失败了,如前所述 如果你能给我小费或帮助,我真的很

我的聊天应用程序有一个ListView,有时我需要删除TextView并根据数据输入加载一个图像,为了实现这一点,我有一些想法,我已经尝试过了,但ListView在我添加图像时会出错,不管怎样,我想也许可以从一些善良的人那里获得一些经验,请问什么是正确的方法?我认为这些方法是:

1.创建2个ViewHolder和ConvertViews集,每次加载1个集

2.将listView中的imageView设置为不可见,并在需要时显示它这一次我尝试了,但失败了,如前所述

如果你能给我小费或帮助,我真的很感激,非常感谢

我已经尝试过的一部分:

     @Override
 public int getCount() {
return mCursor.getCount();
}

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

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


@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
    holder = new ViewHolder();
    convertView = mLayoutInflater.inflate(R.layout.listitem_discuss, null);
    this.convertview=convertView;



System.out.println("ConverView null");

holder.PimageView = (ImageView)convertView.findViewById(R.id.PimageView);
//PimageView is the One i have Problem With, it gets Visible When Inputs are Images
holder.wrapper = (LinearLayout) convertView.findViewById(R.id.wrapper);
//wrapper is my LinearLayout child of FrameLayout
holder.theMessage = (TextView) convertView.findViewById(R.id.comment);
holder.theName = (TextView) convertView.findViewById(R.id.MSGname);
holder.theImage = (ImageView)convertView.findViewById(R.id.MSGimage);
holder.lp = (FrameLayout.LayoutParams) holder.theName.getLayoutParams();
holder.paramsleft = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT,Gravity.LEFT);
holder.paramsright = new   FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT,Gravity.RIGHT);

convertView.setTag(holder);

}else {
   holder = (ViewHolder) convertView.getTag();
}

mCursor.moveToPosition(position);   
String imagenamer= 
(mCursor.getString(mCursor.getColumnIndex("username")).split("\\@"))[0];
int isright= Integer.valueOf(mCursor.getString(mCursor.getColumnIndex("isright")));



if(!"".equals(mCursor.getString(mCursor.getColumnIndex("isfile")))){
 System.out.println("its a file");
String type=(mCursor.getString(mCursor.getColumnIndex("isfile")).split("\\@ADAT")
[0]);
System.out.println("Type:"+type);
switch (type) {
case "image":
        //theMessage is replaced with PimageView and so TheView
        holder.theMessage.setVisibility(View.GONE);
        holder.PimageView.setVisibility(View.VISIBLE);  
        System.out.println("its an image");
        holder.PimageView.setLayoutParams(new   
LinearLayout.LayoutParams(PViewWidth,LayoutParams.WRAP_CONTENT));
if(isright==0){
holder.PimageView.setBackgroundResource(R.drawable.bubble_yellow);

}else{
holder.PimageView.setBackgroundResource(R.drawable.bubble_yellow);

 }

但是ListView在滚动时会弄乱位置

您有两个选择。一个是走可见/不可见的路线。如果你这样做的话,你必须在每次调用getView时都使适当的视图可见和不可见,你的getView需要知道该使用哪个视图


选项二是一个完全自定义的适配器。特别是,除了常规函数外,还需要重载getViewTypeCount和getItemViewType。对于这样一个简单的视图,我可能会选择route 1,对于复杂的视图,这个选项更好。

我确实做了第一个,请看一看,我添加了需要格式化代码的代码。但是我没有看到你在文本的情况下设置了正确的可视性。你需要把它们都设置好。除此之外,告诉我你看到了什么问题。imageView已经在xml中消失了,这就是原因,这只是它的一部分,因为我有8个这样的条件,问题是,例如,如果我的列表中有2个图像,我有4个,无论何时我上下滚动,它都会变得更加混乱,导致所有的textview都被删除,而ImageView都被取而代之,不管它是否在xml中消失了。滚动时,视图将被回收。您必须在每次调用中设置每个字段的每个设置以获得查看-这意味着所有文本、所有图像和所有可视性。这不是extact原因或解决方案,但它帮助我修复了更多的回收问题,因此我接受了答案