Android - 无法从列表项中增加或减少值

Posted

技术标签:

【中文标题】Android - 无法从列表项中增加或减少值【英文标题】:Android - Unable to increment or decrement value from list item 【发布时间】:2016-05-05 19:56:41 【问题描述】:

大家好,我正在使用自定义列表视图从服务器获取数据并显示在列表视图中。我能够获取数据并在列表视图中显示它,但我不知道在列表项中实现按钮的单击事件。有两个按钮可以增加和减少数量。我的 clicklistener 正在工作,但它的工作方式不正确。请帮我纠正这个问题。我确实在堆栈溢出中搜索了太多帖子但无法理解它......

这是我的适配器类

    private Activity activity;
private LayoutInflater inflater;
private List<FeedItem> feedItems;
private List<FeedItem> filteredfeedItems;
ImageView plus;
ImageView minus;
int qty = 0;

String result;
String formattedDate;
int id;



public FeedListAdapter(Activity activity, List<FeedItem> feedItems) 
    this.activity = activity;
    this.feedItems = feedItems;
    this.filteredfeedItems = feedItems;


@Override
public int getCount() 
    return filteredfeedItems.size();


@Override
public Object getItem(int position) 
    return filteredfeedItems.get(position);


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


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

    if (inflater == null)
        inflater = (LayoutInflater) activity
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null)
        convertView = inflater.inflate(R.layout.feed_item, null);

    FeedItem item = filteredfeedItems.get(position);

    id = item.getId();
    convertView.setTag(Integer.valueOf(id));

    TextView date = (TextView) convertView.findViewById(R.id.name);
    TextView initiator = (TextView) convertView
            .findViewById(R.id.timestamp4);
    TextView assignTo = (TextView) convertView.findViewById(R.id.timestamp);

    final TextView location = (TextView) convertView.findViewById(R.id.timestamp2);

    //TextView category = (TextView) convertView.findViewById(R.id.category);


    data.setText(item.getData();
    price
    .setText(item.getPrice());
    description.setText(item.getDescription());


     plus = (ImageView) convertView.findViewById(R.id.btnAddToCart1);
      plus.setTag(item.getId());
    plus.setOnClickListener(new View.OnClickListener() 
        public void onClick(View view) 
            int position = (Integer) view.getTag();


            //convertView.setTag(Integer.valueOf(id));
            FeedItem item = filteredfeedItems.get(position);
            item.quantity++;
            location.setText(String.valueOf(item.quantity));

        
    );


     minus = (ImageView) convertView.findViewById(R.id.btnAddToCart5);
    minus.setOnClickListener(new View.OnClickListener() 
        public void onClick(View view) 

             Integer taggedPosition = (Integer) view.getTag();
    if (qty>0)
        //minus.setImageResource(R.drawable.minus_pressed);
            qty--;
            location.setText(String.valueOf(qty));
    

    else

        qty = 0;
    
        
    );

    return convertView;

这是我的 FeedItem 类:

public class FeedItem 

 int quantity = 0;
 int id;


public FeedItem(int id,int quantity)
    super();
    this.id = id;
    this.quantity = quantity;



public int getId() 
    return id;


public void setId(int id) 
    this.id = id;




 public int getQuantity() 
        return quantity;
    

    public void setQuantity(int quantity) 
        this.quantity = quantity;
    

【问题讨论】:

它以什么“方式”工作?什么是“正确的方式”? 因为我已经在全局范围内声明了这个值,所以它也会增加并显示在其他列表项中。我不知道如何创建接口或使用 arraylist 以便只更新特定的列表项值。 以上代码中的datapricedescription是什么? 【参考方案1】:

最后我自己解决了我的答案。只需要实现接口并在片段类中调用..

更新的适配器类

public class FeedListAdapter extends RecyclerView.Adapter<FeedListAdapter.ViewHolder> 
private Activity activity;
private LayoutInflater inflater;
private List<FeedItem> feedItems;
private List<FeedItem> filteredfeedItems;
ImageView plus;
ImageView minus;
String result;
String formattedDate;
int id;
 private View.OnClickListener onAddNum;
 private View.OnClickListener onSubNum;

public FeedListAdapter(Activity activity, List<FeedItem> feedItems)
       this.activity = activity;
    this.feedItems = feedItems;
    this.filteredfeedItems = feedItems;

    inflater = ( LayoutInflater )activity.
            getSystemService(Context.LAYOUT_INFLATER_SERVICE);


// create interface method

  public void setOnAddNum(View.OnClickListener onAddNum) 
        this.onAddNum = onAddNum;
    
    public void setOnSubNum(View.OnClickListener onSubNum)
        this.onSubNum = onSubNum;
    

  @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.feed_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    
  @Override
    public void onBindViewHolder(final ViewHolder holder, int position) 

      FeedItem item =(FeedItem)filteredfeedItems.get(position);
         holder.date.setText(item.getObservation());
         holder.initiator
            .setText(item.getObservation());
            holder.location.setText(String.valueOf(item.getNum())+"");
         holder.assignTo.setText(item.getSummary());

 // set tag to know which button you clicked'

         holder.plus.setTag(position);
         holder.plus.setFocusable(true);
         holder.plus.setClickable(true);

 //  set callback interface  ,  

         holder.plus.setOnClickListener(onAddNum);
         holder.minus.setTag(position);
         holder.minus.setOnClickListener(onSubNum);

  
  @Override
    public int getItemCount() 
        return filteredfeedItems.size();
    

  public long getItemId(int position) 
    return position;

  

    class ViewHolder extends RecyclerView.ViewHolder

         ImageView plus;
         ImageView minus;
         TextView date;
         TextView initiator;
         TextView assignTo;
         TextView location;
        public ViewHolder(View vi) 
            super(vi);

           date = (TextView) vi.findViewById(R.id.name);
           initiator = (TextView) vi
                    .findViewById(R.id.timestamp4);
           assignTo = (TextView) vi.findViewById(R.id.timestamp);

           location = (TextView) vi.findViewById(R.id.timestamp2);
           plus = (ImageView) vi.findViewById(R.id.btnAddToCart1);

           minus = (ImageView) vi.findViewById(R.id.btnAddToCart5);

        
    
 

现在在活动类中为按钮事件实现 View.OnClickListener。

public class MyFragment extends Fragment implements View.OnClickListener

 @Override
public void onClick(View view) 
    Object tag = view.getTag();
    switch (view.getId())
        case R.id.item_btn_add: //  click add buttons number  ,  performs corresponding processing  

 if (tag != null && tag instanceof Integer) 

                 int position = (Integer) tag;
            Your pojo class  

      int num =feedItems.get(position).getNum();
         num++;
      feedItems.get(position).setNum(num);
       adapter.notifyDataSetChanged();
  
     break;

   case R.id.btnAddToCart5:
       if (tag != null && tag instanceof Integer) 

           int position = (Integer) tag;
           int num =feedItems.get(position).getNum();

       if (num>0) 
           num--;
           feedItems.get(position).setNum(num);
           listAdapter.notifyDataSetChanged();
       

       else
            num= 0;
            listAdapter.notifyDataSetChanged();
        

       
       break;
     

享受编码

【讨论】:

【参考方案2】:

目前,每个活动都有 1 个变量来存储数量。如果您想按项目存储它,您应该添加:int qty; 成为FeedItem 类的成员。

删除:

convertView.setTag(Integer.valueOf(id));

与 plus 类似,您需要添加:

minus.setTag(item.getId());

然后你需要使用item.qty,而不是qty++;,或者基本上在onClick的每个地方而不是qty

Integer id = view.getTag();
FeedItem item = filteredfeedItems.get(id);
item.qty++;
location.setText(String.valueOf(item.qty));

更新:

我认为您将 FeedItem.id 与位置混合在一起。如果您不更改列表中项目的顺序/数量,那么您可以始终使用位置。而不是:

minus.setTag(item.getId());

尝试:

minus.setTag(position);

加号也一样

【讨论】:

好的,我将作为成员添加.. 请您写一点代码,以便我理解。我是 android 新手,对我来说这些东西有点奇怪.. 谢谢。 如果我使用整数 id = view.getTag();该应用程序正在崩溃,如果我没有使用该行,那么它的工作但其他列表值也在更新..我也使用了 notifyDataSetChanged() 但没有工作。 试试:Integer id = view.getParent().getTag(); 我试过了,但现在的问题是我的项目位置错误..像 o,1,2,5,7 等等..其他位置值也在更新..如果你想要我可以更新我的适配器代码。 我希望我是对的:+ 有效,但是 - 不是吗?查看我的最新更新【参考方案3】:

像这样创建一个 MyListItem 类:

public class MyListItem

private int qty;
private int itemId;
public void setQty(int qty)

this.qty=qty;


public void setQty(int qty)

this.qty=qty;


public int getItemId()

return this.itemId;

public int getQty()

return this.qty;

public MyListItem(int qty,int itemId)

this.qty=qty;
this.itemId=itemId;



当您加载项目时,将所有项目初始化为 MyListItem

你的听众应该改变对象的数量值。 现在制作一个 MyListItem 的数组列表 NOT AN ARRAY 因为你不知道你当时有多少项目

希望对你有所帮助

【讨论】:

以上是关于Android - 无法从列表项中增加或减少值的主要内容,如果未能解决你的问题,请参考以下文章

Android 从 ListView 项中提取特定值

Android Studio - Gradle 实现 (...) exclude ... 不起作用(无法从依赖项中排除组)

使 2 个文本值显示在 1 个列表项中

从com.google.android.gms.vision.CameraSource访问相机并增加/减少预览亮度

Python:如何从列表项中删除单引号

使用 C# 在列表项中搜索