Проблема с компонентами в каждой строке CustomListView в Android

Привет, друзья, у меня есть одно пользовательское представление списка, в котором я создал два 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");
    }

person Community    schedule 25.08.2014    source источник
comment
добавить сообщение журнала Log.i (convertview, создано новое представление) в if (convertView == null) {} и проверить, сколько раз журнал печатается?   -  person Piyush Kukadiya    schedule 25.08.2014
comment
@Piyush на начальном уровне 3 раза, а когда я прокручивал, то в 4-й раз он печатался   -  person    schedule 25.08.2014
comment
просто для проверки вырежьте весь код из if (convertView == null) {} и вставьте за его пределы, затем закомментируйте if (convertView == null) {} elseholder = (ViewHolder) vi.getTag(); часть и запустить.Проверить, что происходит?   -  person Piyush Kukadiya    schedule 25.08.2014
comment
Хорошо позвольте мне проверить........   -  person    schedule 25.08.2014
comment
эй, брат, я сделал в соответствии с твоим предложением, я прокомментировал, если еще часть, и она работает, но теперь я сталкиваюсь с другой проблемой, когда я прокручиваю представление списка.   -  person    schedule 25.08.2014
comment
Вы хотите сказать, что при прокрутке одни и те же строки повторяются, а новые строки не появляются?   -  person Piyush Kukadiya    schedule 25.08.2014
comment
когда я прокручивал, я получаю тот же вид списка, который я получил начальным, я имею в виду, когда вызывается onCreate, и начальный вид списка выглядит так, как будто я имею в виду, что представление списка снова инициализируется, я надеюсь, вы понимаете, что я хочу сказать   -  person    schedule 25.08.2014
comment
Но вы правильно получаете все строки? отредактируйте свой предыдущий комментарий, чтобы обсудить сейчас   -  person Piyush Kukadiya    schedule 25.08.2014
comment
правильное получение всех строк, но это начинает новую проблему с моим просмотром списка, его утомление :( возникает проблема с прокруткой :(   -  person    schedule 25.08.2014


Ответы (1)


Измените следующим образом: удалите 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 и удалите код из if (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();

}

все остальное остается прежним.

Дайте мне знать, если это работает.

person Piyush Kukadiya    schedule 25.08.2014
comment
я пытался, но не работает, даже если он выдает нулевой указатель в getView - person ; 25.08.2014
comment
у меня есть один запрос, который вы создали методом newView, но если вы видите, что вы вызвали его из двух мест, первый с его членом, а второй пуст, но мы создали функцию с членами, так что вы уверены, что пустой правильный? - person ; 25.08.2014
comment
ой, извините, я пропустил это. Это с тремя параметрами. В какой строке вы получаете нулевой указатель? - person Piyush Kukadiya; 25.08.2014
comment
вы столкнулись с этой проблемой, потому что вы получаете convertview!=null после некоторых строк списка. проверьте это stackoverflow.com/questions/18323803/ - person Piyush Kukadiya; 25.08.2014
comment
08-25 14:01:24.105: E/AndroidRuntime(11667): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: main 08-25 14:01:24.105: E/AndroidRuntime(11667): Процесс: com.android.nookster, PID: 11667 08-25 14:01:24.105: E/AndroidRuntime(11667): java.lang.NullPointerException 08-25 14:01:24.105: E/AndroidRuntime(11667): в com.android.nookster.customlistview.CustomAdapter.getView(CustomAdapter.java :191) - person ; 25.08.2014
comment
строка в CustomAdapter.java:191 - person Piyush Kukadiya; 25.08.2014