我在Android应用程序工作时面临此问题:我有一个recycleview
,每个项目都有一个删除按钮。我知道我可以在适配器中onBindViewHolder
内的每个行项目中添加按钮onclicklistener
,但是我希望它专门用于从主动脉内部而不是适配器使用。这是我的 recycleView 的简短草图:
草图
这是我适配器的代码:
public class EntryAdapter extends RecyclerView.Adapter<EntryAdapter.MyViewHolder> {
private Context context;
private CRUD db;
private List<Entry> entryList;
public class MyViewHolder extends RecyclerView.ViewHolder {
ImageView type;
ImageView person;
TextView amount;
TextView amount_ron;
ImageButton deleteB, editB, payB;
TextView description;
TextView timestamp;
TextView positionTxt, noHolderPositionTxt;
LinearLayout containter;
Typeface SR, SB, SL;
MyViewHolder(View view) {
super(view);
this.SB = Typeface.createFromAsset(context.getAssets(), "fonts/sansation_bold.ttf");
this.SR = Typeface.createFromAsset(context.getAssets(), "fonts/sansation_regular.ttf");
this.SL = Typeface.createFromAsset(context.getAssets(), "fonts/sansation_light.ttf");
containter = view.findViewById(R.id.item_container);
type = view.findViewById(R.id.debt_type);
person = view.findViewById(R.id.debt_person);
amount = view.findViewById(R.id.entry_cost);
amount.setTypeface(SR);
amount_ron = view.findViewById(R.id.entry_cost_ron);
amount_ron.setTypeface(SR);
deleteB = view.findViewById(R.id.delete_button);
editB = view.findViewById(R.id.edit_button);
payB = view.findViewById(R.id.pay_button);
description = view.findViewById(R.id.descriptionTxt);
description.setTypeface(SL);
timestamp = view.findViewById(R.id.timestamp);
timestamp.setTypeface(SR);
positionTxt = view.findViewById(R.id.position);
noHolderPositionTxt = view.findViewById(R.id.positionnotwithholder);
db = new CRUD(context);
}
}
public EntryAdapter(Context context, List<Entry> entryList) {
this.context = context;
this.entryList = entryList;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_entry, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
Entry entry = entryList.get(holder.getAdapterPosition());
holder.positionTxt.setText(String.valueOf(holder.getAdapterPosition()));
holder.noHolderPositionTxt.setText(String.valueOf(position));
switch(entry.getType()){
case "FOOD": holder.type.setImageResource(R.drawable.food);
break;
case "FLOWERS": holder.type.setImageResource(R.drawable.flowers);
break;
case "GROCERIES": holder.type.setImageResource(R.drawable.groceries);
break;
case "HOLIDAY": holder.type.setImageResource(R.drawable.holiday);
break;
case "PHARMACY": holder.type.setImageResource(R.drawable.pharmacy);
break;
case "BILLS": holder.type.setImageResource(R.drawable.bills);
break;
case "CLOTHES": holder.type.setImageResource(R.drawable.clothes);
break;
case "TRANSPORT": holder.type.setImageResource(R.drawable.transport);
break;
case "ITEMS": holder.type.setImageResource(R.drawable.items);
break;
case "OTHERS": holder.type.setImageResource(R.drawable.others);
break;
}
switch (entry.getPerson()){
case "ew": holder.person.setImageResource(R.drawable.crisu_to_radu_small);
break;
case "wr": holder.person.setImageResource(R.drawable.radu_to_crisu_big);
break;
}
switch (entry.getIsPaid()){
case "YES": holder.containter.setAlpha((float) 0.3);
holder.payB.setVisibility(View.GONE);
holder.deleteB.setVisibility(View.GONE);
holder.editB.setVisibility(View.GONE);
break;
case "NO": holder.containter.setAlpha((float) 1);
holder.payB.setVisibility(View.VISIBLE);
holder.deleteB.setVisibility(View.VISIBLE);
holder.editB.setVisibility(View.VISIBLE);
break;
}
holder.amount.setText(entry.getAmount());
holder.description.setText(entry.getDescription());
holder.timestamp.setText(formatDate(entry.getTimestamp()));
// deleteEntry(holder.getAdapterPosition());
}
@Override
public int getItemCount() {
return entryList.size();
}
private void deleteEntry(int position) {
db.deleteEntry(entryList.get(position));
entryList.remove(position);
notifyItemRemoved(position);
notifyDataSetChanged();
notifyItemRangeChanged(position, entryList.size());
}
private String formatDate(String dateStr) {
try {
@SuppressLint("SimpleDateFormat") SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = fmt.parse(dateStr);
@SuppressLint("SimpleDateFormat") SimpleDateFormat fmtOut = new SimpleDateFormat("MMM d, HH:mm");
return fmtOut.format(date);
} catch (ParseException ignored) {}
return "";
}
}
这是我的主要目的:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fonts();
recyclerView = findViewById(R.id.recycler_view);
no_entry_message = findViewById(R.id.no_entry_message);
no_entry_message.setTypeface(SL);
title = findViewById(R.id.finance_title);
title.setTypeface(SB);
subtitle = findViewById(R.id.finance_subtitle);
subtitle.setTypeface(SL);
card_title = findViewById(R.id.total_title);
card_title.setTypeface(SR);
money_amount = findViewById(R.id.total_money);
money_amount.setTypeface(SB);
money_rom = findViewById(R.id.total_ron);
money_rom.setTypeface(SB);
total_calculation = findViewById(R.id.total_button);
total_calculation.setTypeface(SR);
total_container = findViewById(R.id.total_card_container);
db = new CRUD(this);
entryList.addAll(db.getAllEntries());
fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isUpdateDilog = false;
addEntryDialog(null, -1);
}
});
mAdapter = new EntryAdapter(this, entryList);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
emptyList();
}
// private void deleteEntry(int position) {
//
// db.deleteEntry(entryList.get(position));
// entryList.remove(position);
// mAdapter.notifyItemRemoved(position);
// emptyList();
// }
基本上,每次我单击RecyClerview项目中的删除按钮时,我都希望在MainActivity中发生OnClick事件,并使用方法DeleteEntry(位置),以便我可以从本地SQLITE数据库中删除特定项目。
另外,如果我想从适配器中放入onbindviewholder的条件,例如,我该如何更改(例如)从MainActivity那里进行文本视图的颜色?
更新 - 使用H.Sanati的答案
再次感谢您的答案,H.Sanati。这是我更改的所有内容:
创建此接口:
public interface OnClickListener {
void onClick(int position, String button_pressed);
}
整数位置将我的项目位置存储在列表中,字符串将告诉我的3个按钮中的哪个。
然后在我的内部> recyclview适配器:
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_entry, parent, false);
final MyViewHolder holder = new MyViewHolder(itemView);
holder.deleteB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MainActivity)context).onClick(holder.getAdapterPosition(), "DELETE_B");
}
});
holder.editB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MainActivity)context).onClick(holder.getAdapterPosition(), "EDIT_B");
}
});
holder.payB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MainActivity)context).onClick(holder.getAdapterPosition(), "PAY_B");
}
});
return holder;
}
请注意,DELETEB,EDITB和PAYB都是每个列表项目中出现的所有按钮。上面的界面中的字符串告诉其中哪一个被按下。
然后在我的 mainActivity 中:
public class MainActivity extends AppCompatActivity implements OnClickListener {
@Override
public void onClick(int item_position, String which_button_was_pressed) {
switch (which_button_was_pressed)
{
case "DELETE_B":
deleteEntry(item_position);
Toast.makeText(this, "Delete button at position:" + item_position + "was pressed", Toast.LENGTH_SHORT).show();
break;
case "EDIT_B":
Toast.makeText(this, "Edit button at position:" + item_position + "was pressed", Toast.LENGTH_SHORT).show();
break;
case "PAY_B":
Toast.makeText(this, "Pay button at position:" + item_position + "was pressed", Toast.LENGTH_SHORT).show();
break;
}
}
这里有一个烤面包按摩,可以确认正确的按钮已按下,然后遵循,我将为每种情况添加我的方法。另外,我建议您在MainAttivity中的方法内(例如,删除方法,可以查看它的滚珠),您应该添加以@@@标记的以下行,以获得准确的列表大小和位置更新:
private void deleteEntry(int position) {
db.deleteEntry(entryList.get(position));
entryList.remove(position);
@@@ mAdapter.notifyItemRemoved(position);
@@@ mAdapter.notifyDataSetChanged();
@@@ mAdapter.notifyItemRangeChanged(position, entryList.size());
emptyList();
}
希望这会有所帮助。谢谢!
首先,创建一个接口:
public interface OnClickListener {
void onClick();
}
然后在您的活动中实现此接口:
class MainActivity extends AppCompatActivity implements OnClickListener {
@Override
public void onClick() {
//code
}
}
在您的recyclerview中调用它之后,请在OnClick方法中做任何您想做的事情:
((MainActivity)context).onClick();
最好在onCreateViewHolder
中设置侦听器,以便在recyclerview中平滑滚动:
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_entry, parent, false);
MyViewHolder holder = new MyViewHolder(view);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MainActivity)context).onClick();
}
});
return holder;
}