面对Android中Custom ListView每行下的Components中的问题

时间:2014-08-25 06:48:25

标签: android android-listview android-custom-view custom-adapter custom-lists

大家好朋友我有一个自定义列表视图,其中我创建了两个xml用于显示列表视图,第二个用于列表视图中的每一行

我的代码和用户界面的一切都很好,但我的问题是让我们举个例子 当我在列表视图中显示8行并且我在第一行中单击按钮/组件然后自动第5个也被调用意味着onClick事件应用于第1和第5行组件我不知道如何解决这个问题我知道有傻错误,请你帮我提前谢谢

此处是 customAdapter

的代码
public CustomAdapter(Activity a, ArrayList<?> d) {

        /********** Take passed values **********/
        activity = a;
        data = d;


        /*********** Layout inflator to call external xml layout () **********************/
        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    /******** What is the size of Passed Arraylist Size ************/
    public int getCount() {

        if (data.size() <= 0)
            return 1;
        return data.size();
    }

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

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

    @Override
    public int getViewTypeCount() {

        if (getCount() != 0)
            return getCount();

        return 1;
    }

    /********* Create a holder to contain inflated xml file elements ***********/
    public static class ViewHolder {

        public Button btnLike;
        public Button btnVoiceComment;
        public Button btnShare;
        public ImageButton ibMore;
        public ImageButton ibPlayAudio;
        public ImageView ivPostImage;

        public ProgressWheel pw_two;

        public TextView tvLocation, tvListens, tvMessage;

    }

    /*********** Depends upon data size called for each row , Create each ListView row ***********/
    public View getView(final int position, View convertView, ViewGroup parent) {

        View vi = convertView;
        final ViewHolder holder;

        if (convertView == null) {

            /********** Inflate tabitem.xml file for each row ( Defined below ) ************/
            vi = inflater.inflate(R.layout.list_row_new, null);
            holder = new ViewHolder();
            /******** View Holder Object to contain tabitem.xml file elements ************/

            holder.btnLike = (Button) vi.findViewById(R.id.list_row_btn_like);
            holder.btnVoiceComment = (Button) vi
                    .findViewById(R.id.list_row_btn_voicecomment);
            holder.ibMore = (ImageButton) vi
                    .findViewById(R.id.list_row_imgbtn_more);
            holder.btnShare = (Button) vi
                    .findViewById(R.id.list_row_imgbtn_share);

            holder.ivPostImage = (ImageView) vi
                    .findViewById(R.id.list_row_iv_post);

            holder.ibPlayAudio = (ImageButton) vi
                    .findViewById(R.id.list_row_ib_play);

            holder.tvMessage = (TextView) vi.findViewById(R.id.list_row_tv_msg);
            holder.tvListens = (TextView) vi
                    .findViewById(R.id.list_row_tv_listencount);
            holder.tvLocation = (TextView) vi
                    .findViewById(R.id.list_row_tv_city);

            holder.pw_two = (ProgressWheel) vi
                    .findViewById(R.id.progressBarTwo);
            /************ Set holder with LayoutInflater ************/
            vi.setTag(holder);

        } else
            holder = (ViewHolder) vi.getTag();
        if (data.size() <= 0) {
            holder.tvListens.setText("No Data");

        } else {

            // ///////
            tempValues = null;
            tempValues = (ListModel) data.get(position);
            // Toast.makeText(activity, "in else", 100).show();
            /***** Get each Model object from Arraylist ********/

            /************ Set Model values in Holder elements ***********/
            holder.btnLike.setText(tempValues.getlikeCounter());
            holder.btnVoiceComment.setText(tempValues.getvoiceCommentCounter());
            holder.btnShare.setText(tempValues.getShareCounter());
            /******** sSet Item Click Listner for LayoutInflater for each row ***********/
            vi.setOnClickListener(new OnItemClickListener(position));

            holder.btnLike.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {

                    // Toast.makeText(activity, "like clicked", 100).show();

                    View view = (Button) v;
                    ((Button) view).setText(Integer.parseInt(((Button) view)
                            .getText().toString()) + 1 + "");
                }
            });

            holder.btnVoiceComment.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    //
                    // Drawable d = holder.rlBg.getBackground();
                    // Bitmap bitmap = drawableToBitmap(d);
                    // ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    // bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
                    // byte[] b = baos.toByteArray();

                }
            });

            holder.ibMore.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // Toast.makeText(activity, "more clicked", 100).show();
                    PopupMenu popup = new PopupMenu(activity, v);

                    /** Adding menu items to the popumenu */
                    popup.getMenuInflater().inflate(R.menu.main,
                            popup.getMenu());
                    popup.setOnMenuItemClickListener(new OnMenuItemClickListener() {

                        @Override
                        public boolean onMenuItemClick(MenuItem item) {
                            // TODO Auto-generated method stub
                            switch (item.getItemId()) {
                            case R.id.spam:

                                Toast.makeText(activity, "Spam clicked",
                                        Toast.LENGTH_SHORT).show();
                                break;

                            case R.id.blockuser:
                                Toast.makeText(activity, " Block user clicked",
                                        Toast.LENGTH_SHORT).show();
                                break;

                            case R.id.remove:
                                Toast.makeText(activity, "Remove clicked",
                                        Toast.LENGTH_SHORT).show();

                                // RecentFragment rf = new RecentFragment();
                                // rf.onItemClick(position);
                                break;

                            default:
                                break;
                            }

                            return false;
                        }
                    });
                    popup.show();
                }
            });

            holder.btnShare.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // Toast.makeText(activity, "share clicked", 100).show();

                    Intent intent = new Intent(Intent.ACTION_SEND);
                    intent.setType("text/plain");
                    intent.putExtra(android.content.Intent.EXTRA_TEXT,
                            "This message is shared by Nookster application.You clicked on item = "
                                    + position);
                    activity.startActivity(intent);
                }
            });

            holder.ibPlayAudio.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if (isTimerRunning) {// stop button is on
                        timer.cancel();
                        holder.ibPlayAudio
                                .setImageResource(R.drawable.playpost);
                        holder.pw_two.setVisibility(View.GONE);
                        isTimerRunning = false;
                    } else {
                        timer = new CounterClass(10000, TIME_INTERVAL, holder);
                        timer.start();
                        // play button is on
                        holder.ibPlayAudio
                                .setImageResource(R.drawable.stoppost);
                        holder.pw_two.setVisibility(View.VISIBLE);
                        isTimerRunning = true;
                    }
                }
            });

            // ///////
        }
        return vi;
    }

    @Override
    public void onClick(View v) {
        Log.v("CustomAdapter", "=====Row button clicked");
    }

1 个答案:

答案 0 :(得分:0)

更改如下:从final ViewHolder holder;中删除getView() 然后改变这个:

public static class ViewHolder {
    public int pos;
    public Button btnLike;
    public Button btnVoiceComment;
    public Button btnShare;
    public ImageButton ibMore;
    public ImageButton ibPlayAudio;
    public ImageView ivPostImage;

    public ProgressWheel pw_two;

    public TextView tvLocation, tvListens, tvMessage;
    void setPosition(int position){
       this.pos=position;
          }
     int getPosition(){
       return pos;
          }

}      

创建 newView 方法,并从(convertView == null)

中删除代码
void newView(int position, View convertView, ViewGroup parent){
    vi = inflater.inflate(R.layout.list_row_new, null);
    final ViewHolder holder = new ViewHolder();
    /******** View Holder Object to contain tabitem.xml file elements ************/
   holder.setPosition(position);
    holder.btnLike = (Button) vi.findViewById(R.id.list_row_btn_like);
    holder.btnVoiceComment = (Button) vi
            .findViewById(R.id.list_row_btn_voicecomment);
    holder.ibMore = (ImageButton) vi
            .findViewById(R.id.list_row_imgbtn_more);
    holder.btnShare = (Button) vi
            .findViewById(R.id.list_row_imgbtn_share);

    holder.ivPostImage = (ImageView) vi
            .findViewById(R.id.list_row_iv_post);

    holder.ibPlayAudio = (ImageButton) vi
            .findViewById(R.id.list_row_ib_play);

    holder.tvMessage = (TextView) vi.findViewById(R.id.list_row_tv_msg);
    holder.tvListens = (TextView) vi
            .findViewById(R.id.list_row_tv_listencount);
    holder.tvLocation = (TextView) vi
            .findViewById(R.id.list_row_tv_city);

    holder.pw_two = (ProgressWheel) vi
            .findViewById(R.id.progressBarTwo);
    /************ Set holder with LayoutInflater ************/
    vi.setTag(holder);
}  

也要小心改变

if (convertView == null) {

    newView(position,convertview,parent);
}
else{
    if(holder.getPosition()!=position)
        newView(position,convertview,parent);
    else
    holder = (ViewHolder) vi.getTag();

}

其他一切都保持不变。

让我知道它是否有效。