我有一个ListView驻留在一个片段中。列表项包含多个布局,每个布局中都有Textview。 我使用的是一个AlertDialog,它应要求用户编写某些内容,然后当用户单击“是”按钮时,代码将用用户编写的内容更改TextView的值。 因此,当用户单击列表视图中的某个项目时,会出现一个AlertDialog,要求用户编写一些内容,并更改该项目的TextView文本。
在我的测试代码中,我尝试了一个更简单的版本:出现alertdialog,用户只需要单击yes按钮,然后alertdialog在文本视图中放置“ test”。 下面的代码:
final View rootView =inflater.inflate(R.layout.fragment_notes, container, false);
List<ItemListViewModel1> list = listfiller();
ListView testListView = rootView.findViewById(R.id.idListViewNotes);
testListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
LayoutInflater inflater = requireActivity().getLayoutInflater();
final View edittext_View = inflater.inflate(R.layout.edittext_changement_note,null);
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle(nomNote);
builder.setView(edittext_View);
builder.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
((TextView) view.findViewById(R.id.idTextViewNote)).setText("test");
}
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
});
testListView.setAdapter(new ItemListViewAdapter(getContext(),list));
问题在于
((TextView) view.findViewById(R.id.idTextViewNote)).setText("test");
仅当放在setPositiveButton的Onclick之外时才起作用。 当此行位于Onclick内时,Textview保留其先前的测试。
我的问题是如何使它在OnClick中设置文本?
此外,我的listfiller()是填充列表的函数,但不属于问题的一部分。
编辑:根据要求,这是我的ItemListViewAdapter代码:
public class ItemListViewAdapter extends BaseAdapter {
//fields
private Context context;
private List<ItemListViewModel1> listeItems;
private LayoutInflater inflater;
//constructor
public ItemListViewAdapter(Context context, List<ItemListViewModel1> listeItems){
this.context = context;
this.listeItems = listeItems;
this.inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return listeItems.size();
}
@Override
public ItemListViewModel1 getItem(int position) {
return listeItems.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = inflater.inflate(R.layout.layout_note, null);
//Récupère les infos de l'item pour changer le texte des Textview etc
ItemListViewModel1 currentItem = getItem(position);
//On récupère les fameuses infos
String title = currentItem.getTitle();
String subtitle = currentItem.getSubtitle();
String nombre = currentItem.getNombre();
//On crée les éléments pour en changer les valeurs
TextView titleTextView = convertView.findViewById(R.id.idTextViewNomNote);
titleTextView.setText(title);
TextView subtitleTextView = convertView.findViewById(R.id.idTextViewPole);
subtitleTextView.setText(subtitle);
TextView noteTextView = convertView.findViewById(R.id.idTextViewNote);
noteTextView.setText(nombre);
return convertView;
}
}
ItemListViewModel1只是一个包含3个字符串及其get方法的对象
答案 0 :(得分:0)
当您尝试在肯定按钮的onclick侦听器中访问视图对象时,您可能应该会得到编译错误。因为它没有声明为final。让我向您展示如何通过一些补丁使现有代码正常工作,
testListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final TextView tv = view.findViewById(R.id.idTextViewNote);
...
builder.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
tv.setText("test");
}
});
builder.show();
}
});
以上解决方案仅使您现有的代码正常工作,但随着数据大小的增长而不会持久。因此,更好的方法是更改数据集并通知适配器。这是示例代码
testListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final ItemListViewModel1 item = (ItemListViewModel1) adapterView.getItemAtPosition(position);;
final BaseAdapter adapter = (BaseAdapter) adapterView.getAdapter();
...
builder.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
item.setNombre("test");
adapter.notifyDataSetChanged();
}
});
builder.show();
}
});