Android Listview 行重复项
Posted
技术标签:
【中文标题】Android Listview 行重复项【英文标题】:Android Listview row repeating item 【发布时间】:2014-01-05 10:34:56 【问题描述】:我有一个列表,在我从共享首选项中获得的特定数字(位置)上应该显示一个图像视图(指示当前正在播放的歌曲)。但我得到了位置,但该项目也显示在其他行上。滚动列表时出现问题。
*当我退出另一个活动时会发生这种情况,并且在我恢复时我会这样做:
@Override
protected void onResume()
super.onResume();
if(AlbumDetails.mediaPlayer!=null)
adapter = new PlaylistAdapter(this, songs);
list.setAdapter(adapter);
这是我的代码:
public class PlaylistAdapter extends BaseAdapter
private Activity activity;
private static LayoutInflater inflater = null;
private ArrayList<Songs> data;
private DatabaseHelper db;
private SharedPreferences prefs;
int playpos;
public PlaylistAdapter(Activity a, ArrayList<Songs> songs)
activity = a;
data = songs;
db = new DatabaseHelper(a);
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
prefs = activity.getSharedPreferences("com.darkovski.quran",
Context.MODE_PRIVATE);
playpos = prefs.getInt("posPlaying", -1);
public int getCount()
return data.size();
public Object getItem(int position)
return position;
public long getItemId(int position)
return position;
public View getView(final int position, View convertView,
final ViewGroup parent)
View vi = convertView;
if (convertView == null)
vi = inflater.inflate(R.layout.song_item, parent, false);
ImageView download = (ImageView) vi
.findViewById(R.id.playlist_item_download);
db.openDB();
if (db.isDownloaded(data.get(position).getNumber(), data.get(position)
.getRecitorName(), data.get(position).getRecitorID()))
download.setImageResource(R.drawable.download_yes);
else
download.setImageResource(R.drawable.download_no);
download.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
new DownloadFileFromURL(activity, data.get(position)
.getRecitorName(), data.get(position).getTitle(),
data.get(position).getLink(), data.get(position)
.getNumber(), data.get(position)
.getRecitorID()).execute();
if (!db.isDBOpen())
db.openDB();
db.addDownloaded(data.get(position).getNumber(),
data.get(position).getLink(), 0, data.get(position)
.getRecitorID(), "", data.get(position)
.getTitle());
Toast.makeText(activity,
"Downloading " + data.get(position).getTitle(),
Toast.LENGTH_SHORT).show();
);
db.closeDB();
TextView number = (TextView) vi.findViewById(R.id.playlist_item_num);
TextView title = (TextView) vi.findViewById(R.id.playlist_item_reciter);
title.setText(data.get(position).getTitle());
number.setText((position + 1) + "");
ImageView eq = (ImageView) vi.findViewById(R.id.playlist_item_equlizer);
//this is where i show the item
if (playpos == position)
eq.setVisibility(View.VISIBLE);
return vi;
这就是它的外观:
【问题讨论】:
如果您发现它有帮助,请接受答案。这不是巴伯店…… @Triode 如果你向下滚动你会看到有一个接受的答案 【参考方案1】:因为这句话
if (playpos == position)
eq.setVisibility(View.VISIBLE);
列表视图回收视图,因此如果您注意到第一行和最后一行显示相同。那是因为第一行被回收到了最后一行
你可以通过在 if 上添加 else 来解决这个问题,这样它看起来像
if (playpos == position)
eq.setVisibility(View.VISIBLE);
else
eq.setVisibility(View.GONE);
【讨论】:
太容易了——为什么我没想到 :) 谢谢!【参考方案2】:如果您在 Adapter 类中扩展 BaseAdapter
,那么此解决方案将起作用。 https://***.com/a/28791031/4531507
【讨论】:
以上是关于Android Listview 行重复项的主要内容,如果未能解决你的问题,请参考以下文章
android ListView 做下拉刷新 下拉跳到第一项怎么解决