在Android Studio中使用自定义适配器来设置图像源



我使用自定义排行榜适配器将数据绑定到recyclerview。数据解析如下(数据从数据库中获取,在执行后绑定):

for (int i = 0; i < arr.length(); ++i)
{
JSONObject obj = arr.getJSONObject(i);
String fname = obj.getString("fname");
String lname = obj.getString("lname");
int elo = Integer.parseInt(obj.getString("elo"));
int hotstreak = Integer.parseInt(obj.getString("hotstreak"));
// Add to player array
TennisUser player = new TennisUser(fname, lname, elo, hotstreak);
players.add(player);
}
Collections.sort(players, (p1, p2) -> p2.getElo() - p1.getElo());
recyclerView = findViewById(R.id.ladder_recyclerview);
LadderAdapter ladderAdapter = new LadderAdapter(getApplicationContext(), players);
recyclerView.setAdapter(ladderAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
recyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext(), DividerItemDecoration.VERTICAL));

如果玩家是在热条纹上,由1表示,我将图像源设置为以下代码中的热条纹图标:

@Override
public void onBindViewHolder(@NonNull LadderViewHolder holder, int position) {
holder.rank.setText(String.valueOf(position + 1));
holder.fname.setText(p.get(position).getFname());
holder.lname.setText(p.get(position).getLname());
if (p.get(position).getHotstreak() == 1)
{
holder.hotstreak.setImageResource(R.drawable.hot_streak);
}
}

为了测试目的,只有列表中的第一个用户有一个hotstreak,我在解析后检查了数组值,数据是正确的(只有hotstreak = 1的第一个用户)。然而,由于某种原因,如果列表中的任何人都有一个hotstreak,该应用程序也显示了列表中的最后一个hotstreak。我已经调试了这个过程,它只在满足条件时才进入if语句。imageview xml是:

<ImageView
android:id="@+id/img_hotstreak"
android:layout_width="20dp"
android:layout_height="22dp"
android:layout_marginStart="2dp"
android:layout_marginLeft="2dp"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
app:layout_constraintBottom_toTopOf="@+id/lname_text"
app:layout_constraintStart_toEndOf="@+id/fname_text"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@tools:sample/avatars" />

我可以提供更多必要的细节,我只是不确定我是否错过了一些非常明显的东西。谢谢!

CustomAdapter MyClassAdapter.class


private static class ViewHolder {
TextView Id;
ImageView Image;
TextView Name;
TextView Description;
TextView Type;
TextView Cost;
TextView Count;
TextView Comment;
Button Buttonup;
Button Buttondown;
}
public MyClassAdapter(Context context, int textViewResourceId, ArrayList<Plate> items) {
super(context, textViewResourceId, items);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Plate item = getItem(position);
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(this.getContext())
.inflate(R.layout.item_main, parent, false);
viewHolder = new ViewHolder();
viewHolder.Id = (TextView)convertView.findViewById(R.id.code);
viewHolder.Image = (ImageView) convertView.findViewById(R.id.image);
viewHolder.Name = (TextView) convertView.findViewById(R.id.name);
viewHolder.Description = (TextView) convertView.findViewById(R.id.description);
viewHolder.Cost = (TextView) convertView.findViewById(R.id.price);
viewHolder.Count = (TextView) convertView.findViewById(R.id.count);
viewHolder.Buttonup = (Button) convertView.findViewById(R.id.button_up);
viewHolder.Buttondown = (Button) convertView.findViewById(R.id.button_down);

convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}

if (item!= null) {
viewHolder.Id.setText(String.format("%d",item.getId()));
viewHolder.Image.setImageURI(item.getImage());
viewHolder.Name.setText(String.format("%s", item.getName()));
viewHolder.Description.setText(String.format("%s", item.getDescription()));
viewHolder.Name.setText(String.format("%s", item.getName()));
viewHolder.Cost.setText(String.format("%s", item.getCost()));
viewHolder.Count.setText(String.format("%d", item.getCount()));
viewHolder.Buttonup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DBHelper mydb= new DBHelper(getContext());
mydb.AddPlate(item.getId());
item.CountUp();
//update viewholder.Count
}
});
viewHolder.Buttondown.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
DBHelper mydb= new DBHelper(getContext());
mydb.RemovePlate(item.getId());
item.CountDown();
//update viewholder.Count
}
});
}
return convertView;
}


// And calls the custom ArrayAdapter from Activity
ArrayList<Plate> FullMenu;
FullMenu = mydb.getPlates("Entrees");
Plate p;
int i;
MyClassAdapter adapter = new MyClassAdapter(this,0,FullMenu);
ListView listView = (ListView) findViewById(R.id.list);
listView.setAdapter(adapter);
for (i=0; i < FullMenu.size(); i++) {
p = FullMenu.get(i);
adapter.add(p);
}

最新更新