【问题标题】:Viewholder How to correctly update viewsViewholder 如何正确更新视图
【发布时间】:2018-07-18 15:18:49
【问题描述】:

我正在尝试使用对话框更新列表视图。但是当我在对话框中输入数量时,它会显示在列表视图中,但是当我滚动列表视图时,其他行也会更新。我只想更新我点击的行。

下面是我的适配器代码。 有人请帮助我。非常感谢。

 public class MyAppAdapter extends BaseAdapter {

    public class ViewHolder {
        TextView productid, productname, pcs, cs;
        ImageView dist;
    }

    public List<Product_List> parkingList;

    public Context context;
    ArrayList<Product_List> arrayList;

    private MyAppAdapter(List<Product_List> apps, Context context) {
        this.parkingList = apps;
        this.context = context;
        arrayList = new ArrayList<Product_List>();
        arrayList.addAll(parkingList);
    }

    @Override
    public int getCount() {
        return parkingList.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

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

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

        View rowView = convertView;
        final MyAppAdapter.ViewHolder viewHolder;
        if (rowView == null) {
            LayoutInflater inflater = getLayoutInflater();
            rowView = inflater.inflate(R.layout.productlist, parent, false);
            viewHolder = new MyAppAdapter.ViewHolder();
            viewHolder.productid = (TextView) rowView.findViewById(R.id.productid);
            viewHolder.productname = (TextView) rowView.findViewById(R.id.productname);
            viewHolder.pcs = (TextView) rowView.findViewById(R.id.pcs);
            viewHolder.cs = (TextView) rowView.findViewById(R.id.cs);
            viewHolder.dist = (ImageView) rowView.findViewById(R.id.dist);
            rowView.setTag(viewHolder);
        } else {
            viewHolder = (MyAppAdapter.ViewHolder) convertView.getTag();
        }

        viewHolder.productid.setText(parkingList.get(position).getInvtID() + "");
        viewHolder.productname.setText(parkingList.get(position).getDescr() + "");

        final String a = viewHolder.productid.getText().toString();
        final String b = viewHolder.productname.getText().toString();

        if ( position % 2 == 0) {
            rowView.setBackgroundColor(Color.parseColor("#FFFFFF"));
        } else {
            rowView.setBackgroundColor(Color.parseColor("#ECEAEA"));
        }

        rowView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                final Dialog dialog = new Dialog(InventoryChecking1.this);
                dialog.setTitle("Inventory Checking");
                dialog.setContentView(R.layout.inventory);
                final TextView productids = (TextView) dialog.findViewById(R.id.productids);
                productids.setText(a);
                final TextView productdesc = (TextView) dialog.findViewById(R.id.productdesc);
                productdesc.setText(b);
                final EditText pcss = (EditText) dialog.findViewById(R.id.pcss);
                final EditText css = (EditText) dialog.findViewById(R.id.css);
                final RadioButton btnyes = (RadioButton) dialog.findViewById(R.id.btnyes);
                final RadioButton btnno = (RadioButton) dialog.findViewById(R.id.btnno);
                btnno.setChecked(true);
                Button btnsave = (Button) dialog.findViewById(R.id.btnsave);
                btnsave.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        viewHolder.pcs.setText(pcss.getText().toString());

                        viewHolder.cs.setText(css.getText().toString());

                        if (btnyes.isChecked()) {
                            viewHolder.dist.setImageResource(R.drawable.done);
                        } else {
                            viewHolder.dist.setImageResource(R.drawable.no);
                        }

                        dialog.dismiss();
                    }
                });
                dialog.show();
            }
        });

        return rowView;
    }
}

【问题讨论】:

  • 我们正处于 RecycleView 的时代。所以用它来代替 listview。
  • @dhams 同意。使用RecycleView 是最好的方法
  • 如果你使用RecyclerView你可以使用其适配器的notifyItemChanged()
  • 永远不要在 ListView 中使用视图来存储值/字符串,因为它们会在您滚动时丢失/回收。你应该自己存储这些值。尝试初始化数组以存储您的 cs(int)、pcs(int) 和 dist(boolean)。然后在 getView() 中,使用 if-else 将这些视图设置为 setText/setImageResource。在 OnClick() 中,您只需将这些值设置到数组中的相应位置,然后调用 notifyDataSetChanged()。我在这里的回答可能会有所帮助:stackoverflow.com/questions/48552869/…

标签: java android android-adapter


【解决方案1】:

您应该致电notifyDataSetChanged ()

通知附加的观察者基础数据已被 发生变化,任何反映数据集的视图都应自行刷新。

演示

tnsave.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                       // Your work        
                       notifyDataSetChanged() 
                    }
                });

仅供参考

如果您使用 RecyclerView,这将是一个好方法。

【讨论】:

  • 我试过了,但当我滚动列表视图时仍然相同,其他行也更新了,但我只想要我点击更新的行。不过谢谢你帮忙
  • @KaiJie 你应该加setOnClickListener部分
  • 添加还是一样的:(
  • @IntelliJAmiya 问题是只更新他在列表视图中单击的行。但是 listview 不提供只更新一个项目的方法。
  • @KaiJie 使用RecyclerView
【解决方案2】:

在您调用适配器的班级中, 如下设置。

myAppAdapter = new MyAppAdapter();

imagegrid.setAdapter(myAppAdapter);

//imagegrid is a gridview where i need to set the adapter

希望对您有所帮助。

【讨论】:

  • myAppAdapter = new MyAppAdapter(itemsArrayList, InventoryChecking1.this); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); listView.setAdapter(myAppAdapter);
  • 这是我的适配器,我无法添加 imagegrid
  • 我的意思是你必须用你的列表视图对象替换那个“imagegrid”
  • 如果你添加一些图像或进一步澄清会更好,这样会鼓励有人准确回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 2015-06-26
  • 2022-06-11
相关资源
最近更新 更多