簡體   English   中英

Recycler視圖onBindViewHolder重復了一個奇怪的模式

[英]Recycler view onBindViewHolder is repeating a weird pattern

我正在使用一個具有滑動選項以靜音或鎖定對話的消息傳遞應用程序,當我們按下靜音或鎖定按鈕時,Recycler視圖項上會顯示小圖標,但是當我嘗試靜音甚至鎖定某些消息時,它會顯示圖標,但每10個計數后圖標也會出現在元素上。

例如,如果我將消息鎖定在位置1,則位置12的元素也顯示相同的圖標,如果我從第一個位置刪除了該圖標,則從后面的位置也刪除了該圖標。 任何幫助將不勝感激,因為我是Android開發的新手,並且仍在嘗試學習。

圖片:

在此處輸入圖片說明

回收者查看項目xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<com.daimajia.swipe.SwipeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="80dp"
    android:id="@+id/sample1"
    >
    <!-- Bottom View Start-->

    <LinearLayout
        android:id="@+id/leftWrapper"
        android:layout_width="120dp"
        android:weightSum="1"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <LinearLayout
            android:background="#365cf5"
            android:layout_width="60dp"
            android:weightSum="1"
            android:layout_height="match_parent"
            android:id="@+id/panelArchieve"
            android:orientation="horizontal">
            <ImageView
                android:id="@+id/archieve"
                android:src="@drawable/archieve"
                android:layout_width="25dp"
                android:layout_height="25dp"
                android:layout_marginLeft="18dp"
                android:layout_marginTop="27dp"/>

        </LinearLayout>

        <LinearLayout
            android:background="#d20909"
            android:id="@+id/bottom_wrapper"
            android:layout_width="60dp"
            android:weightSum="1"
            android:layout_height="match_parent"
            android:orientation="horizontal">
            <ImageView
                android:id="@+id/trash"
                android:src="@drawable/trash"
                android:layout_width="25dp"
                android:layout_height="25dp"
                android:layout_marginLeft="18dp"
                android:layout_marginTop="27dp"/>

        </LinearLayout>


    </LinearLayout>


    <LinearLayout
        android:id="@+id/bottom_wrapper_2"
        android:layout_width="120dp"
        android:weightSum="1"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        <LinearLayout
            android:background="#365dea"
            android:layout_width="60dp"
            android:weightSum="1"
            android:layout_height="match_parent"
            android:id="@+id/panelLock"
            android:orientation="horizontal">
            <ImageView
                android:id="@+id/lock"
                android:src="@drawable/lock"
                android:layout_width="25dp"
                android:layout_height="25dp"
                android:layout_marginLeft="18dp"
                android:layout_marginTop="27dp"/>

        </LinearLayout>

        <LinearLayout
            android:background="#0e9b04"
            android:layout_width="60dp"
            android:weightSum="1"
            android:id="@+id/panelMute"
            android:layout_height="match_parent"
            android:orientation="horizontal">
            <ImageView
                android:id="@+id/mute"
                android:src="@drawable/mute"
                android:layout_width="25dp"
                android:layout_height="25dp"
                android:layout_marginLeft="18dp"
                android:layout_marginTop="27dp"/>

        </LinearLayout>


    </LinearLayout>
    <!-- Bottom View End-->

    <!-- Surface View Start -->
    <LinearLayout
        android:padding="10dp"
        android:background="#303030"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <ImageView android:layout_width="60dp"
                android:layout_height="60dp"
                android:id="@+id/rv_img_name"
                android:src="@drawable/logo"
                android:padding="3dp"
                />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:text="Small Text"
                android:layout_marginLeft="10dp"
                android:layout_marginTop="9dp"
                android:layout_marginRight="2dp"
                android:id="@+id/rv_title"
                android:textColor="#ffffff"
                android:layout_alignParentTop="true"
                android:layout_toRightOf="@+id/rv_img_name"
                android:layout_toEndOf="@+id/rv_img_name"
                android:maxLines="1"
                />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:text="Small Text"
                android:id="@+id/rv_content"
                android:textColor="#ffffff"
                android:layout_below="@+id/rv_title"
                android:layout_alignLeft="@+id/rv_title"
                android:layout_alignStart="@+id/rv_title"
                android:maxLines="1"
                />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:text=""
                android:id="@+id/txtTime"
                android:textColor="#ffffff"
                android:maxLines="1"
                android:layout_alignTop="@+id/rv_title"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true" />

            <ImageView
                android:layout_width="18dp"
                android:layout_height="18dp"
                android:id="@+id/imgMute"
                android:src="@drawable/mute"
                android:padding="2dp"
                android:layout_marginTop="11dp"
                android:layout_toRightOf="@+id/rv_title"


                 />

            <ImageView
                android:layout_width="18dp"
                android:layout_height="18dp"
                android:id="@+id/imgLock"
                android:src="@drawable/lock"
                android:padding="2dp"
                android:layout_marginTop="11dp"
                android:layout_toRightOf="@+id/imgMute" />


        </RelativeLayout>

    </LinearLayout>
    <!-- Surface View End -->
</com.daimajia.swipe.SwipeLayout>

RecyclerViewAdapter

@Override
public void onBindViewHolder(final SimpleViewHolder viewHolder, final int position) {
    //final int position = Texty.position;
    final tblMsgs name = mDataset.get(position);
    viewHolder.swipeLayout.setShowMode(SwipeLayout.ShowMode.LayDown);
    viewHolder.swipeLayout.addSwipeListener(new SimpleSwipeListener() {
        @Override
        public void onOpen(SwipeLayout layout) {

        }

        @Override
        public void onClose(SwipeLayout layout) {
            viewHolder.btnDel.setTag("trash");
            viewHolder.btnDel.setImageResource(R.drawable.trash);
        }
    });

    //Double click
    viewHolder.swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() {
        @Override
        public void onDoubleClick(SwipeLayout layout, boolean surface) {
            //Toast.makeText(mContext, "Position: " + position, Toast.LENGTH_SHORT).show();
        }
    });

    //Open conversation.
    viewHolder.swipeLayout.getSurfaceView().setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(viewHolder.swipeLayout.getOpenStatus() == SwipeLayout.Status.Open) {
                mItemManger.closeAllItems();
                viewHolder.btnDel.setTag("trash");
                viewHolder.btnDel.setImageResource(R.drawable.trash);
            }
            else{ //Open conversation
                mItemManger.closeAllItems();
                Toast.makeText(mContext, " onClick : " + position, Toast.LENGTH_SHORT).show();
            }

        }
    });

    //Delete
    viewHolder.panelDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if (viewHolder.btnDel.getTag().equals("trash")){
                viewHolder.btnDel.setTag("del");
                viewHolder.btnDel.setImageResource(R.drawable.delete);
                YoYo.with(Techniques.Tada).duration(500).delay(100).playOn(view.findViewById(R.id.trash));
            }
            else  if (viewHolder.btnDel.getTag().equals("del")){
                viewHolder.btnDel.setTag("trash");
                //viewHolder.btnDel.setImageResource(R.drawable.trash);
                ds.deleteChat(viewHolder.textViewPos.getTag().toString());
                mItemManger.removeShownLayouts(viewHolder.swipeLayout);
                mDataset.remove(position);
                notifyItemRemoved(position);
                notifyItemRangeChanged(position, mDataset.size());
                mItemManger.closeAllItems();
            }
        }
    });


    //Mute/Unmute
    viewHolder.panelMute.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(view.getContext(), "Mute unmute pos: " + position, Toast.LENGTH_SHORT).show();
            if (viewHolder.btnMute.getTag().equals("bell")){
                mItemManger.closeAllItems();
                viewHolder.imgMute.setVisibility(View.GONE);
                viewHolder.btnMute.setTag("mute");
                viewHolder.btnMute.setImageResource(R.drawable.mute);
                ds.unMute(name.getrNumber());
            }
            else{

                //Save Sender Settings
                ds.open();
                if(ds.selectCount_tblSender(name.getrNumber()) ==  0){
                    //Log.i(Log_tag, "Saving settings for " + viewHolder.textViewPos.getTag().toString());
                    tblSender sndr = new tblSender();
                    sndr.setNumber(name.getrNumber());
                    ds.create_tblSender(sndr);
                }

                mItemManger.closeAllItems();
                viewHolder.imgMute.setImageResource(R.drawable.mute);
                viewHolder.imgMute.setVisibility(View.VISIBLE);
                //YoYo.with(Techniques.Tada).duration(500).delay(100).playOn(view.findViewById(R.id.imgMute));
                viewHolder.btnMute.setTag("bell");
                //YoYo.with(Techniques.Tada).duration(500).delay(100).playOn(view.findViewById(R.id.mute));
                ds.mute(name.getrNumber());
                viewHolder.btnMute.setImageResource(R.drawable.bell);
            }
            //mItemManger.closeAllItems();
            //Toast.makeText(view.getContext(), "Deleted " + viewHolder.textViewPos.getText().toString() + "!", Toast.LENGTH_SHORT).show();
        }
    });

    //Lock / Unlock
    viewHolder.panelLock.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (viewHolder.btnLock.getTag().equals("locked")){
                //Save Sender Settings
                ds.open();
                if(ds.selectCount_tblSender(viewHolder.textViewPos.getTag().toString()) ==  0){
                    //Log.i(Log_tag, "Saving settings for " + viewHolder.textViewPos.getTag().toString());
                    tblSender sndr = new tblSender();
                    sndr.setNumber(viewHolder.textViewPos.getTag().toString());
                    ds.create_tblSender(sndr);
                }
                mItemManger.closeAllItems();
                viewHolder.imgLock.setImageResource(R.drawable.lock);
                viewHolder.imgLock.setVisibility(View.VISIBLE);
                //YoYo.with(Techniques.Tada).duration(500).delay(100).playOn(view.findViewById(R.id.imgLock));
                viewHolder.btnLock.setTag("unlocked");
                viewHolder.btnLock.setImageResource(R.drawable.unlock);
                //YoYo.with(Techniques.Tada).duration(500).delay(100).playOn(view.findViewById(R.id.lock));
                ds.Lock(viewHolder.textViewPos.getTag().toString());
            }
            else{
                mItemManger.closeAllItems();
                viewHolder.imgLock.setVisibility(View.GONE);
                viewHolder.btnLock.setTag("locked");
                viewHolder.btnLock.setImageResource(R.drawable.lock);
                ds.unLock(viewHolder.textViewPos.getTag().toString());
            }
            //mItemManger.closeAllItems();
        }
    });

    //Archieve
    viewHolder.panelArchieve.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mDataset.remove(position);
            notifyItemRemoved(position);
            notifyItemRangeChanged(position, mDataset.size());
            mItemManger.closeAllItems();

            ds.open();
            if(ds.selectCount_tblSender(viewHolder.textViewPos.getTag().toString()) ==  0){
                //Log.i(Log_tag, "Saving settings for " + viewHolder.textViewPos.getTag().toString());
                tblSender sndr = new tblSender();
                sndr.setNumber(viewHolder.textViewPos.getTag().toString());
                ds.create_tblSender(sndr);
            }
            ds.archieve(viewHolder.textViewPos.getTag().toString());

        }
    });


    viewHolder.textViewPos.setText(name.getSenderName());
    viewHolder.textViewPos.setTag(name.getrNumber());
    viewHolder.textViewData.setText(name.getMessage().trim());
    //Log.i(Log_tag, "Msg: " +  name.getMessage().trim());
    //viewHolder.txtTime.setText(name.getTime());

    //Time Text
    try {
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        Date date = new Date();
        String dateNowStr = formatter.format(date);
        Date dateNow = null;

        dateNow = formatter.parse(dateNowStr);

        String dateSmsStr = name.getTime().substring(0,10);
        Date dateSMS = formatter.parse(dateSmsStr);
        if (dateSMS.compareTo(dateNow)<0)
        {
            viewHolder.txtTime.setText(dateSmsStr.substring(0,10)); // + " " + name.getTime().substring(11,name.getTime().length()));
        }
        else {
            viewHolder.txtTime.setText(name.getTime().substring(11,name.getTime().length()));
        }
    } catch (ParseException e) {
        e.printStackTrace();
    }

    //ColorGenerator generator = ColorGenerator.MATERIAL; // or use DEFAULT
    //int colorRandom = generator.getRandomColor(); // generate random color
    //int colorAlpha = generator.getColor(mDataset.get(position).getrName().substring(0,1));//(same key returns the same color)
    // declare the builder object once.
    TextDrawable.IBuilder builder = TextDrawable.builder()
            .beginConfig()
            .withBorder(0)
            .toUpperCase()
            .endConfig()
            .round();

    int greenColorValue = Color.parseColor("#FF457BDF");
    TextDrawable ic1 = builder.build(mDataset.get(position).getrName().substring(0,1), greenColorValue);
    viewHolder.imgName.setImageDrawable(ic1);
    if(ds.select_tblSender(name.getrNumber()).getIsMute() == 1){ //Mute sign
        Log.i(Log_tag, name.getrNumber() + " was muted at position " + position);
        viewHolder.btnMute.setTag("bell");
        viewHolder.btnMute.setImageResource(R.drawable.bell);
        viewHolder.imgMute.setVisibility(View.VISIBLE);
    }
    if(ds.select_tblSender(name.getrNumber()).getIsProtected() == 1){ //Mute sign
        viewHolder.btnLock.setTag("unlocked");
        viewHolder.btnLock.setImageResource(R.drawable.unlock);
        viewHolder.imgLock.setVisibility(View.VISIBLE);
    }
    mItemManger.bindView(viewHolder.itemView, position);
}

主要活動

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    updateBarHandler = new Handler();


    //Fill Inbox
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

    // Layout Managers:
    recyclerView.setLayoutManager(new LinearLayoutManager(this));


    ds = new dataSource(this);
    activity = this;


    mAdapter = new RecyclerViewAdapter(activity, listInboxAll);
    ((RecyclerViewAdapter) mAdapter).setMode(Attributes.Mode.Single);
    recyclerView.setAdapter(mAdapter);
    recyclerView.setOnScrollListener(onScrollListener);


    //All conversations
    GetAllMsgs task = new GetAllMsgs();
    task.execute();
}

GetAllMsgs()

 private class GetAllMsgs extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... urls) {
        try {
            ContentResolver contentResolver = getContentResolver();
            final String[] projection = new String[]{"*"};
            Uri uriSMSURI = Uri.parse("content://mms-sms/conversations/");
            Cursor cur = contentResolver.query(uriSMSURI, projection, null, null, "date DESC");
            int i = 0;
            while (cur.moveToNext()) {
                String address = cur.getString(cur.getColumnIndex("address"));
                final String body = cur.getString(cur.getColumnIndexOrThrow("body"));
                final String date = cur.getString(cur.getColumnIndex("date"));
                final Long timestamp = Long.parseLong(date);
                //Log.i(Log_tag, "Msg: " + body + " from: " + address);
                address = address.trim();
                if(address.toString().startsWith("92"))
                {
                    address = address.toString().replace("92", "0");
                }
                else if(address.toString().startsWith("3")){
                    address = "0" + address;
                }
                else if(address.toString().startsWith("+92"))
                {
                    address = address.toString().replace("+92", "0");
                }
                final String nAdd = address;
                time = DateFormat.is24HourFormat(activity);
                if(time){
                    dateFormat = new SimpleDateFormat("dd/MM/yyyy k:mm");
                }
                else{
                    dateFormat = new SimpleDateFormat("dd/MM/yyyy h:mm a");
                }

                String usr = getContactName(activity, nAdd);
                tblMsgs msg = new tblMsgs();
                msg.setMessage(body);
                msg.setSenderName(usr); //Fuzool hai for now
                msg.setIsSent(1);
                msg.setIsReply(0);
                msg.setIsUploaded(0);
                msg.setIsLocked(0);
                msg.setTime(dateFormat.format(timestamp));
                msg.setrName(usr); //Name from phone book
                msg.setrNumber(nAdd);
                msg.setTimeStamp(timestamp);
                //listInboxAll.add(msg);
                Texty.position = i;
                ((RecyclerViewAdapter) mAdapter).addnewItem(msg);
                i++;
                final int j = i;
                if(i % 5 == 0){
                    updateBarHandler.post(new Runnable() {
                        @Override
                        public void run () {
                            ((RecyclerViewAdapter) mAdapter).Update(j);
                            recyclerView.setAdapter(mAdapter);
                            recyclerView.setLayoutManager(new LinearLayoutManager(activity));

                        }
                    });
                }

                //listInboxAll.add(msg);
                //ds.create(msg);
            }
            return "done";
        }
        catch(Exception ex){
            Log.e(Log_tag, ex.getMessage());
            return "failed";
        }
    }

    @Override
    protected void onPostExecute(String result) {



    }
}

@Gabe Sechan解決了我的問題,最初我不得不更改圖標的可見性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM