【100分可再加】关于listview整体上移,重写adaper的问题。

蛀牙kk 2013-03-26 05:30:59
想完成这种效果:

比如默认播放第五行的音乐,鼠标点击第七行的时候,所有子项上移两行,即第一行到倒数第二行,第二行到最后一行,第三行到第一行……第七行到第五行,播放该行音乐……

private List<String> list;//存放音乐的路径,这里一共9个,都是从sd卡读取,路径名为:mnt/sdcard/music/idontwanttoleaveyoulone_mayday(歌名).map3
private List<String> temp;//存放鼠标点击前的音乐路径
list = new ArrayList<String>();
temp= new ArrayList<String>();

listView绑定到MusicList创建的实例上,使用自定义的adapter:
	class MusicListAdapter extends BaseAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@SuppressLint("NewApi")
@SuppressWarnings({ "deprecation", "unused" })
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub

if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.list_item,
null);
}
TextView tv_music_name = (TextView) convertView
.findViewById(R.id.textView1_music_name);
tempe=position;

tempe=position+orienIndex;
if(tempe>list.size()){
tempe=tempe%list.size();
}
else if(tempe<0){
tempe=list.size()+tempe;
}
list.set(position,temp.get(tempe));

//*********************************修改播放列表显示
tv_music_name.setTextColor(Color.WHITE);
tv_music_name.setText(list.get(position).substring(18).replace(".mp3", " ").replace("_", "-"));

return convertView;
}
}

temp在鼠标点击前初始化为temp.addAll(list);
监听的鼠标点击事件:
	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
temp.clear();
currIndex = position;//
orienIndex=currIndex-FIXMUSICINDEX;//FIXMUSICINDEX表示固定播放第几行,这里为5
temp.addAll(list);
//***************************************
ma.notifyDataSetInvalidated();
//***************************************
start();
}


然后就报错了:
FATAL EXCEPTION: main
java.lang.IndexOutOfBoundsException: Invalid index 9, size is 9
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
at java.util.ArrayList.get(ArrayList.java:304)
at com.example.musicly.MainActivity$MusicListAdapter.getView(MainActivity.java:157)

活动名是MainActivity 第157行是list.set(position,temp.get(tempe));

求大神解答~~
...全文
233 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Victor刘 2013-03-27
  • 打赏
  • 举报
回复
仔细检查一下吧,别急着贴问题,应该是个小细节,现在不太好看出来。像是没有清除完上个状态(UI上的)。
蛀牙kk 2013-03-27
  • 打赏
  • 举报
回复
谢谢楼上,是问题之一。
下面是解决方法,不过又出现新问题了。
这个问题已经解决了,以下是解决办法:
我把自定义的MusicListAdapter中的getView这样改写:
[mw_shl_code=java,true] if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.list_item,
null);
}
TextView tv_music_name = (TextView) convertView
.findViewById(R.id.textView1_music_name);
int testposition=position;
//*********************************修改播放列表显示
tv_music_name.setTextColor(Color.WHITE);
tv_music_name.setText(list.get(position).substring(18).replace(".mp3", " ").replace("_", "-"));
if(position==FIXMUSICINDEX){//位置FIXMUSICINDEX固定被选中
tv_music_name.setAlpha(255);
tv_music_name.setTextSize(23);
tv_music_name.setTextColor(Color.rgb(30, 144, 255));
tv_music_name.setBackgroundResource(R.drawable.colorchange);
}
else
{
tv_music_name.setAlpha(100);
tv_music_name.setTextSize(19);
}
return convertView;
}
}//**end MusicListAdapter[/mw_shl_code]
OnItemClick这样改写:
[mw_shl_code=java,true] @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
temp.clear();
orienIndex=position-FIXMUSICINDEX;
temp.addAll(list);
list.clear();
for(int i=0;i<temp.size();i++){
tempe=i+orienIndex;
if(tempe>=list.size()){
tempe=tempe%temp.size();
}
else if(tempe<0){
tempe=temp.size()+tempe;
}
if(tempe<temp.size())
list.add(temp.get(tempe));
currIndex=FIXMUSICINDEX;
}
//***************************************
ma.notifyDataSetInvalidated();
//***************************************
start();
}[/mw_shl_code]

——————————————————————————————————————
但是第一行也被选中了肿么破?如下图:

目测是getview里面if(position==FIXMUSICINDEX)有问题 但debug发现position为0的时候并没有执行if中的语句而是执行了else。
求解决!!!



蛀牙kk 2013-03-27
  • 打赏
  • 举报
回复
对的 是这个问题。谢楼上二位哈~
不简单de 2013-03-27
  • 打赏
  • 举报
回复
if(position==FIXMUSICINDEX){ } else{ 这里把背景颜色还原 }
Victor刘 2013-03-26
  • 打赏
  • 举报
回复
应该是tempe>=list.size()

80,492

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧