ile nasıl değiştirebilirim? Textview ve Checkbox ile Recyclerview kullanıyorum. Her öğe gizlenebilir veya gösterilebilir. MainActivity'de, sadece gizli olmayan öğeleri gösteririm. Ama menüde gizli öğeler göstereceğim bir seçenek var. tıklatmak da Öğeleri gizledim ama gri renk ile. HOw yapabilir miyim? Recyclerview'in tek öğesinin özelliklerine MainActivity'den nasıl ulaşılır? İşte Android: Recyclerview öğesinin öğe özelliklerini MainActivity
benim kodudur:RVAdapter
public class RVAdapter extends RecyclerView.Adapter<RVAdapter.DataHolder> {
static String LOG = "RV_LOG";
ArrayList<DataObject> myData;
MainActivity mainActivity;
public static MyClickListener myClickListener;
public class DataHolder extends RecyclerView.ViewHolder implements View.OnClickListener,
CompoundButton.OnCheckedChangeListener {
TextView text;
CheckBox checkBox;
private int position;
public DataHolder(View itemView) {
super(itemView);
text = (TextView) itemView.findViewById(R.id.text);
checkBox = (CheckBox) itemView.findViewById(R.id.checkbox);
checkBox.setOnCheckedChangeListener(this);
}
public void setPosition(int value) {
this.position = value;
}
@Override
public void onClick(View v) {
myClickListener.onItemClick(position, v);
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mainActivity.onItemClick(position, buttonView, isChecked);
}
}
public void setOnItemClickListener(MyClickListener myClickListener) {
this.myClickListener = myClickListener;
}
public RVAdapter(ArrayList<DataObject> myData, MainActivity mainActivity) {
this.myData = myData;
this.mainActivity=mainActivity;
}
@Override
public DataHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_single_item, parent, false);
return new DataHolder(view);
}
@Override
public void onBindViewHolder(final DataHolder holder, final int position) {
holder.text.setText(myData.get(position).getText());
holder.checkBox.setChecked(myData.get(position).getCheck());
if (myData.get(position).getHidden()) {
holder.text.setTextColor(Color.parseColor("#d6d6c2"));
holder.text.setVisibility(View.GONE);
holder.checkBox.setVisibility(View.GONE);
}
holder.setPosition(position);
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
public void addItem(DataObject object, int index) {
myData.add(index, object);
notifyItemInserted(index);
}
public void deleteItem(int index) {
myData.remove(index);
notifyItemRemoved(index);
}
@Override
public int getItemCount() {
return myData.size();
}
public interface MyClickListener {
public void onItemClick(int position, View v);
}
}
MainActivity:
public class MainActivity extends AppCompatActivity {
private RecyclerView myRecyclerView;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager manager;
private ArrayList<DataObject> data;
String TAG = "MA Tag";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
data = new ArrayList<DataObject>();
boolean hidden = true;
for (int i = 0; i < 10; i++) {
DataObject object = new DataObject("Item No " + (i + 1), false, hidden);
data.add(i, object);
hidden = !hidden;
}
myRecyclerView = (RecyclerView) findViewById(R.id.rv);
myRecyclerView.setHasFixedSize(true);
adapter = new RVAdapter(data, this);
myRecyclerView.setAdapter(adapter);
manager = new LinearLayoutManager(this);
myRecyclerView.setLayoutManager(manager);
}
public void onItemClick(int position, View view, boolean isChecked) {
switch (view.getId()) {
case R.id.text:
Log.d(TAG, "item is clicked");
break;
case R.id.checkbox:
data.get(position).setCheck(isChecked);
Log.d(TAG, position + " is " + data.get(position).getCheck() + ":" + isChecked);
if (isChecked) {
data.get(position).setCheck(true);
} else {
data.get(position).setCheck(false);
Log.d(TAG, position + " is " + data.get(position).getCheck());
}
break;
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.delete:
for(int i = data.size()-1; i >=0; i--){
if(data.get(i).getCheck())
((RVAdapter) myRecyclerView.getAdapter()).deleteItem(data.indexOf(data.get(i)));
}
break;
case R.id.show:
Log.d(TAG, "Show");
for(int i = 0; i <data.size(); i++){
if(data.get(i).getHidden()){
Log.d(TAG, data.get(i).getText());
data.get(i).setHidden(false);
}
}
break;
}
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.layout_menu, menu);
return true;
}
}
GÜNCELLEME:
şimdi benim RVAdapter böylece görünür:
public class RVAdapter extends RecyclerView.Adapter<RVAdapter.DataHolder> {
static String LOG = "RV_LOG";
ArrayList<DataObject> myData;
MainActivity mainActivity;
public class DataHolder extends RecyclerView.ViewHolder implements View.OnClickListener,
CompoundButton.OnCheckedChangeListener, View.OnLongClickListener {
TextView text;
CheckBox checkBox;
private int position;
public DataHolder(View itemView) {
super(itemView);
text = (TextView) itemView.findViewById(R.id.text);
checkBox = (CheckBox) itemView.findViewById(R.id.checkbox);
checkBox.setOnCheckedChangeListener(this);
text.setOnLongClickListener(this);
}
public void setPosition(int value) {
this.position = value;
}
@Override
public void onClick(View v) {
mainActivity.onItemClick(position, v, true);
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mainActivity.onItemClick(position, buttonView, isChecked);
}
@Override
public boolean onLongClick(View v) {
mainActivity.onLongClick(position);
return true;
}
}
public RVAdapter(ArrayList<DataObject> myData, MainActivity mainActivity) {
this.myData = myData;
this.mainActivity=mainActivity;
}
@Override
public DataHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_single_item, parent, false);
return new DataHolder(view);
}
@Override
public void onBindViewHolder(final DataHolder holder, final int position) {
holder.text.setText(myData.get(position).getText());
holder.checkBox.setChecked(myData.get(position).getCheck());
if (myData.get(position).getHidden()) {
holder.text.setVisibility(View.GONE);
holder.checkBox.setVisibility(View.GONE);
}
if(myData.get(position).getWasHidden()){
holder.text.setTextColor(Color.parseColor("#666666"));
}
holder.setPosition(position);
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
public void deleteItem(int index) {
myData.remove(index);
notifyItemRemoved(index);
notifyItemRangeChanged(index, myData.size());
}
public void hideItem(int position){
myData.get(position).setHidden(true);
}
public void showItem(int position){
myData.get(position).setHidden(false);
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return myData.size();
}
}
Etkinliğim, showItem() yöntemini çağırıyorum.
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.delete:
for(int i = data.size()-1; i >=0; i--){
if(data.get(i).getCheck())
((RVAdapter) myRecyclerView.getAdapter()).deleteItem(data.indexOf(data.get(i)));
}
break;
case R.id.show:
for(int i = 0; i< data.size(); i++) {
if(data.get(i).getHidden())
((RVAdapter) myRecyclerView.getAdapter()).showItem(i);
}
adapter.notifyDataSetChanged();
break;
}
return true;
}
Biraz yanlış çalışır: vadede de her ikinci öğe gösterilir (doğru, gizli değil her saniye sebep). Göster'e dokunduğumda, gizli öğeler görünür, ancak ilk iki öğe kaybolur. Tekrar göster üzerine dokunduğumda görünürler. burada sorun nedir?
iyi işe yaradı, ama burada bir sorun vardır: 'public void showHiddenItems() {için (0 = int i; i myData.size (<); i ++) { if (myData.get (i) .getHidden()) { myData.get (i) .setHidden (yanlış); } } } ' ve itemClick işlevinde: 'durumda R.id.show. ((RVAdapter) myRecyclerView.getAdapter()) showHiddenItems(); adapter.notifyDataSetChanged(); kırılması; ' Gizli öğeleri göster üzerine tıklıyorum, ilk iki gizli öğeyi göstermiyor. Tekrar tıklıyorum ve hepsini gösterir. (her ikinci öğe gizlidir) – Astgh
Lütfen adaptör kodunuzu en son kodunuzla güncelleyin. O zaman bu hata ile size yardımcı olacağım. –
Kodunuz doğru görünüyor. Hala bu hatayı aldın mı? –