【问题标题】:button click inside listview item mixing up action on items按钮单击列表视图项目内部混合对项目的操作
【发布时间】:2014-11-14 05:29:22
【问题描述】:

我有一个带有按钮的列表视图。当我单击按钮时,我希望为整个项目设置一个 alpha 值并更改按钮的文本。基本功能(设置 alpha 值和按钮文本更改的项目)有效,但多个列表项因此获得相同的效果。我也尝试在stackoverflow中阅读很多关于此的帖子,但对我没有用。我真的尝试了很多,请帮助。

我的适配器代码如下:

public class CustomAdapter extends BaseAdapter {
    private LayoutInflater mInflater;  
    Context context;
    ArrayList<CustomModel> rowItem;
    String status = "strike";

CustomAdapter(Context context, ArrayList<CustomModel> rowItem) {
    this.mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.context = context;
    this.rowItem = rowItem;
}

@Override
public int getCount() {

    return rowItem.size();
}

@Override
public Object getItem(int position) {

    return rowItem.get(position);
}

@Override
public long getItemId(int position) {

    return rowItem.indexOf(getItem(position));
}

@Override
public View getView(int position, View vi, ViewGroup parent) {
    //View vi = convertView; // trying to reuse a recycled view
    final ViewHolder holder;
    if (vi == null) {
        // The view is not a recycled one: we have to inflate

        vi = mInflater.inflate(R.layout.order_item, null);
        holder = new ViewHolder();
        holder.rm = rowItem.get(position);
        holder.rootLayout = (LinearLayout) vi.findViewById(R.id.root_Layout);
        holder.tv_name = (TextView) vi.findViewById(R.id.item_name);
        holder.tv_quantity = (TextView) vi.findViewById(R.id.item_qty);
        holder.tv_price = (TextView) vi.findViewById(R.id.item_price);
        holder.tv_rate = (TextView) vi.findViewById(R.id.item_rate);

        holder.layout1 = (LinearLayout) vi.findViewById(R.id.layout1);
        holder.layout2 = (LinearLayout) vi.findViewById(R.id.layout2);
        holder.layout3 = (LinearLayout) vi.findViewById(R.id.layout3);
        holder.layout4 = (LinearLayout) vi.findViewById(R.id.layout4);

        holder.tv_prefs = (TextView) vi.findViewById(R.id.pref_name);
        holder.baseLayout = (LinearLayout) vi
                .findViewById(R.id.base_layout);
        holder.strikeoff = (Button) vi.findViewById(R.id.item_strike);

        holder.status = "strike";


        vi.setTag(holder);
    } else {
        holder = (ViewHolder) vi.getTag();
    }

    //holder.strikeoff.setTag(holder);
    holder.strikeoff.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //@SuppressWarnings("unused")
            //ViewHolder holder = (ViewHolder) v.getTag();
            if (holder.status.equals("strike")) {
                holder.tv_rate.setPaintFlags(holder.tv_rate.getPaintFlags()
                        | Paint.STRIKE_THRU_TEXT_FLAG);
                holder.tv_price.setPaintFlags(holder.tv_rate.getPaintFlags()
                        | Paint.STRIKE_THRU_TEXT_FLAG);

                holder.layout1.setAlpha(.25f);
                holder.layout2.setAlpha(.25f);
                holder.layout3.setAlpha(.25f);
                holder.layout4.setAlpha(.25f);
                holder.tv_name.setAlpha(.25f);

                holder.strikeoff.setText("Undo");
                holder.status = "undo";
            }
        }
    });
    if (rowItem != null || !rowItem.isEmpty() || rowItem.size() != 0) {

        holder.tv_name.setText(rowItem.get(position).getItemName());
        holder.tv_quantity.setText(rowItem.get(position).getItemQuantity());
        holder.tv_price.setText("Price: "
                + rowItem.get(position).getItemPrice());
        holder.tv_rate.setText("Rate :"
                + rowItem.get(position).getItemRate());
        if (!rowItem.get(position).getPrefName().equals("Nil")) {
            holder.tv_prefs.setText(rowItem.get(position).getPrefName());
        }


        // Alternate colour for rows in listview
        if (position % 2 == 0) {
            holder.baseLayout.setBackgroundColor(Color.WHITE);

        } else {
            holder.baseLayout.setBackgroundColor(Color
                    .parseColor("#ededed"));

        }

    }

    return vi;
}

class strikeButtonClickListener implements OnClickListener {
    int position;
    ViewHolder holder;

    public strikeButtonClickListener(int pos, ViewHolder holder) {
        this.position = pos;
        this.holder = holder;
    }

    public void onClick(View v) {

        if (holder.status.equals("strike")) {
            holder.tv_rate.setPaintFlags(holder.tv_rate.getPaintFlags()
                    | Paint.STRIKE_THRU_TEXT_FLAG);
            holder.tv_price.setPaintFlags(holder.tv_rate.getPaintFlags()
                    | Paint.STRIKE_THRU_TEXT_FLAG);

            holder.layout1.setAlpha(.25f);
            holder.layout2.setAlpha(.25f);
            holder.layout3.setAlpha(.25f);
            holder.layout4.setAlpha(.25f);
            holder.tv_name.setAlpha(.25f);

            holder.strikeoff.setText("Undo");
            holder.status = "undo";
        } else {
            holder.tv_rate.setPaintFlags(holder.tv_rate.getPaintFlags()
                    & (~Paint.STRIKE_THRU_TEXT_FLAG));
            holder.tv_price.setPaintFlags(holder.tv_rate.getPaintFlags()
                    & (~Paint.STRIKE_THRU_TEXT_FLAG));

            holder.layout1.setAlpha(1f);
            holder.layout2.setAlpha(1f);
            holder.layout3.setAlpha(1f);
            holder.layout4.setAlpha(1f);
            holder.tv_name.setAlpha(1f);

            holder.strikeoff.setText("Strike off");
            holder.status = "strike";
        }

    }
}

static class ViewHolder {
    CustomModel rm;
    Button strikeoff;
    View strikeview;
    TextView tv_name, tv_quantity, tv_price, tv_rate, tv_prefs, ratetxt,
            pricetxt;
    LinearLayout baseLayout, rootLayout, layout1, layout2, layout3,
            layout4;
    FrameLayout frameLayout;
    ViewGroup vg;
    String status = "strike";
}

}

【问题讨论】:

  • 请参考this答案。您必须在 CustomModel 类中创建自己的变量才能使其工作。
  • @DroidDev 你能帮我编辑我的代码吗,因为我不知道。非常感谢您提供帮助。
  • @SweetWisherツ 也谢谢你。但我想不通。

标签: android listview android-listview custom-adapter android-viewholder


【解决方案1】:

尝试在CustomModel 类上添加一个字符串状态标志并将该标志设置为默认值:

public class CustomModel {
    private String status = "strike";

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }
}

现在尝试在点击发生时反向更改状态值并通知adapter

holder.strikeoff.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
       if(rowItem.get(position).getStatus().equals("strike")){
         rowItem.get(position).setStatus("undo");
       }else{
         rowItem.get(position).setStatus("strike");
       }
       notifyDataSetChanged();
    }
}

根据getView() 中的状态更改列表项 alpha 和文本值:

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

       if(rowItem.get(position).getStatus().equals("strike")){
            holder.tv_rate.setPaintFlags(holder.tv_rate.getPaintFlags()
                    | Paint.STRIKE_THRU_TEXT_FLAG);
            holder.tv_price.setPaintFlags(holder.tv_rate.getPaintFlags()
                    | Paint.STRIKE_THRU_TEXT_FLAG);

            holder.layout1.setAlpha(.25f);
            holder.layout2.setAlpha(.25f);
            holder.layout3.setAlpha(.25f);
            holder.layout4.setAlpha(.25f);
            holder.tv_name.setAlpha(.25f);

            holder.strikeoff.setText("Undo");
        } else {
            holder.tv_rate.setPaintFlags(holder.tv_rate.getPaintFlags()
                    & (~Paint.STRIKE_THRU_TEXT_FLAG));
            holder.tv_price.setPaintFlags(holder.tv_rate.getPaintFlags()
                    & (~Paint.STRIKE_THRU_TEXT_FLAG));

            holder.layout1.setAlpha(1f);
            holder.layout2.setAlpha(1f);
            holder.layout3.setAlpha(1f);
            holder.layout4.setAlpha(1f);
            holder.tv_name.setAlpha(1f);

            holder.strikeoff.setText("Strike off");
        }


        return vi;
    }

【讨论】:

    【解决方案2】:

    使用 SetTag getTag 就像...

        public class Audio_Post_Adapter extends BaseAdapter {
    Context mContext;
    ArrayList<String> mSampalList;
    Holder mHolder;
    LayoutInflater inflater;
    
    public Audio_Post_Adapter(Context mContext) {
        // TODO Auto-generated constructor stub
        inflater = LayoutInflater.from(mContext);
        this.mContext = mContext;
        this.mSampalList = mSampalList;
    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 5;
    }
    
    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return mSampalList.get(arg0);
    }
    
    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }
    
    @Override
    public View getView(int position, View convertview, ViewGroup parent) {
        // TODO Auto-generated method stub
        View view = convertview;
        if(view == null){
    
            view = LayoutInflater.from(mContext).inflate(
                    R.layout.view_audio, null,false);
            mHolder = new Holder();
    
            mHolder.mLn_main_audio = (LinearLayout) view.findViewById(R.id.mLn_main_audio);
            mHolder.mImg_profile_user =  (CustomNetworkImageView) view.findViewById(R.id.mImg_profile_user);
    
            view.setTag(mHolder);
    
        }else{
    
            mHolder = (Holder) view.getTag();
        }
        mHolder.mImg_profile_user.setTag(position);
        mHolder.mImg_profile_user.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                int index = (Integer) v.getTag();
                //What ever list is take the data from it using this index
                String data = mSampalList.get(index);
            }
        });
        return view;
    }
    
    public class Holder{
        private LinearLayout mLn_main_audio;
        private CustomNetworkImageView mImg_profile_user,mImg_post_img;
    
    }
    
    
       }
    

    【讨论】:

    • 我这样做了,但在那之后我能做什么。如果您有任何全面的想法,请分享。无论如何,谢谢。
    • 在单击后使用索引作为您的位置。在自定义适配器的 getview() 方法中执行此操作。尝试一下。
    • 因为我是 android 新手,能否请你拿我的代码并在其中编辑以显示一个示例,我真的不知道它。
    猜你喜欢
    • 2021-04-13
    • 2020-07-26
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多