Android 具有两种不同类型行的基本适配器
我创建了一个自定义适配器来填充ListView扩展基础适配器 在我的布局中,每一行都有相同的视图(一个Android 具有两种不同类型行的基本适配器,android,listview,android-adapter,baseadapter,custom-adapter,Android,Listview,Android Adapter,Baseadapter,Custom Adapter,我创建了一个自定义适配器来填充ListView扩展基础适配器 在我的布局中,每一行都有相同的视图(一个RelativeLayout,另一个TextView)。但行布局可能与左侧的不同,我已经显示了RelativeLayout。在另一行布局中,RelativeLayout位于右侧,TextView。我已经成功地实现了这个模块(根据一些标准划分行) 我的问题是:两种行布局上可用的TextView都需要一些来自json的文本。当我滚动整个ListView时,文本随机化。我不知道那里发生了什么。有时它可
RelativeLayout
,另一个TextView
)。但行布局可能与左侧的不同,我已经显示了RelativeLayout
。在另一行布局中,RelativeLayout
位于右侧,TextView
。我已经成功地实现了这个模块(根据一些标准划分行)
我的问题是:两种行布局上可用的TextView
都需要一些来自json的文本。当我滚动整个ListView
时,文本随机化。我不知道那里发生了什么。有时它可以工作,但每当我滚动ListView
时,setText()
方法就不能正常工作。请建议。这是我的基本适配器类
public class AwesomeAdapter extends BaseAdapter {
private Activity activity;
Context context;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater = null;
String audiopath, audiopathrec;
String pathOfAudio, pathOfAudiorec;
String filenameectString;
private MediaPlayer mediaPlayer = null;
private String OUTPUT_FILE = Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/" + "varun.m4a";
File outFile = new File(OUTPUT_FILE);
private static final int TYPE_SENDER = 0;
private static final int TYPE_RECEIVER = 1;
private static final int TYPE_MAX_COUNT = TYPE_RECEIVER + 1;
private ArrayList<String> mData = new ArrayList<String>();
private TreeSet<Integer> mSeparatorsSet = new TreeSet<Integer>();
public AwesomeAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
activity = a;
data = d;
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void addItem(final String item) {
mData.add(item);
notifyDataSetChanged();
}
public void addSeparatorItem(final String item) {
mData.add(item);
// save separator position
mSeparatorsSet.add(mData.size() - 1);
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
return mSeparatorsSet.contains(position) ? TYPE_RECEIVER : TYPE_SENDER;
}
@Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mData.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return (String) mData.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder = null;
int type = getItemViewType(position);
// View vi = convertView;
context = parent.getContext();
if (convertView == null) {
holder = new ViewHolder();
HashMap<String, String> events = new HashMap<String, String>();
events = data.get(position);
audiopath = events.get(Conversation.TAG_AUDIOPATH);
switch (type) {
case TYPE_SENDER:
convertView = inflater.inflate(
R.layout.chatbubble_listrow_sender, null);
holder.textView = (TextView) convertView
.findViewById(R.id.date);
holder.relativeLayout = (RelativeLayout) convertView
.findViewById(R.id.audio_image);
holder.relativeLayout.setTag(audiopath);
holder.relativeLayout
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
stopPlayBack();
pathOfAudio = String.valueOf(v.getTag());
Toast.makeText(context, pathOfAudio,
Toast.LENGTH_SHORT).show();
Log.e("Audio Path name", "Audio Path ==>> "
+ audiopath);
new LoadChats().execute();
}
});
holder.textView.setText(audiopath);
break;
case TYPE_RECEIVER:
convertView = inflater.inflate(R.layout.chatbubbles_listrow,
null);
holder.textView = (TextView) convertView
.findViewById(R.id.date);
holder.relativeLayout = (RelativeLayout) convertView
.findViewById(R.id.audio_image);
holder.relativeLayout.setTag(audiopath);
holder.relativeLayout
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
stopPlayBack();
pathOfAudio = String.valueOf(v.getTag());
Toast.makeText(context, pathOfAudio,
Toast.LENGTH_SHORT).show();
Log.e("Audio Path name", "Audio Path ==>> "
+ audiopath);
new LoadChats().execute();
}
});
holder.textView.setText(audiopath);
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//convertView.setTag(holder);
return convertView;
}
public static class ViewHolder {
public TextView textView;
public RelativeLayout relativeLayout;
}
public类AwesomeAdapter扩展了BaseAdapter{
私人活动;
语境;
私有数组列表数据;
专用静态充气机=空;
字符串audiopath,audiopathrec;
字符串pathOfAudio,pathOfAudiorec;
字符串filenameectString;
私有媒体播放器MediaPlayer=null;
私有字符串输出\u FILE=Environment.getExternalStorageDirectory()
.getAbsolutePath()+“/”+“varun.m4a”;
文件输出文件=新文件(输出文件);
私有静态final int TYPE_SENDER=0;
专用静态最终整型接收机=1;
专用静态最终整数类型\最大\计数=类型\接收器+1;
private ArrayList mData=new ArrayList();
私有树集mseparatorset=新树集();
公共AwesomeAdapter(活动a,ArrayList d){
活动=a;
数据=d;
充气器=(充气器)活动
.getSystemService(上下文布局\充气机\服务);
}
公共无效附加项(最终字符串项){
mData.add(项目);
notifyDataSetChanged();
}
公共void addSeparatorItem(最终字符串项){
mData.add(项目);
//保存分隔符位置
mSeparatorsSet.add(mData.size()-1);
notifyDataSetChanged();
}
@凌驾
public int getItemViewType(int位置){
返回mseparatorset.contains(位置)?TYPE\接收器:TYPE\发送器;
}
@凌驾
public int getViewTypeCount(){
返回类型\最大\计数;
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回mData.size();
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回(字符串)mData.get(位置);
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
ViewHolder=null;
int type=getItemViewType(位置);
//视图vi=转换视图;
context=parent.getContext();
if(convertView==null){
holder=新的ViewHolder();
HashMap事件=新建HashMap();
事件=数据。获取(位置);
audiopath=events.get(Conversation.TAG_audiopath);
开关(类型){
案例类型\u发送方:
convertView=充气机。充气(
R.layout.chatbuble_listrow_sender,null);
holder.textView=(textView)convertView
.findViewById(R.id.date);
holder.relativeLayout=(relativeLayout)convertView
.findviewbyd(R.id.audio_-image);
holder.relativeLayout.setTag(音频路径);
相对论
.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
停止回放();
pathOfAudio=String.valueOf(v.getTag());
Toast.makeText(上下文,pathOfAudio,
吐司。长度(短)。show();
Log.e(“音频路径名”,“音频路径==>>”
+听力通路);
新建LoadChats().execute();
}
});
holder.textView.setText(音频路径);
打破
外壳类型\ U接收器:
convertView=充气机。充气(R.layout.ChatView\u列表行,
无效);
holder.textView=(textView)convertView
.findViewById(R.id.date);
holder.relativeLayout=(relativeLayout)convertView
.findviewbyd(R.id.audio_-image);
holder.relativeLayout.setTag(音频路径);
相对论
.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
停止回放();
pathOfAudio=String.valueOf(v.getTag());
Toast.makeText(上下文,pathOfAudio,
吐司。长度(短)。show();
Log.e(“音频路径名”,“音频路径==>>”
+听力通路);
新建LoadChats().execute();
}
});
holder.textView.setText(音频路径);
打破
}
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
//convertView.setTag(支架);
返回视图;
}
公共静态类视图持有者{
公共文本视图文本视图;
公共关系;
}
}
我知道问题出在getView()
方法中。在这里,我需要一些定制,但无法解决,无法解决在哪里设置文本和哪里设置标签,我需要在开关盒等保持什么,请帮助
非常感谢将您的setText()
调用移动到if(convertView==null)
部分之后
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
if(convertView == null){
if(type == TYPE_SENDER){
// inflate sender view
}else{
// inflate receiver view
}
holder = new Holder();
convertView.setTag(holder);
holder.textView = (TextView) convertView.findViewById(R.id.text);
}else{
holder = (Holder) convertView.getTag();
}
holder.textView.setText(getItem(position));
return convertView;
}
谢谢,亚历克斯,我很高兴