ListView 不按照顺序在 notifyDataSetChanged 后显示

ListView not follow order to display after notifyDataSetChanged

我不知道为什么在我 activity.

中更新数据后,我的 listview 的输出总是顺序错误

这就是我在 activity

中初始化适配器的方式
inboxTradeAdapter=new InboxTradeAdapter(InboxTradeActivity.this, R.layout.activity_inbox_trade, tradeArrayList,loginUserId);
tradeList.setAdapter(inboxTradeAdapter);

我打电话给

inboxTradeAdapter.notifyDataSetChanged();

tradeArrayList 更新后

这是我的适配器

public class InboxTradeAdapter extends ArrayAdapter<Trade> {
private List<Trade> tradeList;
private Context context;
private String loginUserId;

public InboxTradeAdapter(Context context, int resource, List<Trade> tradeList, String loginUserId) {
    super(context, resource, tradeList);
    this.context = context;
    this.tradeList = tradeList;
    this.loginUserId=loginUserId;
}

@Override
public boolean isEnabled(int position) {
    return true;
}

@Override
public int getCount() {
    return ((null != tradeList) ?
            tradeList.size() : 0);
}

@Override
public Trade getItem(int position) {
    return ((null != tradeList) ?
            tradeList.get(position) : null);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    LayoutInflater layoutInflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if (null == view) {
        view = layoutInflater.inflate(R.layout.grid_category, null);
    }

    final Trade trade = tradeList.get(position);

    if (trade != null) {
        final CardView tradeLayout = (CardView) view.findViewById(R.id.category_gridlayout);
        final TextView tradeName = (TextView) view.findViewById(R.id.category_name);
        final ImageView tradeImage = (ImageView) view.findViewById(R.id.category_icon);

        tradeName.setText(trade.getNameOwn());
        tradeName.setSelected(true);

        tradeLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Toast.makeText(context, category.getId()+" "+category.getName(), Toast.LENGTH_LONG).show();
                Intent intent = new Intent(context, InboxActivity.class);
                intent.putExtra("loginUserId", loginUserId);
                intent.putExtra("tradeId",String.valueOf(trade.getId()));
                context.startActivity(intent);
            }
        });
    }

    return view;
}
}

我可以确认我的 activity 中的 tradeArrayList 顺序是正确的,但列表视图以随机顺序显示交易。我找不到错误,请帮忙

我注意到你没有使用支架图案。始终利用它进行优化。 对于手头的问题,请尝试使用 holder 模式重构您的代码。您可以在线了解更多信息。

也没有必要覆盖 getItem() 方法。

@Override
public View getView(int position, View convertView, ViewGroup parent) {

  final ViewHolder holder;
  Trade trade = getItem(position);
    if (convertView == null) {
         convertView = mInflater.inflate(R.layout.grid_category, parent, false);
         holder = new ViewHolder();
         holder.tradeName = (TextView) convertView.findViewById(R.id.category_name);
         holder.tradeLayout = (CardView) convertView.findViewById(R.id.category_gridlayout);
         holder.tradeImage = (ImageView) convertView.findViewById(R.id.category_icon);
         convertView.setTag(holder);
       } else {
          holder = (ViewHolder) convertView.getTag();
       }  

    holder.tradeName.setText(trade.getNameOwn());
    holder.tradeName.setSelected(true);

    holder.tradeLayout.setOnClickListener(new View.OnClickListener() {
         @Override
        public void onClick(View v) {
            //Toast.makeText(context, category.getId()+" "+category.getName(), Toast.LENGTH_LONG).show();
          Intent intent = new Intent(context, InboxActivity.class);
          intent.putExtra("loginUserId", loginUserId);
          intent.putExtra("tradeId",String.valueOf(trade.getId()));
          context.startActivity(intent);
          }
        });
     }                        

    return convertView;
   }
 }       

您的取景器class代码:

static class ViewHolder {
       private TextView tradeName;
       private TextView tradeLayout;
       private ImageView tradeImage;
  }

我找到了解决方案,在适配器中创建一个视图持有者并创建一个 setter 以在调用 notifyDataSetChanged()

之前设置 tradeList

这是我的回答

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;
    final Trade trade = tradeList.get(position);
    Log.d("worked",position+": "+trade.getId());

    LayoutInflater layoutInflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {
        convertView = layoutInflater.inflate(R.layout.list_trade, parent, false);
        holder = new ViewHolder();
        holder.tradeName = (TextView) convertView.findViewById(R.id.trade_name);
        holder.tradeLayout = (CardView) convertView.findViewById(R.id.trade_listlayout);
        holder.tradeImage = (ImageView) convertView.findViewById(R.id.trade_icon);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    if (trade != null) {

        holder.tradeName.setText(trade.getNameOwn());
        holder.tradeName.setSelected(true);

        try {
            Picasso.with(context)
                    .load(trade.getImageOwnOne())
                    .error(R.drawable.ic_menu_camera)
                    .resize(200, 200)
                    .into(holder.tradeImage);
        }catch(Exception e){
            holder.tradeImage.setImageResource(R.drawable.ic_menu_camera);
        }
        holder.tradeImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Toast.makeText(context, category.getId()+" "+category.getName(), Toast.LENGTH_LONG).show();
                Intent intent = new Intent(context, DisplayTradeActivity.class);
                Bundle bundle = new Bundle();
                bundle.putParcelable("trade", trade);
                intent.putExtras(bundle);
                context.startActivity(intent);
            }
        });
        holder.tradeLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Toast.makeText(context, category.getId()+" "+category.getName(), Toast.LENGTH_LONG).show();
                Intent intent = new Intent(context, InboxActivity.class);
                intent.putExtra("loginUserId", loginUserId);
                intent.putExtra("tradeId",String.valueOf(trade.getId()));
                context.startActivity(intent);
            }
        });
    }

    return convertView;
}

public void setTradeList(ArrayList<Trade> tl) {
    this.tradeList = tl;
}

static class ViewHolder {
    private TextView tradeName;
    private CardView tradeLayout;
    private ImageView tradeImage;
}