【问题标题】:ListView not follow order to display after notifyDataSetChanged在 notifyDataSetChanged 后 ListView 不按照顺序显示
【发布时间】:2017-10-23 16:58:48
【问题描述】:

我不知道为什么在我更新我的活动中的数据后,我的 listview 输出总是以错误的顺序排列。

这就是我在我的活动中初始化适配器的方式

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;
}
}

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

【问题讨论】:

  • 出了什么问题?只是名称还是两者,名称和图标?
  • @W0rmH0le 以随机顺序显示列表视图。例如,第一次显示 1,2,3。然后我再次运行,它会显示2,3,1等等

标签: android listview adapter android-arrayadapter android-adapter


【解决方案1】:

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

也不需要重写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;
   }
 }       

您的查看器类代码:

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

【讨论】:

  • 如何初始化mInflater?
  • 即使我使用 ViewHolder 设计,listview 也以随机顺序显示
【解决方案2】:

我找到了解决方案,在适配器中创建一个视图持有者,并在调用 notifyDataSetChanged() 之前创建一个 setter 来设置 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-08
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2014-09-30
    相关资源
    最近更新 更多