2016-08-17 5 views
0

私は、ミュートまたはロックボタンを押すと小さなアイコンがRecyclerの表示アイテムに表示されますが、試してみると、スレッドをミュートまたはロックするオプションがあるメッセージングアプリで作業しています特定のメッセージをミュートまたはロックするには、そのアイテムのアイコンを表示しますが、アイコンは10カウントごとに要素にも表示されます。RecyclerビューonBindViewHolderが奇妙なパターンを繰り返しています

たとえば、メッセージを位置1にロックすると、位置12の要素にも同じアイコンが表示されます。アイコンを最初の位置から削除すると、後の位置のアイコンも削除されます。私はアンドロイドの開発に慣れていて、まだ勉強しようとしているので、どんな助けも高く評価されるでしょう。

画像:

enter image description here

リサイクラービュー項目の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); 
} 

MainActivity

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

@Gabe Sechanは私の問題を解決し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) { 



    } 
} 
+2

私はその多くのコードを掘り下げていません。それを最小化する。しかし、チャットがミュートされていない場合は、非表示にすることを忘れていた可能性があります。任意のビューで何かを設定した場合は、リサイクルのために、それ以外の場合はデフォルトに設定する必要があります。 –

+0

@Gabe Sechanあなたは正しかった、ありがとう:) –

+0

@タソスすべてが今うまく動いている、私は値を格納するタグを使用しています。 –

答えて

0

、私は当初、アイコンの表示を変更しなければなりませんでした。

関連する問題