2017-05-27 147 views
-1

我试图实现功能,其中如果用户点击一个或多个项目RecyclerView这些项目被选中,如果用户第二次点击相同的项目/项目时,这些项目被取消选择。为了向用户显示用户点击的项目已被选择或取消选择,图像被显示或隐藏。Android - RecyclerView项目选择问题

但是,如果我点击RecyclerView中的其中一个项目,正在选择多个项目。

这是到目前为止我的代码:

my_list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 


    <TextView 
     android:id="@+id/tvTest" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="15dp" 
     android:text="Test" 
     android:textSize="18sp" /> 

    <ImageView 
     android:id="@+id/ivItemIsSelected" 
     android:layout_width="20dp" 
     android:layout_height="20dp" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="10dp" 
     android:layout_marginTop="10dp" 
     android:src="@drawable/done_256" 
     android:visibility="invisible" /> 

</RelativeLayout> 

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.test.www.recyclerviewadaptertest.MainActivity"> 

<android.support.v7.widget.RecyclerView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/rvTest"/> 

</RelativeLayout> 

MainActivity.java

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.DefaultItemAnimator; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 

import java.util.ArrayList; 


public class MainActivity extends AppCompatActivity { 

    private RecyclerView rvTest; 
    private RecyclerViewTestAdapter recyclerViewTestAdapter; 
    private ArrayList<TestModel> testModels; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     testModels = new ArrayList<>(); 

     for(int i = 0; i < 30; i++){ 
      TestModel testModel = new TestModel("Test nr." + (i+1)); 
      testModels.add(testModel); 
     } 

     recyclerViewTestAdapter = new RecyclerViewTestAdapter(testModels); 
     rvTest = (RecyclerView)findViewById(R.id.rvTest); 
     RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(MainActivity.this); 
     rvTest.setLayoutManager(mLayoutManager); 
     rvTest.setItemAnimator(new DefaultItemAnimator()); 
     rvTest.setAdapter(recyclerViewTestAdapter); 
    } 
} 

RecyclerViewTestAdapter的.java

import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.util.List; 

public class RecyclerViewTestAdapter extends RecyclerView.Adapter<RecyclerViewTestAdapter.MyViewHolder> { 

    private List<TestModel> testModels; 

    public class MyViewHolder extends RecyclerView.ViewHolder { 
     public ImageView ivItemIsSelected; 
     public TextView tvTest; 

     public MyViewHolder(View view) { 
      super(view); 
      ivItemIsSelected = (ImageView) view.findViewById(R.id.ivItemIsSelected); 
      tvTest = (TextView) view.findViewById(R.id.tvTest); 

      view.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if(ivItemIsSelected.getVisibility() == View.INVISIBLE){ 
         ivItemIsSelected.setVisibility(View.VISIBLE); 
        }else if(ivItemIsSelected.getVisibility() == View.VISIBLE){ 
         ivItemIsSelected.setVisibility(View.INVISIBLE); 
        } 
       } 
      }); 
     } 
    } 

    public RecyclerViewTestAdapter(List<TestModel> testModels) { 
     this.testModels = testModels; 
    } 

    @Override 
    public RecyclerViewTestAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.my_list_item, parent, false); 

     return new RecyclerViewTestAdapter.MyViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(final RecyclerViewTestAdapter.MyViewHolder holder, int position) { 
     TestModel testModel = testModels.get(position); 
     holder.tvTest.setText(testModel.getTestText()); 
    } 

    @Override 
    public int getItemCount() { 
     return testModels.size(); 
    } 
} 

TestModel.java

public class TestModel { 

    private String testText; 

    public TestModel() { 
    } 

    public TestModel(String testText) { 
     this.testText = testText; 
    } 

    public String getTestText() { 
     return testText; 
    } 

    public void setTestText(String testText) { 
     this.testText = testText; 
    } 
} 
+0

尝试取消选择ViewHolder构造函数中的项目,也许他们正在回收和他们保持他们的选择。 –

+0

@NicolasMaltais谢谢你的回答。我试过了,但它不起作用。 – Nikolaj

回答

1

你不应该保持 “选中” 状态在ViewHolder,因为它得到回收。保持模型中的“选定”状态。修改您的TestModel.java: 公共类TestModel {

private String testText; 
public boolean selected = false; 

public TestModel() { 
} 

public TestModel(String testText) { 
    this.testText = testText; 
} 

public String getTestText() { 
    return testText; 
} 

public void setTestText(String testText) { 
    this.testText = testText; 
} 

}

设置为在onBind模型项目的引用和基于项目的选择标志设置可见性:

public class MyViewHolder extends RecyclerView.ViewHolder { 
      public ImageView ivItemIsSelected; 
      public TextView tvTest; 
      private TestModel testModel; 

      public MyViewHolder(View view) { 
       super(view); 
       ivItemIsSelected = (ImageView) view.findViewById(R.id.ivItemIsSelected); 
       tvTest = (TextView) view.findViewById(R.id.tvTest); 

       view.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         testModel.selected = !testModel.selected; 
         ivItemIsSelected.setVisibility(testModel.selected ? View.VISIBLE : View.INVISIBLE); 

        } 
       }); 
      } 
     } 

     public RecyclerViewTestAdapter(List<TestModel> testModels) { 
      this.testModels = testModels; 
     } 

     @Override 
     public RecyclerViewTestAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View itemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.my_list_item, parent, false); 

      return new RecyclerViewTestAdapter.MyViewHolder(itemView); 
     } 

     @Override 
     public void onBindViewHolder(final RecyclerViewTestAdapter.MyViewHolder holder, int position) { 
      testModel = testModels.get(position); 
      holder.tvTest.setText(testModel.getTestText()); 
      holder.ivItemIsSelected.setVisibility(testModel.selected ? View.VISIBLE : View.INVISIBLE); 
     } 

     @Override 
     public int getItemCount() { 
      return testModels.size(); 
     } 
    } 

有是实现这一目的的其他方法,但重要的是要记住,每次调用BindViewHolder时,必须更新其中的所有内容以反映指定位置处的项目。希望这可以帮助。

+0

感谢它的工作。 – Nikolaj