android - 单击按钮在列表项的 TextView 中设置文本

标签 android listview android-listview listviewitem

我创建了一个 ListView ,如图所示。链接:

Image

问题:如果用户点击按钮 +,我希望或 -当前显示的 TextView 0相应地增加或减少。但是,如果我单击第一个项目的按钮,则 TextView 会在其他行中更新。我不知道如何实现这个。

代码如下:

public class HomePage extends Fragment {

    String[] listitems;
    int[] images = { R.drawable.cadburysilk, R.drawable.cadburys_dairymilk,
            R.drawable.perk, R.drawable.kitkat,
            R.drawable.nestlemunchchocolate, R.drawable.cadbury_bournville_bar,
            R.drawable.snickers };
    ListView list;
    DBAdapter dbadapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        View rootview = inflater.inflate(R.layout.activity_home_page,
                container, false);
        View view = View.inflate(getActivity(), R.layout.headerview, null);

        Resources res = getResources();
        listitems = res.getStringArray(R.array.items);
        list = (ListView) rootview.findViewById(R.id.itemslist);
        list.addHeaderView(view);
        AdapterClass adapterClass = new AdapterClass(this.getActivity(),
                listitems, images);
        list.setAdapter(adapterClass);
        return rootview;
    }

}

class AdapterClass extends ArrayAdapter<String> {
    Context context;
    int[] images;
    String[] names;
    Button add, sub;
    TextView number;
    Integer count=0;

    static class ViewHolder {
        public TextView textView;
        public ImageView imageView;

    }

    public AdapterClass(Context c, String[] items, int imgs[]) {
        // TODO Auto-generated constructor stub
        super(c, R.layout.rowlayout, R.id.quantity, items);
        this.context = c;
        this.images = imgs;
        this.names = items;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View row = convertView;
        // reuse views

        if (row == null) {

            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.rowlayout, parent, false);
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.imageView = (ImageView) row.findViewById(R.id.img);
            viewHolder.textView = (TextView) row.findViewById(R.id.textView1);
            add = (Button) row.findViewById(R.id.button1);
            add.setTag(position);
            sub = (Button) row.findViewById(R.id.button2);
            sub.setTag(position);
            number = (TextView)row.findViewById(R.id.quantity);

            row.setTag(viewHolder);
        }
        ViewHolder holder = (ViewHolder) row.getTag();
        holder.imageView.setImageResource(images[position]);
        holder.textView.setText(names[position]);
        add.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                count=count+1;
                number.setText(count.toString());
            }
        });

        sub.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                count=count-1;
                number.setText(count.toString());
            }
        });
        return row;
    }



}

请帮忙。我还需要帮助,了解如何在下一个 Activity 或 fragment 中显示其 TextView 包含正数的项目。

最佳答案

我写了一篇短文 demo for my answer which you can see here .

例子:

准备就绪后,您可以使用数据源(不是适配器,也不是 ListView )来查找数量 > 0 的产品。

    public List<Product> getBasket() {
        List<Product> basket = new ArrayList<>();
        for (Product product : productList) {
            if (product.quantity > 0) {
                basket.add(product);
            }
        }
        return basket;
    }

您的适配器只有一项工作:创建 View /将 View 绑定(bind)到数据,它不需要做更多的事情。


没有演示的初始答案:

如果您直接更新项目 View ,您将无法在以后获取所有具有正数的项目,因为这些更新的值仅存储在 View 中,而不是在您可以迭代的某些数据结构中结束

这就是为什么您不应该直接更新项目 View ,而是在单击加号/减号按钮时使用回调、修改基础数据集并调用 adapter.notifyDatasetChanged( ) 再次更新 ListView/RecyclerView。

将回调传递给您的适配器:

public interface ItemInteraction {
    void onPlusButtonClick(long id);
    void onMinusButtonClick(long id);
}

您可以通过将其设置为相关 View 上点击监听器的回调来使用它。 ID 可以是任何内容,只要它可以唯一标识 ListView 行所表示的数据项即可。

final long id = item.getId();
plusButtonView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick() {
        callback.onPlusButtonClick(id);
    }
});

在这个类似的问题中给出了一个例子,其中 OP 想要显示或隐藏歌曲列表的星号(表示最喜欢的)here .

Another explanation适配器类 View 的设计用途。

关于android - 单击按钮在列表项的 TextView 中设置文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31299911/

相关文章:

android - 在 flutter 形式的 sqlite 数据库的 ListView 中加载 7000 多个项目的内存有效方法是什么

java - 将 Shift_JIS 格式转换为 UTF-8 格式

android - 如何在不阻塞android中的ui的情况下等待多个线程完成?

android - SearchView Edittext 不显示光标

c# - 以编程方式更改选择器的 ListView 样式

android - ListView 中的自定义过滤 ArrayAdapter

android - 如何在sqlite数据库中存储微调按钮的值

html - 如何摆脱 jQuery Mobile Listview 缩略图下的空白

android - 无法在新 Activity 中传递对象数组

android - 跳过了 60 帧!应用程序可能在其主线程上做了太多工作