【发布时间】:2021-09-14 10:11:21
【问题描述】:
这是我试图解释的应用程序行为的视频,以防万一您不理解我对问题的解释。请参阅下面的链接...
https://file.re/2021/09/14/2021-09-1405-16-22/
我正在尝试开发一个具有多个卡片视图布局的 Android 应用,这些布局将显示在一个回收站视图中。我没有太多运气让回收站视图列出我想要的布局。我可以添加第一个布局就好了,然后只要第一个卡片视图布局存在于回收站视图中就可以添加第二个布局。如果它在回收站视图中不存在,我首先尝试通过单击按钮添加第二个卡片视图布局来添加它几次,它将与第一个卡片视图布局一起添加。此外,当尝试从布局中删除卡片视图时,它们没有正确删除。这是我的 java 代码中的内容...
MainActivity.Java
public class MainActivity extends AppCompatActivity {
ArrayList<RecyclerItem> addConverterCard = new ArrayList<>();
private RecyclerView recyclerView;
private RecyclerItemAdapter recyclerItemAdapter;
private RecyclerView.LayoutManager layoutManager;
public TextView ftocConverterLabelBtn, ftokConverterLabelBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recycler_item_view);
ftocConverterLabelBtn = findViewById(R.id.add_f_to_c_converter_label_btn);
ftokConverterLabelBtn = findViewById(R.id.add_f_to_k_converter_label_btn);
ftocConverterLabelBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (clicked) {
addConverterCard.add(new RecyclerItem());
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(MainActivity.this);
recyclerItemAdapter = new RecyclerItemAdapter(addConverterCard);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(recyclerItemAdapter);
recyclerItemAdapter.notifyDataSetChanged();
closeActionButton();
}
}
});
ftokConverterLabelBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (clicked) {
addConverterCard.add(new RecyclerItem());
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(MainActivity.this);
recyclerItemAdapter = new RecyclerItemAdapter(addConverterCard);
recyclerView.setLayoutManager(layoutManager);
recyclerItemAdapter.notifyDataSetChanged();
closeActionButton();
}
}
});
适配器.Java
public static class RecyclerItemAdapter extends RecyclerView.Adapter<RecyclerItemAdapter.RecyclerViewHolder> {
public ArrayList<RecyclerItem> recyclerItemList;
public AdapterView.OnItemClickListener recyclerItemListener;
public List<String> converterType;
public interface OnItemClickListener {
void onItemClick (int position);
}
public void setOnItemClickListener(OnItemClickListener listener) {
recyclerItemListener = (AdapterView.OnItemClickListener) listener;
}
public static class RecyclerViewHolder extends RecyclerView.ViewHolder {
EditText inputFahValueET;
TextView convertResult;
ImageView tempIconAndConvertBtn;
ImageView deleteCardBtn;
String shortResult, longResult;
public RecyclerViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
super(itemView);
inputFahValueET = itemView.findViewById(R.id.input_fahrenheit_value_to_convert);
convertResult = itemView.findViewById(R.id.output_result_ftc);
tempIconAndConvertBtn = itemView.findViewById(R.id.temp_icon_convert_btn);
deleteCardBtn = itemView.findViewById(R.id.remove_card);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
listener.onItemClick(position);
}
}
}
});
}
}
public static class RecyclerViewHolder2 extends RecyclerViewHolder {
EditText inputFahValueET;
TextView convertResult;
ImageView tempIconAndConvertBtn;
ImageView deleteCardBtn;
String shortResult, longResult;
public RecyclerViewHolder2(@NonNull View itemView, final OnItemClickListener listener2) {
super(itemView, listener2);
inputFahValueET = itemView.findViewById(R.id.input_fahrenheit_value_to_convert2);
convertResult = itemView.findViewById(R.id.output_result_ftk);
tempIconAndConvertBtn = itemView.findViewById(R.id.temp_icon_convert_btn2);
deleteCardBtn = itemView.findViewById(R.id.remove_card2);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener2 != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
listener2.onItemClick(position);
}
}
}
});
}
}
@Override
public int getItemViewType(int position) {
return position % 2 * 2;
}
public RecyclerItemAdapter(ArrayList<RecyclerItem> rList) {
recyclerItemList = rList;
}
@NonNull
@Override
public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
switch (viewType) {
case 0:
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fahrenheit_to_celsius_converter_layout, parent, false);
RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(v, (OnItemClickListener) recyclerItemListener);
return recyclerViewHolder;
case 2:
View v2 = LayoutInflater.from(parent.getContext()).inflate(R.layout.fahrenheit_to_kelvin_converter_layout, parent, false);
RecyclerViewHolder2 recyclerViewHolder2 = new RecyclerViewHolder2(v2, (OnItemClickListener) recyclerItemListener);
return recyclerViewHolder2;
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) {
switch (holder.getItemViewType()) {
case 0: RecyclerViewHolder viewHolder = (RecyclerViewHolder) holder;
RecyclerItem currentItem = recyclerItemList.get(position);
final String[] result = new String[1];
viewHolder.tempIconAndConvertBtn.setOnClickListener(new View.OnClickListener() {...}
viewHolder.deleteCardBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
removeCard(viewHolder.getLayoutPosition());
}
});
break;
case 2: RecyclerViewHolder2 viewHolder2 = (RecyclerViewHolder2)holder;
RecyclerItem currentItem2 = recyclerItemList.get(position);
final String[] result2 = new String[1];
viewHolder2.tempIconAndConvertBtn.setOnClickListener(new View.OnClickListener() {...}
viewHolder2.deleteCardBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
removeCard(viewHolder2.getLayoutPosition());
}
});
break;
}
}
@Override
public int getItemCount() {
return recyclerItemList.size();
}
public void removeCard(int position) {
recyclerItemList.remove(position);
notifyItemRemoved(position);
}
}
public class RecyclerItem {
public RecyclerItem() {
}
}
感谢您的帮助!
完整的适配器类
public static class RecyclerItemAdapter extends RecyclerView.Adapter<RecyclerItemAdapter.RecyclerViewHolder> {
public ArrayList<RecyclerItem> recyclerItemList;
public AdapterView.OnItemClickListener recyclerItemListener;
public List<String> converterType;
public interface OnItemClickListener {
void onItemClick (int position);
}
public void setOnItemClickListener(OnItemClickListener listener) {
recyclerItemListener = (AdapterView.OnItemClickListener) listener;
}
public static class RecyclerViewHolder extends RecyclerView.ViewHolder {
EditText inputFahValueET;
TextView convertResult;
ImageView tempIconAndConvertBtn;
ImageView deleteCardBtn;
String shortResult, longResult;
public RecyclerViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
super(itemView);
inputFahValueET = itemView.findViewById(R.id.input_fahrenheit_value_to_convert);
convertResult = itemView.findViewById(R.id.output_result_ftc);
tempIconAndConvertBtn = itemView.findViewById(R.id.temp_icon_convert_btn);
deleteCardBtn = itemView.findViewById(R.id.remove_card);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
listener.onItemClick(position);
}
}
}
});
}
}
public static class RecyclerViewHolder2 extends RecyclerViewHolder {
EditText inputFahValueET;
TextView convertResult;
ImageView tempIconAndConvertBtn;
ImageView deleteCardBtn;
String shortResult, longResult;
public RecyclerViewHolder2(@NonNull View itemView, final OnItemClickListener listener2) {
super(itemView, listener2);
inputFahValueET = itemView.findViewById(R.id.input_fahrenheit_value_to_convert2);
convertResult = itemView.findViewById(R.id.output_result_ftk);
tempIconAndConvertBtn = itemView.findViewById(R.id.temp_icon_convert_btn2);
deleteCardBtn = itemView.findViewById(R.id.remove_card2);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener2 != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
listener2.onItemClick(position);
}
}
}
});
}
}
@Override
public int getItemViewType(int position) {
return recyclerItemList.get(position).getType;
}
public RecyclerItemAdapter(ArrayList<RecyclerItem> rList) {
recyclerItemList = rList;
}
@NonNull
@Override
public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
switch (viewType) {
case 0:
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fahrenheit_to_celsius_converter_layout, parent, false);
RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(v, (OnItemClickListener) recyclerItemListener);
return recyclerViewHolder;
case 1:
View v2 = LayoutInflater.from(parent.getContext()).inflate(R.layout.fahrenheit_to_kelvin_converter_layout, parent, false);
RecyclerViewHolder2 recyclerViewHolder2 = new RecyclerViewHolder2(v2, (OnItemClickListener) recyclerItemListener);
return recyclerViewHolder2;
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) {
switch (holder.getItemViewType()) {
case 0: RecyclerViewHolder viewHolder = (RecyclerViewHolder) holder;
RecyclerItem currentItem = recyclerItemList.get(position);
final String[] result = new String[1];
viewHolder.tempIconAndConvertBtn.setOnClickListener(new View.OnClickListener() {
@SuppressLint("SetTextI18n")
@Override
public void onClick(View view) {
String getIputFahValue = viewHolder.inputFahValueET.getText().toString();
NumberFormat nf = new DecimalFormat("0.000");
if (!getIputFahValue.isEmpty()) {
double d = Double.parseDouble(getIputFahValue);
double dd = d - 32;
double ddd = dd * 5;
double dddd = ddd / 9;
result[0] = Double.toString(dddd);
viewHolder.convertResult.setText(nf.format(dddd) + "°C");
viewHolder.convertResult.setVisibility(View.VISIBLE);
viewHolder.shortResult = nf.format(dddd) + "°C";
viewHolder.longResult = getIputFahValue + "°F is " + nf.format(dddd) + "°C";
if (result[0].contains(".0")) {
result[0] = result[0].replace(".0", "");
viewHolder.convertResult.setText(result[0] + "°C");
viewHolder.convertResult.setVisibility(View.VISIBLE);
viewHolder.shortResult = result[0] + "°C";
viewHolder.longResult = getIputFahValue + "°F is " + result[0] + "°C";
} else if (result[0].contains(".000")) {
result[0] = result[0].replace(".000", "");
viewHolder.convertResult.setText(result[0] + "°C");
viewHolder.convertResult.setVisibility(View.VISIBLE);
viewHolder.shortResult = result[0] + "°C";
viewHolder.longResult = getIputFahValue + "°F is " + result[0] + "°C";
}
} else {
Toast.makeText(view.getContext(), "Fahrenheit Value Field Cannot Be Blank!", Toast.LENGTH_LONG).show();
}
}
});
viewHolder.convertResult.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
AlertDialog.Builder adb = new AlertDialog.Builder(view.getContext());
adb.setIcon(R.drawable.ic_baseline_file_copy_32);
adb.setTitle("Copy Result");
adb.setMessage("You can copy the result to your clipboard if you would like. Choose if you want the short or long result copied to your clipboard.\n\nExample of Short and Long Result:\nShort Result: 32°C\nLong Result: 0°F is 32°C");
adb.setPositiveButton("Short", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
ClipboardManager cbm = (ClipboardManager) view.getContext().getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Copy", holder.shortResult);
cbm.setPrimaryClip(clip);
Toast.makeText(view.getContext(), "Result Copied!", Toast.LENGTH_SHORT).show();
}
});
adb.setNegativeButton("Long", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
ClipboardManager cbm = (ClipboardManager) view.getContext().getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Copy", holder.longResult);
cbm.setPrimaryClip(clip);
Toast.makeText(view.getContext(), "Result Copied!", Toast.LENGTH_SHORT).show();
}
});
adb.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
adb.create();
adb.show();
return false;
}
});
viewHolder.deleteCardBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
removeCard(viewHolder.ge);
}
});
break;
case 2: RecyclerViewHolder2 viewHolder2 = (RecyclerViewHolder2)holder;
RecyclerItem currentItem2 = recyclerItemList.get(position);
final String[] result2 = new String[1];
viewHolder2.tempIconAndConvertBtn.setOnClickListener(new View.OnClickListener() {
@SuppressLint("SetTextI18n")
@Override
public void onClick(View view) {
String getIputFahValue = viewHolder2.inputFahValueET.getText().toString();
NumberFormat nf = new DecimalFormat("0.000");
if (!getIputFahValue.isEmpty()) {
double d = Double.parseDouble(getIputFahValue);
double dd = d - 32;
double ddd = dd * 5;
double dddd = ddd / 9;
double ddddd = dddd + 273.15;
result2[0] = Double.toString(ddddd);
viewHolder2.convertResult.setText(nf.format(ddddd) + "°K");
viewHolder2.convertResult.setVisibility(View.VISIBLE);
viewHolder2.shortResult = nf.format(dddd) + "°K";
viewHolder2.longResult = getIputFahValue + "°F is " + nf.format(dddd) + "°K";
if (result2[0].contains(".0")) {
result2[0] = result2[0].replace(".0", "");
viewHolder2.convertResult.setText(result2[0] + "°K");
viewHolder2.convertResult.setVisibility(View.VISIBLE);
viewHolder2.shortResult = result2[0] + "°K";
viewHolder2.longResult = getIputFahValue + "°F is " + result2[0] + "°K";
} else if (result2[0].contains(".000")) {
result2[0] = result2[0].replace(".000", "");
viewHolder2.convertResult.setText(result2[0] + "°K");
viewHolder2.convertResult.setVisibility(View.VISIBLE);
viewHolder2.shortResult = result2[0] + "°K";
viewHolder2.longResult = getIputFahValue + "°F is " + result2[0] + "°K";
}
} else {
Toast.makeText(view.getContext(), "Fahrenheit Value Field Cannot Be Blank!", Toast.LENGTH_LONG).show();
}
}
});
viewHolder2.convertResult.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
AlertDialog.Builder adb = new AlertDialog.Builder(view.getContext());
adb.setIcon(R.drawable.ic_baseline_file_copy_32);
adb.setTitle("Copy Result");
adb.setMessage("You can copy the result to your clipboard if you would like. Choose if you want the short or long result copied to your clipboard.\n\nExample of Short and Long Result:\nShort Result: 283.15°K\nLong Result: 50°F is 283.15°K");
adb.setPositiveButton("Short", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
ClipboardManager cbm = (ClipboardManager) view.getContext().getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Copy", holder.shortResult);
cbm.setPrimaryClip(clip);
Toast.makeText(view.getContext(), "Result Copied!", Toast.LENGTH_SHORT).show();
}
});
adb.setNegativeButton("Long", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
ClipboardManager cbm = (ClipboardManager) view.getContext().getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Copy", holder.longResult);
cbm.setPrimaryClip(clip);
Toast.makeText(view.getContext(), "Result Copied!", Toast.LENGTH_SHORT).show();
}
});
adb.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
adb.create();
adb.show();
return false;
}
});
viewHolder2.deleteCardBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
removeCard(viewHolder2.getLayoutPosition());
}
});
break;
}
}
@Override
public int getItemCount() {
return recyclerItemList.size();
}
public void removeCard(int position) {
recyclerItemList.remove(position);
notifyItemRemoved(position);
}
}
public static class RecyclerItem {
public int getType;
int type;
public RecyclerItem(int mType) {
this.getType = mType;
}
public int getType() {
return type();
}
private int type() {
return type;
}
}
}
【问题讨论】:
-
查看您的代码 - 您正在创建一个新的适配器,每次单击按钮时都有一个元素。这意味着 RecyclerView 将始终只有一个元素。第一个元素将始终是 RecyclerViewHolder 类型,因为它的位置是 0。
标签: java android android-recyclerview