gpt4 book ai didi

android - 在 RecyclerView 中获取 EditText 的焦点

转载 作者:行者123 更新时间:2023-11-29 19:20:45 25 4
gpt4 key购买 nike

我正在实现一个应用程序,用户可以在其中存储借记卡,稍后他们只需输入同一张卡的 CVV 号码即可使用它。我已将 RecyclerView 用于用户存储的所有项目(借记卡)。一切正常, View 渲染一切正常,我使用 LinearLayoutManager 来显示水平滚动。

现在我面临的问题是每当我尝试输入任何卡片的 CVV 时,只要我点击它, View 就会转移到存储卡片列表的最后一项,所以如果我有三张卡片存储在我的列表中,我尝试为第一个输入 CVV, View 直接转移到第三张卡片,但焦点仍然在第一张卡片 EditText 上。我不知道这是怎么回事。我正在为此共享一些代码部分。

设置适配器和定义水平滚动:-

  recyclerAdapter = new RecyclerStoredCardAdapter(mContext, storedCards);
LinearLayoutManager layoutManager
= new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
storedCardListRecycler.setLayoutManager(layoutManager);
storedCardListRecycler.setVisibility(View.VISIBLE);
storedCardListRecycler.setAdapter(recyclerAdapter);

与此共享屏幕截图,以便清楚。任何帮助将不胜感激。谢谢。

enter image description here

最佳答案

我使用 ListView 而不是 RecyclerView

但是你也可以用 RecyclerView 来做。

这是我用过的类演示。

SettingItemListViewAdapter.java


/**
* Created by vishalchhodwani on 18/10/16.
*/
public class SettingItemListViewAdapter extends BaseAdapter {

private final String TAG = "SettingItemListViewAdapter";

Context context;
List<SettingListViewItem> settingItemList;
OnMyClickListeners onMyClickListeners;

MyDatabaseAdapter myDatabaseAdapter;

public SettingItemListViewAdapter(Context context, List<SettingListViewItem> settingItemList) {
this.context = context;
this.settingItemList = settingItemList;
myDatabaseAdapter = new MyDatabaseAdapter(context);
}

public void setMyClickListener(OnMyClickListeners onMyClickListeners) {

this.onMyClickListeners = onMyClickListeners;
}

@Override
public int getCount() {
return settingItemList.size();
}

@Override
public Object getItem(int position) {
return settingItemList.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

final ViewHolder holder;

if (convertView == null) {
holder = new ViewHolder();

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.setting_listview_item, parent, false);
holder.settingListViewForm = (RelativeLayout) convertView.findViewById(R.id.settingListViewItem_form1);
holder.vrijeTekst = (EditText) convertView.findViewById(R.id.settingListViewItem_ed_virje_row1);
holder.kenteken = (EditText) convertView.findViewById(R.id.settingListViewItem_ed_kenketen_row1);

holder.checkRow = (ImageView) convertView.findViewById(R.id.settingListViewItem_check_row1);
holder.deleteRow = (ImageView) convertView.findViewById(R.id.settingListViewItem_deleteRow);

convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

holder.vrijeTekst.setText(settingItemList.get(position).getItemVrijeTekst());
holder.kenteken.setText(settingItemList.get(position).getItemKenteken());


boolean isSelected = settingItemList.get(position).isItemSelected();
holder.checkRow.setImageResource(isSelected ? R.drawable.checked : R.drawable.uncheked);


holder.vrijeTekst.setTag(position);
holder.vrijeTekst.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(final View v, boolean hasFocus) {
try {
if (!hasFocus) {
if (settingItemList.size() > 0) {
int position = (int) v.getTag();
EditText Caption = (EditText) v;
settingItemList.get(position).setItemVrijeTekst(Caption.getText().toString());
}

} else {
EditText caption = (EditText) v;
caption.setCursorVisible(true);

}
} catch (Exception ex) {
ex.printStackTrace();
}


}
});


holder.kenteken.setTag(position);
holder.kenteken.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(final View v, boolean hasFocus) {

try {
if (!hasFocus) {
if (settingItemList.size() > 0) {
int position = (int) v.getTag();
EditText Caption = (EditText) v;
settingItemList.get(position).setItemKenteken(Caption.getText().toString());
}
} else {
EditText caption = (EditText) v;
caption.setCursorVisible(true);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
});

holder.checkRow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

if (myDatabaseAdapter.isAvailableInTable(settingItemList.get(position).getItemId()))
onMyClickListeners.onSelectButtonClicked(position);
}
});

holder.deleteRow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

onMyClickListeners.onDeleteItemButtonClicked(position);
}
});


if (getCount() == position + 1) {
holder.vrijeTekst.requestFocus();
holder.vrijeTekst.performClick();
}

return convertView;
}

public static class ViewHolder {
RelativeLayout settingListViewForm;
EditText vrijeTekst, kenteken;
ImageView checkRow, deleteRow;
}
}

SettingN_New.java(是一个 fragment )


public class SettingN_New extends Fragment implements OnClickListener, OnMyClickListeners {

private final String TAG = "SettingN_New";

Context context;

private TextView tv_demo;
ToggleButton togglebtn_save;
Button btn_save, btn_add;

ListView settingItemListView;
List<SettingListViewItem> settingItemList;
SettingItemListViewAdapter settingItemListViewAdapter;

MyDatabaseAdapter myDatabaseAdapter;

TinyDB loginpref;

boolean isNewRowAdded = true;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

//This line of code will stay focus on selected edittext in list
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST);

ActionBar bar = getActivity().getActionBar();
bar.show();

View rootView = inflater.inflate(R.layout.setting_new, container, false);

initializeViews(rootView);

setUI();

getListOfItems();

return rootView;
}

private void setUI() {

try {
if (loginpref.getBoolean(ConstantLib.PREF_AUTO_LOGIN)) {
togglebtn_save.setChecked(true);
} else {
togglebtn_save.setChecked(false);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}

private void initializeViews(View rootView) {
context = getActivity();

LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View headerView = inflater.inflate(R.layout.setting_listview_header, null);

btn_save = (Button) headerView.findViewById(R.id.btn_save);
btn_add = (Button) headerView.findViewById(R.id.btn_add);
togglebtn_save = (ToggleButton) headerView.findViewById(R.id.togglebtn_save);
tv_demo = (TextView) headerView.findViewById(R.id.tv_demo);

settingItemList = new ArrayList<>();
settingItemListView = (ListView) rootView.findViewById(R.id.setting_listView);
settingItemListView.setClickable(true);
settingItemListView.refreshDrawableState();
settingItemListView.addHeaderView(headerView);
settingItemListView.setItemsCanFocus(true);
settingItemListViewAdapter = new SettingItemListViewAdapter(context, settingItemList);
settingItemListViewAdapter.setMyClickListener(this);
settingItemListView.setAdapter(settingItemListViewAdapter);


myDatabaseAdapter = new MyDatabaseAdapter(context);
loginpref = new TinyDB(getActivity());

btn_save.setOnClickListener(this);
btn_add.setOnClickListener(this);
tv_demo.setOnClickListener(this);

togglebtn_save.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// TODO Auto-generated method stub

loginpref.putBoolean(ConstantLib.PREF_AUTO_LOGIN, isChecked);
}
});
}


private void getListOfItems() {

settingItemList.clear();
settingItemList.addAll(myDatabaseAdapter.getAllData());

if (settingItemList.size() == 0) {
isNewRowAdded = true;
SettingListViewItem settingListViewItem = new SettingListViewItem();
settingListViewItem.setItemId(settingItemList.size() + "");
settingListViewItem.setItemVrijeTekst("");
settingListViewItem.setItemKenteken("");
settingListViewItem.setItemSelected(false);

settingItemList.add(settingListViewItem);
} else {
isNewRowAdded = false;
}
notifyDataSetChanged();
}

private void hideKeyboard() {
// Check if no view has focus:
View view = getActivity().getCurrentFocus();
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) getActivity()
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_save:

clearFocus();

hideKeyboard();

new Handler().postDelayed(new Runnable() {
@Override
public void run() {

if (isValidationSuccess())
saveAllData();
}
}, 200);
break;
case R.id.btn_add:
addAnotherRow();
break;
case R.id.tv_demo:
clickedOnTvDemo();
break;
}
}

private void clickedOnTvDemo() {

try {
Intent i = new Intent(getActivity(), Setting_exp_activity.class);
startActivity(i);

} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}

private boolean isValidationSuccess() {
Log.e(TAG, "isValidationSuccess() called : settingItemList.size()==" + settingItemList.size());

for (int i = 0; i < settingItemList.size(); i++) {
if (settingItemList.get(i).getItemVrijeTekst().equalsIgnoreCase("") || settingItemList.get(i).getItemKenteken().equalsIgnoreCase("")) {
showToast("Veld mag niet leeg zijn");// showToast("Fields should not be empty!!");
return false;
}
}

return true;
}

private void saveAllData() {
Log.e(TAG, "saveAllData() called");

myDatabaseAdapter.clearTable();

for (int i = 0; i < settingItemList.size(); i++) {
isNewRowAdded = false;
SettingListViewItem settingListViewItem = new SettingListViewItem();
settingListViewItem.setItemId(i + "");
settingListViewItem.setItemVrijeTekst(settingItemList.get(i).getItemVrijeTekst());
settingListViewItem.setItemKenteken(settingItemList.get(i).getItemKenteken());
settingListViewItem.setItemSelected(settingItemList.get(i).isItemSelected());

myDatabaseAdapter.insertDataToTable(settingListViewItem);
}

DialogUtils.showInfoDialog(getActivity(),
"Instellingen opgeslagen");
}

private void addAnotherRow() {
Log.e(TAG, "addAnotherRow() called");
if (settingItemList.size() > 0 && !isNewRowAdded) {
if (!settingItemList.get(settingItemList.size() - 1).getItemVrijeTekst().equalsIgnoreCase("") && !settingItemList.get(settingItemList.size() - 1).getItemKenteken().equalsIgnoreCase("")) {
isNewRowAdded = true;
Log.e(TAG, "addAnotherRow() called check 1");

SettingListViewItem settingListViewItem = new SettingListViewItem();
settingListViewItem.setItemId(settingItemList.size() + "");
settingListViewItem.setItemVrijeTekst("");
settingListViewItem.setItemKenteken("");
settingListViewItem.setItemSelected(false);
settingItemList.add(settingListViewItem);

notifyDataSetChanged();
} else {
Log.e(TAG, "addAnotherRow() called check 2");
showToast("Al toegevoegd");// showToast("Already Added!!");
}
} else {
if (!isNewRowAdded) {
isNewRowAdded = true;
Log.e(TAG, "addAnotherRow() called check 3");
SettingListViewItem settingListViewItem = new SettingListViewItem();
settingListViewItem.setItemId("0");
settingListViewItem.setItemVrijeTekst("");
settingListViewItem.setItemKenteken("");
settingListViewItem.setItemSelected(false);
settingItemList.add(settingListViewItem);

notifyDataSetChanged();
} else {
Log.e(TAG, "addAnotherRow() called check 4");
showToast("Al toegevoegd");// showToast("Already Added!!");
}
}

settingItemListView.setSelection(settingItemList.size());

Log.e(TAG, "addAnotherRow() called check 5");
Log.e(TAG, "after settingItemList.size()==" + settingItemList.size());
}

@Override
public void onDeleteItemButtonClicked(int position) {

Log.e(TAG, "onDeleteItemButtonClicked() position==" + position);

if (myDatabaseAdapter.getAllData().size() > 0)
showAlertForDeleteItem(position);
else
showToast("Er is geen item te verwijderen"); // showToast("No item to Delete");
}

@Override
public void onSelectButtonClicked(int position) {
Log.e(TAG, "onSelectButtonClicked() position==" + position);

for (int i = 0; i < settingItemList.size(); i++) {
Log.e(TAG, "onSelectButtonClicked() called check 3");
settingItemList.get(i).setItemSelected(false);
}

settingItemList.get(position).setItemSelected(true);

notifyDataSetChanged();
}

private void showAlertForDeleteItem(final int position) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
alertDialog.setMessage("Weet je zeker dat je dit item wilt wissen?");//alertDialog.setMessage("Are you sure you want to delete this item?");

// ja==yes
alertDialog.setPositiveButton("Ja", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

myDatabaseAdapter.deleteTableRow(settingItemList.get(position).getItemId() + "");
settingItemList.remove(position);
settingItemListViewAdapter.notifyDataSetChanged();

if (settingItemList.size() == position + 1) {
isNewRowAdded = false;
}

if (settingItemList.size() == 0) {
isNewRowAdded = false;
addAnotherRow();
}
}
});

//Annuleer==cancel
alertDialog.setNegativeButton("Annuleer", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {


}
});

alertDialog.show();
}

private void notifyDataSetChanged() {
settingItemListViewAdapter.notifyDataSetChanged();
}

private void showToast(String message) {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}

public void clearFocus() {
if (getActivity().getWindow().getCurrentFocus() != null) {
getActivity().getWindow().getCurrentFocus().clearFocus();
}
}
}

我正在给你我的整个类(class)。为什么?因为它会让您更加了解我如何将它与 ListView 一起使用。

测试它并告诉我。 :)

注意事项

  • 这行代码非常重要 - getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST);

关于android - 在 RecyclerView 中获取 EditText 的焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42572521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com