Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-无法从列表项中增加或减少值_Android_Listview_Baseadapter - Fatal编程技术网

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

Android-无法从列表项中增加或减少值,android,listview,baseadapter,Android,Listview,Baseadapter,大家好,我正在使用自定义listview从服务器获取数据并在listview中显示。。我能够获取数据并在listview中显示,但我不知道如何在listitem中实现按钮的单击事件。有两个按钮可增加和减少数量。我的clicklistener正在工作,但工作方式不正确。请帮我纠正这个问题。我确实在stack overflow中搜索了太多帖子,但无法理解 这是我的适配器类 private Activity activity; private LayoutInflater inflater;

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

这是我的适配器类

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

        }
    }
} 

当前,每个活动有一个变量来存储数量。如果要按项目存储,应添加:
int qty成为
FeedItem
类的成员

删除:

convertView.setTag(Integer.valueOf(id));
与plus类似,您需要添加:

minus.setTag(item.getId());
然后代替
qty++
或基本上在onClick中的每个位置,而不是
数量
,您需要使用
项目。数量

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

我想你把FeedItem.id和position混在一起了。如果您没有更改列表中项目的顺序/数量,那么您可以始终使用position。而不是:

minus.setTag(item.getId());
尝试:


plus也是一样,将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
制作一个数组列表,而不是一个数组,因为您不知道当时有多少项


希望这些帮助

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

更新的适配器类

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

        }
    }
} 

享受编码的乐趣

它以什么“方式”工作?什么是“正确的方式”?正如我在全局范围内声明的值,它会增加并显示在其他列表项中。我不知道如何创建接口或使用arraylist,以便只更新特定的列表项值。上面代码中的
数据
价格
说明
是什么?好的,我将作为成员添加它。。请你写一段代码让我能理解好吗。我是android新手,对我来说,这些东西有点奇怪。。谢谢。如果我使用的是Integer id=view.getTag();应用程序正在崩溃,如果我没有使用该行,则其工作正常,但其他列表值也在更新。。我也使用了notifyDataSetChanged(),但不起作用我尝试过这个,但现在的问题是我得到了错误的项目位置。。比如o,1,2,5,7等等。。其他位置值也正在更新。。如果你想,我可以更新我的适配器代码。我希望我是对的:+可以工作,但是-不能?查看我的最新更新
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;
     }