Android getItemViewType()在使用DSI将ListView上的图像和文本显示在不同行中时显示错误
我想为Android中的聊天应用程序创建一个ListView,在ListView中,如果用户键入文本,我想显示文本布局,如果用户发送图像,我想显示图像布局,我设计了两个布局,分别为sms_row.xml和sms_chat_row.xml,如果我只使用文本和图像,应用程序运行良好,通过手动将我的条件设置为true和false,但如果我试图动态地执行getItemViewType(int位置)显示错误和图像崩溃,下面是适配器类--> DevAdapter.javaAndroid getItemViewType()在使用DSI将ListView上的图像和文本显示在不同行中时显示错误,android,android-layout,android-listview,Android,Android Layout,Android Listview,我想为Android中的聊天应用程序创建一个ListView,在ListView中,如果用户键入文本,我想显示文本布局,如果用户发送图像,我想显示图像布局,我设计了两个布局,分别为sms_row.xml和sms_chat_row.xml,如果我只使用文本和图像,应用程序运行良好,通过手动将我的条件设置为true和false,但如果我试图动态地执行getItemViewType(int位置)显示错误和图像崩溃,下面是适配器类--> DevAdapter.java package com.e
package com.example.imageinsertdynamic;
import java.util.ArrayList;
import android.content.Context;
import android.view.Gravity;
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 android.widget.LinearLayout.LayoutParams;
public class DevAdapter extends BaseAdapter {
private ArrayList<Message> list;
private Context mCont;
LayoutParams lp;
public Message ob;
int type;
public DevAdapter(Context context, ArrayList<Message> msg) {
super();
this.mCont = context;
this.list = msg;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
if(true)//if ob.issetStatus() true if user types and image if user selects an image from the directory. but getting nullPointerException here.
{
return 0;
}
else
{
return 1;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ob=(Message) this.getItem(position);
ViewHolder holder;
type=getItemViewType(position);//1 for case one and 2 for case 2 , need getItemViewtype() to bring this 1 and 2 but app crashes doing so need help in this function only
/*
*
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
*
* HHHHHHHHEEEEEEEEEEEELLLLLLLLLLLPPPPPPPPPPP HERE !!
*
*
* \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
*/
if(convertView == null)
{
holder = new ViewHolder();
switch (type) {
case 0:
convertView = LayoutInflater.from(mCont).inflate(R.layout.sms_row_chat, parent, false);
holder.text = (TextView) convertView.findViewById(R.id.message_text);
convertView.setTag(holder);
break;
case 1:
convertView = LayoutInflater.from(mCont).inflate(R.layout.sms_row, parent, false);
holder.message = (ImageView) convertView.findViewById(R.id.message);
convertView.setTag(holder);
break;
}
}
else
holder = (ViewHolder) convertView.getTag();
switch(type){
case 0:
holder.text.setText(ob.getmsg());
System.out.println("value of isStatus image or text-->");
lp = (LayoutParams) holder.text.getLayoutParams();
break;
case 1:
holder.message.setImageBitmap(ob.getMessage());
System.out.println("value of isStatus image or text-->");
lp = (LayoutParams) holder.message.getLayoutParams();
break;
}
//Check whether message is mine to show green background and align to right
if(ob.isMine())
{ switch(type){
case 0:
holder.text.setBackgroundResource(R.drawable.speech_bubble_orange);
lp.gravity = Gravity.LEFT;
break;
case 1:
holder.message.setBackgroundResource(R.drawable.speech_bubble_orange);
lp.gravity = Gravity.LEFT;
break;
}
}
//If not mine then it is from sender to show orange background and align to left
else
{
switch(type){
case 0:
holder.text.setBackgroundResource(R.drawable.speech_bubble_green);
lp.gravity = Gravity.RIGHT;
break;
case 1:
holder.message.setBackgroundResource(R.drawable.speech_bubble_green);
lp.gravity = Gravity.RIGHT;
break;
}
}
switch(type){
case 0:
holder.text.setLayoutParams(lp);
break;
case 1:
holder.message.setLayoutParams(lp);
break;
}
//holder.message.setTextColor(R.color.textColor);
return convertView;
}
private static class ViewHolder
{
ImageView message;
TextView text;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
}
package com.example.imageinsertdynamic;
import android.graphics.Bitmap;
public class Message {
/**
* The content of the message
*/
Bitmap message;
String msg;
/**
* boolean to determine, who is sender of this message
*/
boolean isMine;
/**
* boolean to determine, whether the message is a status message or not.
* it reflects the changes/updates about the sender is writing, have entered text etc
*/
boolean isStatusMessage;
/**
* Constructor to make a Message object
*/
public Message(Bitmap message, boolean isMine,boolean status) {
super();
this.message = message;
this.isMine = isMine;
this.isStatusMessage = status;
}
/**
* Constructor to make a status Message object
* consider the parameters are swaped from default Message constructor,
* not a good approach but have to go with it.
*/
public Message(boolean status, String message,boolean isMine) {
super();
this.msg = message;
this.isMine = isMine;
this.isStatusMessage = status;
}
public Bitmap getMessage() {
return message;
}
public void setMessage(Bitmap message) {
this.message = message;
}
public String getmsg() {
return msg;
}
public void setMessage(String text) {
this.msg = text;
}
public boolean isMine() {
return isMine;
}
public void setMine(boolean isMine) {
this.isMine = isMine;
}
public boolean isStatusMessage() {
return isStatusMessage;
}
public void setStatusMessage(boolean isStatusMessage) {
this.isStatusMessage = isStatusMessage;
}
}
isStatusMessage来自-->
Message.java
package com.example.imageinsertdynamic;
import java.util.ArrayList;
import android.content.Context;
import android.view.Gravity;
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 android.widget.LinearLayout.LayoutParams;
public class DevAdapter extends BaseAdapter {
private ArrayList<Message> list;
private Context mCont;
LayoutParams lp;
public Message ob;
int type;
public DevAdapter(Context context, ArrayList<Message> msg) {
super();
this.mCont = context;
this.list = msg;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
if(true)//if ob.issetStatus() true if user types and image if user selects an image from the directory. but getting nullPointerException here.
{
return 0;
}
else
{
return 1;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ob=(Message) this.getItem(position);
ViewHolder holder;
type=getItemViewType(position);//1 for case one and 2 for case 2 , need getItemViewtype() to bring this 1 and 2 but app crashes doing so need help in this function only
/*
*
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
*
* HHHHHHHHEEEEEEEEEEEELLLLLLLLLLLPPPPPPPPPPP HERE !!
*
*
* \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
*/
if(convertView == null)
{
holder = new ViewHolder();
switch (type) {
case 0:
convertView = LayoutInflater.from(mCont).inflate(R.layout.sms_row_chat, parent, false);
holder.text = (TextView) convertView.findViewById(R.id.message_text);
convertView.setTag(holder);
break;
case 1:
convertView = LayoutInflater.from(mCont).inflate(R.layout.sms_row, parent, false);
holder.message = (ImageView) convertView.findViewById(R.id.message);
convertView.setTag(holder);
break;
}
}
else
holder = (ViewHolder) convertView.getTag();
switch(type){
case 0:
holder.text.setText(ob.getmsg());
System.out.println("value of isStatus image or text-->");
lp = (LayoutParams) holder.text.getLayoutParams();
break;
case 1:
holder.message.setImageBitmap(ob.getMessage());
System.out.println("value of isStatus image or text-->");
lp = (LayoutParams) holder.message.getLayoutParams();
break;
}
//Check whether message is mine to show green background and align to right
if(ob.isMine())
{ switch(type){
case 0:
holder.text.setBackgroundResource(R.drawable.speech_bubble_orange);
lp.gravity = Gravity.LEFT;
break;
case 1:
holder.message.setBackgroundResource(R.drawable.speech_bubble_orange);
lp.gravity = Gravity.LEFT;
break;
}
}
//If not mine then it is from sender to show orange background and align to left
else
{
switch(type){
case 0:
holder.text.setBackgroundResource(R.drawable.speech_bubble_green);
lp.gravity = Gravity.RIGHT;
break;
case 1:
holder.message.setBackgroundResource(R.drawable.speech_bubble_green);
lp.gravity = Gravity.RIGHT;
break;
}
}
switch(type){
case 0:
holder.text.setLayoutParams(lp);
break;
case 1:
holder.message.setLayoutParams(lp);
break;
}
//holder.message.setTextColor(R.color.textColor);
return convertView;
}
private static class ViewHolder
{
ImageView message;
TextView text;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
}
package com.example.imageinsertdynamic;
import android.graphics.Bitmap;
public class Message {
/**
* The content of the message
*/
Bitmap message;
String msg;
/**
* boolean to determine, who is sender of this message
*/
boolean isMine;
/**
* boolean to determine, whether the message is a status message or not.
* it reflects the changes/updates about the sender is writing, have entered text etc
*/
boolean isStatusMessage;
/**
* Constructor to make a Message object
*/
public Message(Bitmap message, boolean isMine,boolean status) {
super();
this.message = message;
this.isMine = isMine;
this.isStatusMessage = status;
}
/**
* Constructor to make a status Message object
* consider the parameters are swaped from default Message constructor,
* not a good approach but have to go with it.
*/
public Message(boolean status, String message,boolean isMine) {
super();
this.msg = message;
this.isMine = isMine;
this.isStatusMessage = status;
}
public Bitmap getMessage() {
return message;
}
public void setMessage(Bitmap message) {
this.message = message;
}
public String getmsg() {
return msg;
}
public void setMessage(String text) {
this.msg = text;
}
public boolean isMine() {
return isMine;
}
public void setMine(boolean isMine) {
this.isMine = isMine;
}
public boolean isStatusMessage() {
return isStatusMessage;
}
public void setStatusMessage(boolean isStatusMessage) {
this.isStatusMessage = isStatusMessage;
}
}
返回0和1,而不是返回1和2。它类似于数组的索引。如果创建两个位置的数组并尝试访问数组[2],则会得到ArrayIndexOutBoundException。这几乎就是发生在你身上的事情
@Override
public int getItemViewType(int position) {
if(true)//if ob.issetStatus() true if user types and image if user selects an image from the directory. but getting nullPointerException here.
{
return 0;
}
else
{
return 1;
}
编辑:
通常情况下,条件与数据集相关联(
ArrayList
)。getItemViewType将位置作为参数。因此,您必须在该位置检索项目,并检查是否满足条件,而不是返回1和2,而是返回0和1。它类似于数组的索引。如果创建两个位置的数组并尝试访问数组[2],则会得到ArrayIndexOutBoundException。这几乎就是发生在你身上的事情
@Override
public int getItemViewType(int position) {
if(true)//if ob.issetStatus() true if user types and image if user selects an image from the directory. but getting nullPointerException here.
{
return 0;
}
else
{
return 1;
}
编辑:
通常情况下,条件与数据集相关联(
ArrayList
)。getItemViewType将位置作为参数。因此,您必须在该位置检索项目,并检查是否满足条件您可以将文本和图像组件添加到listview组件中。您需要哪一个,将其设置为visibility true并指定值。您在getItemViewType(int位置)中观察到了什么错误?你如何“动态地”改变它?。可以help@sandrstar我在getView方法中设置type=getItemViewType(position),但得到空点异常错误。这样,我在messsage.java类中有一个isstatusmessage,它检查它是否是文本或图像,并将其设置为true和false。您可以将文本和图像组件添加到listview组件中。您需要哪一个,将其设置为visibility true并指定值。您在getItemViewType(int位置)中观察到了什么错误?你如何“动态地”改变它?。可以help@sandrstar我在getView方法中设置type=getItemViewType(position),但是得到nullpointerexception错误。这样做,我在Message.java类中有一个isstatusmessage,它检查它是否是文本或图像,并将其设置为true和false。这也没有帮助,它仍然显示nullpointerexception,我使用int type=getItemView(位置)在getView方法中,类型在选择案例的开关(类型)中,手动将其保留为1,2提供所需的结果。我能做什么?您是在getView中更改案例常量,还是像以前一样保留它(1和2)?duuhh我想我不应该再做程序员了,我想自杀,非常感谢它现在可以工作了,但是我怎么能动态地把if语句设置为true-false呢?怎么设置呢,你帮了大忙了?你能重新定义最后一个吗?什么是“if语句true-false dinamically”的意思?getItemViewType(int位置)中的if语句,具有if(true)返回0;else返回1;现在,我希望true仅在它是文本消息时为true,如果它是图像时为false,但我的ob=(message)new getItem(position)ob是消息类型的对象吗,我想要ob.isStatusMessage,如果它是图像和文本,则返回true和false,如果它在getView中初始化,如何在getitemViewType中使用它?这也没有帮助,它仍然显示nullpointerexception,我在getView方法中使用int type=getItemView(position),类型在开关(type)中它选择案例,手动将其保留为1,2将提供所需的结果。我能做什么?您是在getView中更改了案例常量,还是像以前一样保留它(1和2)?duuhh我想我不应该再做程序员了,我想自杀,非常感谢它现在可以工作了,但是我怎么能动态地把if语句设置为true-false呢?怎么设置呢,你帮了大忙了?你能重新定义最后一个吗?什么是“if语句true-false dinamically”的意思?getItemViewType(int位置)中的if语句,具有if(true)返回0;else返回1;现在,我希望true仅在它是文本消息时为true,如果它是图像时为false,但我的ob=(message)new getItem(position)ob是消息类型的对象吗?我想要ob.isStatusMessage,如果它是图像和文本,则返回true和false。如果它在getView中初始化,如何在getitemViewType中使用它?