现在用android adt做界面,遇到一些问题,解决了一些问题,在这里捋顺一下思路。
一、实现如下效果。
原先的思路: 在adapter的getview中修改position
private List list;//存放音乐的路径,这里一共9个,都是从sd卡读取,路径名为:mnt/sdcard/music/idontwanttoleaveyoulone_mayday(歌名).map3
private List temp;//存放鼠标点击前的音乐路径
list = new ArrayList();
temp= new ArrayList();
重写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;
}
}重写onitemclick
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)
INDEX越界。
后来看到一个帖子说,这里是修改了adapter中所有内容,所以应该重新setadapter。于是在onitemclick中重新setadapter。报不同步错误。网上说因为setadapter没有在主线程中。应该listview.request一下,这里都没用。
后来想到在onitemclick中修改adapter的list内容,listview不变,只修改list中String内容。修改如下:
adapter中的getView改写如下:
public View getView(int position, View convertView, ViewGroup parent) {
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
只在FIXMUSICINDEX ITEM项中设置背景,当不是该索引时,其他索引要重设背景,清除上个状态。
这里文字下移效果没实现,一点击FIXMUSICINDEX上面的音乐,所有音乐都消失了。上移可以完成,原因待寻找。
重写的onitemclick:
@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
tempe=i+orienIndex;
if(tempe>=list.size()){
tempe=tempe%temp.size();
}
else if(tempe<0){
tempe=temp.size()+tempe;
}
if(tempe
list.add(temp.get(tempe));
currIndex=FIXMUSICINDEX;
}
//***************************************
ma.notifyDataSetInvalidated();
//***************************************
start();
}
另:
自定义动画步骤:
Animation myAnimation;
myAnimation = AnimationUtils.loadAnimation(this, R.anim.ani_in);
myImageView = (ImageView)findViewById(R.id.myImageView);
myImageView.startAnimation(myAnimation);